MySQL mysqldump备份与恢复

1 用户权限

grant select,RELOAD,PROCESS,SUPER, REPLICATION CLIENT ON *.* TO 'bak'@'192.168.%' IDENTIFIED BY "**";

2 mysqldump 备份

2.1利用mysqldump进行全备份

--A 全备
/usr/local/mysql/bin/mysqldump -h 127.0.0.1 -usystem -p'***' -A -R -S /data/mysqldata/3306/mysql.sock \
--single-transaction --default-character-set=utf8 --master-data=2 | gzip > /data/mysqldata/backup/mysqldump/mysqldumpfullbk_20170301.sql.gz

--set global general_log=1
查看mysqldump的原理,flush tables with read lock;短暂的一致性,不支持写,支持读,
snapshot,unlock tables,时间很短
--参数--single-transaction --master-data=2 --default-character-set=utf8
--会先对所有数据库的所有表上锁,读取binlog的信息之后就立即释放锁,这个过程是十分短暂的。然后整个导出过程都在一个事务里.
--慢查询会阻塞flush table,ddl也会

--db.table 针对数据和表

/usr/local/mysql/bin/mysqldump -usystem -p -h127.0.0.1 -P3306 test a \
--single-transaction --master-data=2 --default-character-set=utf8 -q \
| gzip > /data/mysqldata/test_a`date +'%Y%m%d'`.sql.gz


--db.tables 多个表
/usr/local/mysql/bin/mysqldump -usystem -p -h127.0.0.1 -P3306 test a b \
--single-transaction --master-data=2 --default-character-set=utf8 -q \
| gzip > /data/mysqldata/test_a`date +'%Y%m%d%H'`.sql.gz


-- dbs 多个库
/usr/local/mysql/bin/mysqldump -usystem -p -h127.0.0.1 -P3306 -B test bi1 \
--single-transaction --master-data=2 --default-character-set=utf8 -q \
| gzip > /data/mysqldata/test_a`date +'%Y%m%d%H%m'`.sql.gz

2.2 全库恢复

[mysql@mysql-5635 mysqldump]$ gunzip mysqldumpfullbk_20170301.sql.gz
[mysql@mysql-5635 mysqldump]$ ll
total 2272
-rw-rw-r-- 1 mysql mysql 2323927 Mar 1 07:21 mysqldumpfullbk_20170301.sql
--全库恢复
[mysql@mysql-5635 mysqldump]$ mysql -usystem -p*** -h127.0.0.1 -P3306 <mysqldumpfullbk_20170301.sql

2.3 增量恢复

在全备份后进行插入数据,然后删除表等操作

