线上宕机,为了快速恢复业务,只使用了主库进行了数据恢复,导致主从差异较大,从库无法继续执行同步,需要对从库重新配置。

大致思路是,删除从库数据,然后从主库dump全部数据到从库,在备份时给所有表添加只读锁,记录binlog和位置信息,然后用备份的数据还原到从库,并配置从库从之前记录的binlog和postion开始同步。和第一次做主从同步是一样的。

具体操作如下。

mysql>开头的表示需要登入MySQL交互式命令行执行的命令,其他表示SEHLL命令。

1、重置从库Slave配置

mysql> stop slave;
mysql> reset slave all;

这将关闭从库的Slave模式,并且重置Slave的配置信息,以往的同步信息也会被重置,需要在恢复数据后重新设定。

2、锁定主库状态并备份

给所有的表加上只读锁定,需要注意隐式提交语句,下面这条命令在MySQL会话退出后,会隐式的执行UNLOCK TABLES,所以你需要重新打开一个会话来进行其他操作。

mysql> flush tables with read lock;

查看锁定状态下的主库的binlog和postion信息:

mysql> show master status\G;

重新打开一个SHELL会话,使用mysqldump进行数据库备份。

mysqldump -uusername -ppassword -R dbname > dbname_dump.sql

-R(--routines):导出存储过程和函数

-E(--events):导出事件

-d(--no-data):不导出任何数据,只导出数据库表结构

-t(--no-create-info):只导出数据,不添加建表语句

-n(--no-create-db):只导出数据,不添加建库语句

-B(--databases):导出数据库列表,导出多个库用到,单个数据库可以省略

--tables:导出表列表,导出指定表事用到,导出所有表可以省略

--triggers:默认导出触发器,如果不需要导出添加--skip-triggers参数

--all-databases:导出所有的数据库

备份完成后并且记录了binlog相关信息后,就可以恢复主数据库的表锁定了:

mysql> unlock tables;

3、恢复从库数据

首先删除从库上需要还原的数据库:

mysql> drop database dbname;

使用之前主库备份的文件进行数据库还原。

mysql -uusername -ppassword dbname < dbname_dump.sql

4、重新设置从库Slave

设置主库Master信息,用于同步的用户需要具有REPLICATION CLIENTREPLICATION SLAVE权限。

mysql> change master to
    -> master_host = "172.16.1.6",
    -> master_port = 3306,
    -> master_user = "username",
    -> master_password = "password",
    -> master_log_file = "mysql-bin.000006",
    -> master_log_pos = 12718781;

打开slave模式。

mysql> start slave;
show slave status;

主要关注这两项,都为yes表示正在同步,也可以通过show master status\Gshow binary logs\G来查看状态。

Slave_IO_Running: yes
Slave_SQL_Running: yes

安全生产,数据无价。完善的备份机制是不可或缺的,有时间再写一篇关于xtrabackup+binlog的备份方式。

最后修改:2023 年 08 月 02 日
如果觉得我的文章对你有用,请随意赞赏