mysql系列之5.mysql备份恢复
2016-08-12 09:49
113 查看
备份数据: mysqldump
#mysqldump -uroot -p123456 test > /test_bak.sql
#egrep -v "#|\*|--|^$" /test_bak.sql
指定对应字符集
#mysqldump -uroot -p123456 --default-character-set=utf8 test > /test_bak.sql
加 -B 参数: 备份多个库 (增加创建数据库和连接数据库的命令)
#mysqldump -uroot -p123456 -B test > /test_bak.sql
#mysqldump -uroot -p123456 -B test test2 > /test_bak.sql
加 --compact 参数: 减少备份文件的输出(忽略drop table, 忽略set names, 忽略add locks, 忽略disable keys), 所以这个参数生产环境不用它!!
#mysqldump -uroot -p123456 --compact -B test > /test_bak.sql
备份单个表: 不能加 -B 参数
#mysqldump -uroot -p123456 test tb2 > /test_bak.sql
备份所有表: -A 参数
#mysqldump -uroot -p123456 -A -B test > /test_bak.sql
只备份数据: -t 参数
#mysqldump -uroot -p123456 -t -B test tb2 > /test_bak.sql
只备份结构: -d 参数
#mysqldump -uroot -p123456 -d -B test > /test_bak.sql
锁表: -x 锁定所有表, -l 只读锁表
innodb事务数据库备份: --single-transaction
#mysqldump -uroot -p123456 -A -B --master-data=2 --events --single-transaction|gzip > /all.sql.gz
myisam数据库库备份:
#mysqldump -uroot -p123456 -A -B --master-data=2 -x --events|gzip > /all.sql.gz
增量备份: 刷新binlog, -F 参数
#mysqldump -uroot -p123456 -F -B test > /test_bak.sql
增量备份: 不刷新binlog
#mysqldump -uroot -p123456 --master-data=1 test > /test_bak.sql
--master-data参数详解
mysqldump导出数据时,当这个参数的值为1的时候,mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是file和position的记录,在slave上导入数据时就会执行这个语句,salve就会根据指定这个文件位置从master端复制binlog。默认情况下这个值是1
当这个值是2的时候,chang master to也是会写到dump文件里面去的,但是这个语句是被注释的状态。
分库备份: .sh脚本
#!/bin/sh
MYUSER=root
MYPASS=123456
MYLOGIN="mysql -u$MYUSER -p$MYPASS"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -B"
MYDUMP2="mysqldump -u$MYUSER -p$MYPASS"
DATABASE="$($MYLOGIN -e "show databases;"|egrep -vi "database|infor|perfor")"
for dbname in $DATABASE
do
MYDIR=/mysqlbak/$dbname
[ ! -d $MYDIR ] && mkdir -p $MYDIR
$MYDUMP $dbname|gzip > $MYDIR/${dbname}_$(date +%F).sql.gz
for tbname in `$MYLOGIN -e "show tables from $dbname;"|sed '1d'`
do
$MYDUMP2 $dbname $tbname|gzip >$MYDIR/${dbname}_${tbname}_$(date +%F).sql.gz
done
done
恢复数据
#mysql -uroot -p123456 -e "use test;drop table te;"
#mysql -uroot -p123456 test < /test_bak.sql
查看mysql连接
两次show之后, 发现还有语句在呆着, 说明有慢查询, 可以用 show full processlist 来查看完整的sql语句, 注意查看 sleep / lock 是否过多
#mysql -uroot -p123456 -e "show processlist;"
查看mysql状态: 加上global表示整个数据库, 否则表示当前会话
#mysql -uroot -p123456 -e "show global status;"
不重启修改mysql参数
mysql> set global key_buffer_size=1024*1024*32;
mysql> show variables like 'key_buffer%';
mysql批量插入测试数据
一、建表语句
use test;
create table student(
Sno int(10) NOT NULL COMMENT '学号',
Sname varchar(16) NOT NULL COMMENT '姓名',
Ssex char(2) NOT NULL COMMENT '性别',
Sage tinyint(2) NOT NULL default '0' COMMENT '学生年龄',
Sdept varchar(16) default NULL COMMENT '学生所在系别',
PRIMARY KEY (Sno)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
二、批量插入数据脚本
#!/bin/bash
MysqlLogin="mysql -uroot -p123456"
i=1
while true
do
${MysqlLogin} -e "insert into test.student values ("$i",'oldboy"$i"','m','21','computer"$i"');"
((i++))
sleep 1;
done
mysqlbinlog(增量恢复)
# vi /etc/my.cnf
log-bin=binlog_file //去掉注释
# /etc/init.d/mysqld restart
mysql> insert into ****** #插入测试数据
cd /usr/local/mysql/data/
mysqlbinlog binlog_file.000001 #查看文件内容
cp binlog_file* /bak/mysql/
mysqlbinlog /bak/mysql/binlog_file.000004 --start-date="2010-09-29 18:00:00" --stop-date="2010-09-29 23:00:00" -r time.sql
mysqlbinlog /bak/mysql/binlog_file.000004 --start-position=370 --stop-position=440 -r pos.sql
mysqlbinlog /bak/mysql/binlog_file.000004 -d test -r test.sql
mysqlbinlog /bak/mysql/binlog_file.000004 -h 192.1681.102
-r 102.sql
mysqlbinlog /bak/mysql/binlog_file.000004 -p 3306 -r 3306.sql
mysqlbinlog /bak/mysql/binlog_file.000004 --server-id=1 -r s1.sql
以上6个条件可以排列组合, 作为恢复数据的条件
binlog的文件内容, 示例:
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#160712 20:00:27 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.32-log created 160712 20:00:27 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
y66FVw8BAAAAZwAAAGsAAAABAAQANS41LjMyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADLroVXEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
# at 107
#160712 20:02:51 server id 1 end_log_pos 351 Query thread_id=1 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1468378971/*!*/;
SET @@session.pseudo_thread_id=1/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
CREATE TABLE `te` (
`id` int(4) NOT NULL AUTO_INCREMENT ,
`a` char(5) NOT NULL,
`b` char(5) NOT NULL,
`c` char(5) NOT NULL,
PRIMARY KEY (`id`),
KEY `index_a_b_c` (`a`(3),`b`,`c`)
)
/*!*/;
# at 351
#160712 20:03:43 server id 1 end_log_pos 419 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1468379023/*!*/;
BEGIN
/*!*/;
# at 419
#160712 20:03:43 server id 1 end_log_pos 524 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1468379023/*!*/;
insert into te values(1,'aaa','bbb','ccc')
/*!*/;
# at 524
#160712 20:03:43 server id 1 end_log_pos 551 Xid = 14
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
#mysqldump -uroot -p123456 test > /test_bak.sql
#egrep -v "#|\*|--|^$" /test_bak.sql
指定对应字符集
#mysqldump -uroot -p123456 --default-character-set=utf8 test > /test_bak.sql
加 -B 参数: 备份多个库 (增加创建数据库和连接数据库的命令)
#mysqldump -uroot -p123456 -B test > /test_bak.sql
#mysqldump -uroot -p123456 -B test test2 > /test_bak.sql
加 --compact 参数: 减少备份文件的输出(忽略drop table, 忽略set names, 忽略add locks, 忽略disable keys), 所以这个参数生产环境不用它!!
#mysqldump -uroot -p123456 --compact -B test > /test_bak.sql
备份单个表: 不能加 -B 参数
#mysqldump -uroot -p123456 test tb2 > /test_bak.sql
备份所有表: -A 参数
#mysqldump -uroot -p123456 -A -B test > /test_bak.sql
只备份数据: -t 参数
#mysqldump -uroot -p123456 -t -B test tb2 > /test_bak.sql
只备份结构: -d 参数
#mysqldump -uroot -p123456 -d -B test > /test_bak.sql
锁表: -x 锁定所有表, -l 只读锁表
innodb事务数据库备份: --single-transaction
#mysqldump -uroot -p123456 -A -B --master-data=2 --events --single-transaction|gzip > /all.sql.gz
myisam数据库库备份:
#mysqldump -uroot -p123456 -A -B --master-data=2 -x --events|gzip > /all.sql.gz
增量备份: 刷新binlog, -F 参数
#mysqldump -uroot -p123456 -F -B test > /test_bak.sql
增量备份: 不刷新binlog
#mysqldump -uroot -p123456 --master-data=1 test > /test_bak.sql
--master-data参数详解
mysqldump导出数据时,当这个参数的值为1的时候,mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是file和position的记录,在slave上导入数据时就会执行这个语句,salve就会根据指定这个文件位置从master端复制binlog。默认情况下这个值是1
当这个值是2的时候,chang master to也是会写到dump文件里面去的,但是这个语句是被注释的状态。
分库备份: .sh脚本
#!/bin/sh
MYUSER=root
MYPASS=123456
MYLOGIN="mysql -u$MYUSER -p$MYPASS"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -B"
MYDUMP2="mysqldump -u$MYUSER -p$MYPASS"
DATABASE="$($MYLOGIN -e "show databases;"|egrep -vi "database|infor|perfor")"
for dbname in $DATABASE
do
MYDIR=/mysqlbak/$dbname
[ ! -d $MYDIR ] && mkdir -p $MYDIR
$MYDUMP $dbname|gzip > $MYDIR/${dbname}_$(date +%F).sql.gz
for tbname in `$MYLOGIN -e "show tables from $dbname;"|sed '1d'`
do
$MYDUMP2 $dbname $tbname|gzip >$MYDIR/${dbname}_${tbname}_$(date +%F).sql.gz
done
done
恢复数据
#mysql -uroot -p123456 -e "use test;drop table te;"
#mysql -uroot -p123456 test < /test_bak.sql
查看mysql连接
两次show之后, 发现还有语句在呆着, 说明有慢查询, 可以用 show full processlist 来查看完整的sql语句, 注意查看 sleep / lock 是否过多
#mysql -uroot -p123456 -e "show processlist;"
查看mysql状态: 加上global表示整个数据库, 否则表示当前会话
#mysql -uroot -p123456 -e "show global status;"
不重启修改mysql参数
mysql> set global key_buffer_size=1024*1024*32;
mysql> show variables like 'key_buffer%';
mysql批量插入测试数据
一、建表语句
use test;
create table student(
Sno int(10) NOT NULL COMMENT '学号',
Sname varchar(16) NOT NULL COMMENT '姓名',
Ssex char(2) NOT NULL COMMENT '性别',
Sage tinyint(2) NOT NULL default '0' COMMENT '学生年龄',
Sdept varchar(16) default NULL COMMENT '学生所在系别',
PRIMARY KEY (Sno)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
二、批量插入数据脚本
#!/bin/bash
MysqlLogin="mysql -uroot -p123456"
i=1
while true
do
${MysqlLogin} -e "insert into test.student values ("$i",'oldboy"$i"','m','21','computer"$i"');"
((i++))
sleep 1;
done
mysqlbinlog(增量恢复)
# vi /etc/my.cnf
log-bin=binlog_file //去掉注释
# /etc/init.d/mysqld restart
mysql> insert into ****** #插入测试数据
cd /usr/local/mysql/data/
mysqlbinlog binlog_file.000001 #查看文件内容
cp binlog_file* /bak/mysql/
mysqlbinlog /bak/mysql/binlog_file.000004 --start-date="2010-09-29 18:00:00" --stop-date="2010-09-29 23:00:00" -r time.sql
mysqlbinlog /bak/mysql/binlog_file.000004 --start-position=370 --stop-position=440 -r pos.sql
mysqlbinlog /bak/mysql/binlog_file.000004 -d test -r test.sql
mysqlbinlog /bak/mysql/binlog_file.000004 -h 192.1681.102
-r 102.sql
mysqlbinlog /bak/mysql/binlog_file.000004 -p 3306 -r 3306.sql
mysqlbinlog /bak/mysql/binlog_file.000004 --server-id=1 -r s1.sql
以上6个条件可以排列组合, 作为恢复数据的条件
binlog的文件内容, 示例:
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#160712 20:00:27 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.32-log created 160712 20:00:27 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
y66FVw8BAAAAZwAAAGsAAAABAAQANS41LjMyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADLroVXEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
# at 107
#160712 20:02:51 server id 1 end_log_pos 351 Query thread_id=1 exec_time=0 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1468378971/*!*/;
SET @@session.pseudo_thread_id=1/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
CREATE TABLE `te` (
`id` int(4) NOT NULL AUTO_INCREMENT ,
`a` char(5) NOT NULL,
`b` char(5) NOT NULL,
`c` char(5) NOT NULL,
PRIMARY KEY (`id`),
KEY `index_a_b_c` (`a`(3),`b`,`c`)
)
/*!*/;
# at 351
#160712 20:03:43 server id 1 end_log_pos 419 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1468379023/*!*/;
BEGIN
/*!*/;
# at 419
#160712 20:03:43 server id 1 end_log_pos 524 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1468379023/*!*/;
insert into te values(1,'aaa','bbb','ccc')
/*!*/;
# at 524
#160712 20:03:43 server id 1 end_log_pos 551 Xid = 14
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
相关文章推荐
- mysql 开发进阶篇系列 42 逻辑备份与恢复
- mysql系列之6--------使用第三方工具-percona来备份mysql和恢复
- mysql 开发进阶篇系列 43 逻辑备份与恢复(基于时间和位置的不完全恢复)
- MySQL 备份和恢复
- MYSQL数据备份/恢复简易方法
- MySQL备份和恢复
- 关于MYSQL InnoDB 表的备份与恢复
- Mysql 备份与恢复
- freebsd mysql 备份 恢复
- MySQL 备份和恢复
- MySQL 备份和恢复
- MySQL 备份和恢复策略笔记(2)
- MySQL备份与恢复
- MySQL 备份和恢复策略笔记(3)
- MySQL 备份和恢复策略笔记(4)
- mysql的备份和恢复
- MySQL 数据库的备份和恢复
- MySQL的备份和恢复
- MySQL 数据库的备份和恢复(2)
- MySQL 备份和恢复策略笔记(1)