mysql> insert into yhq_t1 values(2,'BBBBBB');
Query OK, 1 row affected (0.04 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> truncate table yhq_t1 ;
Query OK, 0 rows affected (0.05 sec)

在上全库恢复后只有1条数据

mysql> select * from yhq_t1 ;
+------+-------+
| id | name |
+------+-------+
| 1 | AAAAA |
+------+-------+

--增量恢复,利用binlog
--可以类似查询

mysql> system ls /data/mysqldata/3306/binlog/
mysql> show binlog events in 'mysql-bin.000011';

mysql> show master status;

[mysql@mysqlhq scripts]$ mysqlbinlog --help #可以根据帮助文档,查询mysqlbinlog支持的参数,常用的 -d,start-datetime,start-position,stop-datetime等

$ mysqlbinlog -d test -vv mysql-bin.000011 >/tmp/mysqlbin07.txt #找到对应的binlog文件

$ mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000011--stop-datetime="2017-08-31 07:19:33" --start-datetime="2017-08-31 07:17:33"  >/tmp/test0732.sql

$ mysql -usystem  -p*** -h127.0.0.1  -P3306  </tmp/test0732.sql

--如果有多个binlog需要恢复,就类似这样,然后在导入

shell> mysqlbinlog binlog.000001 > /tmp/statements.sql
shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql

Point-in-Time (Incremental) Recovery Using the Binary Log
1 Point-in-Time Recovery Using Event Times
为了指示要恢复的开始和结束时间,指定的mysqlbinlog可以--start - datetime和--stop -日期时间选择,在DATETIME格式。
举个例子,假设在2005年4月20日,正是在上午10点的SQL语句被执行的删除一个大表。
要恢复表和数据,你可以恢复前一天晚上的备份,然后执行以下命令
shell> mysqlbinlog --stop-datetime="2005-04-20 9:59:59" \
/var/log/mysql/bin.123456 | mysql -u root -p
这个命令恢复所有的数据直到--stop-datetime指定的时间
如果没有检测已输入直到小时后,错误的SQL语句,你可能还需要恢复之后发生的活动。
shell> mysqlbinlog --start-datetime="2005-04-20 10:01:00" \
/var/log/mysql/bin.123456 | mysql -u root -p
要使用点及时恢复的这种方法,您应检查日志,以确保准确的时间到指定的命令。为了不执行它们显示日志文件的内容,请使用以下命令
shell> mysqlbinlog /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
Then open the /tmp/mysql_restore.sql file with a text editor to examine it.

2 Point-in-Time Recovery Using Event Positions
--start-position and --stop-position
shell> mysqlbinlog --start-datetime="2005-04-20 9:55:00" \
--stop-datetime="2005-04-20 10:05:00" \
/var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
用文本编辑器打开该文件,寻找你不要想重复的语句。确定二进制日志的位置停止和恢复恢复,
使他们的注释。位置被标记为log_pos后跟一个数字。恢复以前的备份文件后,使用位置编号来处理二进制日志文件。
shell> mysqlbinlog --stop-position=368312 /var/log/mysql/bin.123456 \
| mysql -u root -p

shell> mysqlbinlog --start-position=368315 /var/log/mysql/bin.123456 \
| mysql -u root -p

drop table用mysqldump恢复
drop table恢复测试
1 create table t_d/insert
2 mysqldump -A
3 insert into t_d/drop
--恢复操作
1 mysqldump中恢复到备份时刻
2 根据binlog位置点,恢复到drop的位置点
--test
([email protected]:3306) [test]> select * from t_d;
+---+
| a |
+---+
| 1 |
| 2 |
| 4 |
| 5 |
mysqldump
insert into t_d values (6),(7),(8);
([email protected]:3306) [test]> select * from t_d;
+---+
| a |
+---+
| 1 |
| 2 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
drop table t_d

mysql mysql 101305262 Oct 31 01:05 allDatabase_20171031.sql.gz
$ gunzip allDatabase_20171031.sql.gz
$ head -50 allDatabase_20171031.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000078', MASTER_LOG_POS=154;

[mysql@mysql1 logical]$ sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `t_d`/!d;q' allDatabase_20171031.sql

ROP TABLE IF EXISTS `t_d`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t_d` (
`a` int(11) NOT NULL,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
[mysql@mysql1 logical]$ grep 'INSERT INTO `t_d`' allDatabase_20171031.sql>t_d_bak20171031.sql
[mysql@mysql1 logical]$ cat t_d_bak20171031.sql
INSERT INTO `t_d` VALUES (1),(2),(4),(5);

([email protected]:3306) [test]> select * from t_d;
+---+
| a |
+---+
| 1 |
| 2 |
| 4 |
| 5 |
+---+

[mysql@mysql1 binlog]$ mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF8 --start-position=154 /data/mysqldata/3306/binlog/mysql-bin.000078 |grep DROP -A10 -B10
# at 1630230
#171031 2:10:32 server id 20170814 end_log_pos 1630261 CRC32 0xdf5c044f Xid = 6032638
COMMIT/*!*/;
# at 1630261
#171031 2:10:31 server id 20170814 end_log_pos 1630326 CRC32 0xbe0887b7 Anonymous_GTID last_committed=4148 sequence_number=4149
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1630326
#171031 2:10:31 server id 20170814 end_log_pos 1630442 CRC32 0x91db776e Query thread_id=635196 exec_time=1 error_code=0
use `test`/*!*/;
SET TIMESTAMP=1509387031/*!*/;
DROP TABLE `t_d` /* generated by server */
/*!*/;
# at 1630442
#171031 2:10:33 server id 20170814 end_log_pos 1630507 CRC32 0x84362a1f Anonymous_GTID last_committed=4149 sequence_number=4150
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1630507
#171031 2:10:33 server id 20170814 end_log_pos 1630581 CRC32 0x9ba1d726 Query thread_id=14 exec_time=0 error_code=0
SET TIMESTAMP=1509387033/*!*/;
BEGIN
/*!*/;
# at 1630581
--删除事件1630442,我们要恢复到这个之前,也就是1630326这个事件
[mysql@mysql1 binlog]$ mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF8 --start-position=154 --stop-position=1630326 \
/data/mysqldata/3306/binlog/mysql-bin.000078 > db_test_t_d20171031.sql

-----
'/*!*/;
### INSERT INTO `test`.`t_d`
### SET
### @1=6 /* INT meta=0 nullable=0 is_null=0 */
### INSERT INTO `test`.`t_d`
### SET
### @1=7 /* INT meta=0 nullable=0 is_null=0 */
### INSERT INTO `test`.`t_d`
### SET
### @1=8 /* INT meta=0 nullable=0 is_null=0 */
# at 1619713
#171031 2:10:03 server id 20170814 end_log_pos 1619744 CRC32 0xc7b1762a Xid = 6032401
COMMIT/*!*/;

3 mysqldump 日志

-----------
show master status;
show variables like 'general_log';
show variables like 'log_output';
show variables like 'general_log_file';
set global general_log=on;
set global log_output='table';
set global log_output='file';
show create table mysql.general_log;
select command_type,argument from mysql.general_log order by event_time desc;
delete from mysql.general_log;
set global general_log=off;
-----------
2017-09-28T22:42:26.099799Z 357112 Query show variables like 'general_log_file'
2017-09-28T22:42:56.854552Z 370024 Connect [email protected] on using TCP/IP
2017-09-28T22:42:56.855764Z 370024 Query /*!40100 SET @@SQL_MODE='' */
2017-09-28T22:42:56.856766Z 370024 Query /*!40103 SET TIME_ZONE='+00:00' */
2017-09-28T22:42:56.857718Z 370024 Query FLUSH /*!40101 LOCAL */ TABLES
2017-09-28T22:42:56.875349Z 370024 Query FLUSH TABLES WITH READ LOCK
2017-09-28T22:42:56.876115Z 370024 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2017-09-28T22:42:56.876737Z 370024 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2017-09-28T22:42:56.877350Z 370024 Query SHOW VARIABLES LIKE 'gtid\_mode'
2017-09-28T22:42:56.883794Z 370024 Query SHOW MASTER STATUS
2017-09-28T22:42:56.884410Z 370024 Query UNLOCK TABLES
FROM INFORMATION_SCHEMA.PARTITIONS
FROM INFORMATION_SCHEMA.FILES
2017-09-28T22:42:56.936366Z 370024 Query SHOW VARIABLES LIKE 'ndbinfo\_version'
2017-09-28T22:42:56.938931Z 370024 Init DB test
2017-09-28T22:42:56.939138Z 370024 Query SHOW CREATE DATABASE IF NOT EXISTS `test`
2017-09-28T22:42:56.939242Z 370024 Query SAVEPOINT sp
2017-09-28T22:42:56.939331Z 370024 Query show tables
2017-09-28T22:42:56.939917Z 370024 Query show table status like 'BatchTemp'
2017-09-28T22:42:56.940558Z 370024 Query SET SQL_QUOTE_SHOW_CREATE=1
2017-09-28T22:42:56.940618Z 370024 Query SET SESSION character_set_results = 'binary'
2017-09-28T22:42:56.940755Z 370024 Query show create table `BatchTemp`
2017-09-28T22:42:56.941053Z 370024 Query SET SESSION character_set_results = 'utf8'
2017-09-28T22:42:56.941321Z 370024 Query show fields from `BatchTemp`
2017-09-28T22:42:56.942625Z 370024 Query show fields from `BatchTemp`
2017-09-28T22:42:56.943093Z 370024 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `BatchTemp`
2017-09-28T22:42:56.948903Z 370024 Query SET SESSION character_set_results = 'binary'
2017-09-28T22:42:56.949070Z 370024 Query use `test`
2017-09-28T22:42:56.949250Z 370024 Query select @@collation_database
2017-09-28T22:42:56.949513Z 370024 Query SHOW TRIGGERS LIKE 'BatchTemp'
2017-09-28T22:42:56.950046Z 370024 Query SET SESSION character_set_results = 'utf8'
2017-09-28T22:42:56.950190Z 370024 Query ROLLBACK TO SAVEPOINT sp

猜你喜欢

转载自www.cnblogs.com/yhq1314/p/9936537.html