假设每天XXX点用xtraceback进行一个全备。
-
1,首先关库 ,创造恢复环境
-
mv mysql mysql9999;
-
mkdir mysql;
-
-
2.恢复全备
-
[root@jonn 2015-10-21_15-44-45]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=ESBecs00 --apply-log /xback/full/2015-10-21_15-44-45/
-
[root@jonn 2015-10-21_15-44-45]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=ESBecs00 --copy-back /xback/full/2015-10-21_15-44-45/
-
3.开库,全备恢复后binlog重置为01了
[root@jonn mysql]# ls
ch ib_logfile0 jonn.com.err mysqlbin.000001 mysql.sock xtrabackup_binlog_pos_innodb zabbix
ibdata1 ib_logfile1 mysql mysqlbin.index test xtrabackup_checkpoints
4进入到mysql99999备份,恢复binlog
mysqlbinlog --start-position=XXXXX mysqlbin.000009|mysql -u root -pESBecs00 ---地点可以通过查看备份日志来查看
$ cat /path/to/backup/xtrabackup_binlog_info
mysql-bin.000003 57
如果使用了gtid,那么记录的就是
[root@HaoDai_App_DB02 2015-12-23_04-00-02]# more xtrabackup_binlog_info
6c8a10ed-ed0b-11e4-91eb-00163ec546ca:1-96083689
然后到binlog去找96083689对应的log pos吧(这个地方我也不知道该选gtid开始前的一个pos还是结束时的pos,那就先试前面的,再试后面的)
#151221 9:24:37 server id 13307 end_log_pos 172914 CRC32 0xb33d7b00 Xid = 203873263
COMMIT/*!*/;
# at 172914
#151221 9:24:37 server id 13307 end_log_pos 172962 CRC32 0xa9599e57 GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '6c8a10ed-ed0b-11e4-91eb-00163ec546ca:96083689'/*!*/;
# at 172962
#151221 9:24:37 server id 13307 end_log_pos 173025 CRC32 0x4a350fa8 Query thread_id=475472829 exec_time=0 error_code=0
SET TIMESTAMP=1450661077/*!*/;
BEGIN
/*!*/;
# at 173025
#151221 9:24:37 server id 13307 end_log_pos 173104 CRC32 0xa0d97a7f Table_map: `interface_hd_com`.`sms_log` mapped to number 193
35
# at 173104
#151221 9:24:37 server id 13307 end_log_pos 173210 CRC32 0xf16074ec Write_rows: table id 19335 flags: STMT_END_F
SET @@SESSION.GTID_NEXT= '6c8a10ed-ed0b-11e4-91eb-00163ec546ca:96083690'/*!*/;
#151221 9:24:37 server id 13308 end_log_pos 173219 CRC32 0xf16074ec Write_rows: table id 19335 flags: STMT_END_F
-
5.恢复其它binlog日志
-
[root@jonn mysql999999]# mysqlbinlog mysqlbin.0000010|mysql -u root -pESBecs00 ---这个应该是恢复xs2表
-
[root@jonn mysql999999]# mysqlbinlog --stop-position=518 mysqlbin.000011|mysql -u root -pESBecs00 ---找到误操作的时间,跳过去,恢复xs4,还有其它插入
[root@jonn mysql999999]# mysqlbinlog --start-position=637 mysqlbin.000011|mysql -u root -pESBecs00
-
mysql> select count(*) from xs; --只有一张学生表
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
[root@jonn xback]# mysqldump -u root -pESBecs00 -l -F --all-databases>all.sql ---全备 完成后binlog为0000018
-
-
恢复前flush logs一下
-
[root@jonn xback]# mysql -uroot -pESBecs00<all.sql<all.sql< all.sql<="" all.sql<all.sql</all.sql<all.sql<>
-
-
此时xs表数据应该为3条
-
mysql> select count(*) from xs;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
-
-
-
恢复binlog18
-
-
[root@jonn mysql]# mysqlbinlog mysqlbin.000018 | mysql -uroot -pESBecs00
ERROR 1050 (42S01) at line 27: Table 'xs2' already exists ---报错,因为创建xs2的语句存在日志中,而你全备恢复时xs2是没删除掉的,只删除掉了xs表,也就是全备份之后创建的表还存在库中,查看试试
-
mysql> show tables;
+--------------+
| Tables_in_ch |
+--------------+
| xs |
| xs2 |
| xs3 |
| xs4 |
+--------------+
4 rows in set (0.00 sec)
---所以比较麻烦,恢复日志0019 00020同样会暴这种错!,解决方法也比较简单,那就是恢复全备前干掉整个库
-
mysql> drop database ch;
Query OK, 4 rows affected (0.04 sec)
mysql> flush logs; ---全备恢复前刷新一下日志
Query OK, 0 rows affected (0.02 sec)
[root@jonn xback]# mysql -uroot -pESBecs00<all.sql
mysql> use ch;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+--------------+
| Tables_in_ch |
+--------------+
| xs |
+--------------+
1 row in set (0.00 sec)
-
此时xs表数据应该为3条
-
mysql> select count(*) from xs;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
</all.sql
-
-
-
再次恢复00018日志
-
[root@jonn mysql]# mysqlbinlog mysqlbin.000018 | mysql -uroot -pESBecs00
mysql> show tables;
+--------------+
| Tables_in_ch |
+--------------+
| xs |
| xs2 |
+--------------+
2 rows in set (0.00 sec)
mysql> select count(*) from xs;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from xs2;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
再恢复00019日志
[root@jonn mysql]# mysqlbinlog mysqlbin.000019 | mysql -uroot -pESBecs00
mysql> show tables;
+--------------+
| Tables_in_ch |
+--------------+
| xs |
| xs2 |
| xs3 |
+--------------+
3 rows in set (0.00 sec)
mysql> select count(*) from xs2;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from xs;
+----------+
| count(*) |
+----------+
| 12 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from xs3;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec
再恢复 00020日志并跳过误删除的地方
[root@jonn mysql]# mysqlbinlog --stop-position=638 mysqlbin.000020 | mysql -uroot -pESBecs00
[root@jonn mysql]# mysqlbinlog --start-position=978 mysqlbin.000020 | mysql -uroot -pESBecs00
mysql> select count(*) from xs;
+----------+
| count(*) |
+----------+
| 12 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from xs2;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from xs3;
+----------+
| count(*) |
+----------+
| 6 |
+----------+
1 row in set (0.00 sec)
mysql> select count(*) from xs4;
+----------+
| count(*) |
+----------+
| 12 |
+----------+
1 row in set (0.00 sec)
恢复成功
[root@node2 mysql22222]# mysqlbinlog --start-position=373859 --stop-position=441471 mysqlbin.000001 |mysql -uroot -pESBecs00