这一篇想记录下mysql的主从相关与数据恢复;
首先搭建一个mysql
yum方式:https://juejin.cn/post/6892924515253403655
包安装方式:https://blog.csdn.net/weixin_36146275/article/details/80841366
docker方式(建议):docker安装-》阿里云镜像加速-》拉取mysql并启动
有mysql之后搭建主从就比较简单了,可参考:https://www.jianshu.com/p/ab20e835a73f
SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
一个事务日志同步的完整过程是这样的:
1,在备库 B 上通过 change master 命令,设置主库 A 的 IP、端口、用户名、密码,以及要从哪个位置开始请求 binlog,这个位置包含文件名和日志偏移量。
2,在备库 B 上执行 start slave 命令,这时候备库会启动两个线程,就是图中的 io_thread 和 sql_thread。其中 io_thread 负责与主库建立连接。
3,主库 A 校验完用户名、密码后,开始按照备库 B 传过来的位置,从本地读取 binlog,发给 B。
4,备库 B 拿到 binlog 后,写到本地文件,称为中转日志(relay log)。
5,sql_thread 读取中转日志,解析出日志里的命令,并执行。
binlog数据恢复
binlog的日志格式有三种,statement,row,mixed;其中statement在主备的时候可能照成数据不一致,mixed不利于数据恢复,所以这里数据恢复采用的是row格式
首先:show variables like 'binlog_format'与show variables like 'sync_binlog';确保日志格式是row且事务结束时刷盘;
例子来源于MySQL实战45讲第24章
mysql> CREATE TABLE t (
id int(11) NOT NULL,
a int(11) DEFAULT NULL,
t_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY a (a),
KEY t_modified(t_modified)
) ENGINE=InnoDB;
insert into t values(1,1,'2018-11-13');
insert into t values(2,2,'2018-11-12');
insert into t values(3,3,'2018-11-11');
insert into t values(4,4,'2018-11-10');
insert into t values(5,5,'2018-11-09');
mysql> delete from t /comment/ where a>=4 and t_modified<='2018-11-10' limit 1;
新增表数据且把id为4的数据删除
此时需要把id为4的数据恢复
1,登录mysql查看master节点的binlog日志名字 show master status;
2,查看binlog日志内容 show binlog events in 'edu-mysql-bin.000003';(其中delete操作是Delete_rows)
binlog
我们可以根据mysqlbinlog解析binlog日志的删除操作,可以看到删除的行数据内容;如果只是为了恢复少量语句,根据删除的数据重新insert即可
./mysqlbinlog -vv ../data/edu-mysql-bin.000003 --start-position=2344;
Delete_rows
值得注意的是,如果日志格式是statement,mixed, insert是now()时间的话;直接show binlog events后根据语句进行数据恢复时间将会于原来不一致;now()时间要正常恢复还需要mixed或者binlog格式通过mysqlbinlog进行恢复;
now.png
3,想要恢复ID为4的数据,也可以找事务的开始结束End_log_pos进行恢复
./mysqlbinlog ../data/edu-mysql-bin.000003 --start-position=1855 --stop-position=2067| ./mysql -u root -p;
如果条件允许可以扩大范围,比如从insert id=1到id=5的pos进行恢复;(会把其他ID数据覆盖)
如果是大数据量恢复,比如恢复到昨天某个时间点,一般是先全量恢复再binlog找到时间点的事务范围进行统一恢复
全量复制的话也比较简单使用mysqldump命令,对test_db库继续全量备份
./mysqldump -uroot -p123456 --databases test_db> one_databases.sql
恢复的话登录mysql执行source命令
source
参考文章:https://time.geekbang.org/column/article/76446
https://blog.csdn.net/king_kgh/article/details/74890381
https://blog.csdn.net/timchen525/article/details/77759434
网友评论