线上宕机,为了快速恢复业务,只使用了主库进行了数据恢复,导致主从差异较大,从库无法继续执行同步,需要对从库重新配置。
大致思路是,删除从库数据,然后从主库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 CLIENT、REPLICATION 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\G
,show binary logs\G
来查看状态。
Slave_IO_Running: yes
Slave_SQL_Running: yes
安全生产,数据无价。完善的备份机制是不可或缺的,有时间再写一篇关于xtrabackup+binlog的备份方式。