线上宕机,为了快速恢复业务,只使用了主库进行了数据恢复,导致主从差异较大,从库无法继续执行同步,需要对从库重新配置。 大致思路是,删除从库数据,然后从主库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的备份方式。 Loading... 线上宕机,为了快速恢复业务,只使用了主库进行了数据恢复,导致主从差异较大,从库无法继续执行同步,需要对从库重新配置。 大致思路是,删除从库数据,然后从主库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的备份方式。 最后修改:2023 年 08 月 02 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