mariadb数据库基于时间点恢复
模拟ceshi库写入数据
mysql> create database ceshi; Query OK, 1 row affected (0.01 sec) mysql> use ceshi; Database changed mysql> create table t1(id int primary key); Query OK, 0 rows affected (0.01 sec) mysql> insert into t1 select 1; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t1 select 2; Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t1 select 3; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0
mydumper 备份数据
mydumper -u root -p 123456 -h 127.0.0.1 --regex '^(?!(information_schema|performance_schema|sys))' -c -o /root/bak 备份中包含mysql库,我们可以不用恢复 rm -rf /root/bak/mysql*
继续模拟ceshi库写入数据,直到最后将t1表同时
mysql> insert into t1 select 4; Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t1 select 5; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t1 select 6; Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> drop table t1; Query OK, 0 rows affected (0.01 sec)
分析binlog,找到删除时间点,可以看到是08:30:55删除的(时间是UTC时区),我们需要恢复到 08:30:55 之前的位点,也就是 mysql-bin.000001,2158
# bin/mysqlbinlog -vv mysql-bin.000001 ---------------------------------------------------------- #220105 8:30:50 server id 194207 end_log_pos 2127 CRC32 0xab43d17e Write_rows: table id 21 flags: STMT_END_F BINLOG ' OlfVYROf9gIALgAAACkIAAAAABUAAAAAAAEABWNlc2hpAAJ0MQABAwAAFEcsuw== OlfVYRef9gIAJgAAAE8IAAAAABUAAAAAAAEAAf/+BgAAAH7RQ6s= '/*!*/; ### INSERT INTO `ceshi`.`t1` ### SET ### @1=6 /* INT meta=0 nullable=0 is_null=0 */ # Number of rows: 1 # at 2127 #220105 8:30:50 server id 194207 end_log_pos 2158 CRC32 0xeede276c Xid = 164 COMMIT/*!*/; # at 2158 #220105 8:30:55 server id 194207 end_log_pos 2200 CRC32 0xa0098b6d GTID 0-194207-11 ddl /*!100001 SET @@session.gtid_seq_no=11*//*!*/; # at 2200 #220105 8:30:55 server id 194207 end_log_pos 2309 CRC32 0x59844e79 Query thread_id=9 exec_time=0 error_code=0 SET TIMESTAMP=1641371455/*!*/; DROP TABLE `t1` /* generated by server */ /*!*/;
新建一个mariadb实例(过程省略)
1、使用myloader命令将数据恢复到新实例上 myloader -u root -p '' -h 127.0.0.1 -P 3307 -d /root/bak cat metcdata 查看备份位点 Log: mysql-bin.000001,1549 2、增量恢复,change master搭备库方式
change master to master_host='127.0.0.1',master_port=3306,master_user='root',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1549; 本来想为了加快速度,只回放 ceshi 库 t1表 的binlog。算了,mariadb不支持,就这样同步吧。 start slave until MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=2158; 数据都回来了 mysql> select * from t1; +----+ | id | +----+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | +----+ 6 rows in set (0.00 sec)