搭建mysql主从复制和删库数据恢复策略
搭建主从复制
主机:
[mysqld] 下增加
vim /etc/my.cnf
## 设置 server_id,一般设置为 IP
server_id=8
# # 复制过滤:需要备份的数据库,输出 binlog
binlog-do-db=testdb
#复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步)
binlog-ignore-db=mysql
# 开启二进制日志,以备 Slave 作为其它 Slave 的 Master 时使用
log-bin=master-log-1
binlog_cache_size = 1M
# 主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format=mixed
# 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days=7
#slave_skip_errors=1062
# # relay_log 配置中继日志
#relay_log=edu-mysql-relay-bin
#log_slave_updates 表示 slave 将复制事件写进自己的二进制日志
#log_slave_updates=1
# 防止改变数据(除了特殊的线程)
#read_only=1
然后在主机里创建一个用户授予同步权限,专门用来进行复制:
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'sync_user'@'192.168.0.%' IDENTIFIED BY 'root';
然后show master status\G;
mysql> show master status\G;
*************************** 1. row ***************************
File: master-log-1.000002
Position: 584
Binlog_Do_DB: testdb
从机:
## 设置 server_id,一般设置为 IP
server_id=8
# # 复制过滤:需要备份的数据库,输出 binlog
binlog-do-db=testdb
# #复制过滤:不需要备份的数据库,不输出(mysql 库一般不同步)
binlog-ignore-db=mysql
# # 开启二进制日志,以备 Slave 作为其它 Slave 的 Master 时使用
log-bin=master-log-1
binlog_cache_size = 1M
# # 主从复制的格式(mixed,statement,row,默认格式是 statement)
binlog_format=mixed
# # 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
expire_logs_days=7
然后重启, 登录进去后配置主从关系组. master_log_file实时取上面的show master status 的File字段的值, master_log_pos 取Position的值,然后执行下面的命令:
mysql > stop slave;
mysql > change master to master_host='192.168.0.7',master_user='sync_user',master_password='root',master_log_file='master-log-1.000002',master_log_pos=120 ;
mysql > start slave;
最后查看 show slave status\G;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.7
Master_User: sync_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log-1.000002
Read_Master_Log_Pos: 120
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 286
Relay_Master_Log_File: master-log-1.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
其中 这两项都为Yes的话那就没什么问题了
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
直接开始主从同步吧
db快速回滚恢复,防止发生删库跑路.
一旦发生删库或其他危险性操作, 比如update不带条件式的修改(你又没开update保护), 那么跑路肯定不是第一选项的, 你起码得先尝试补救措施啊.
@1:
一小时延迟从库
一小时间隔后重新连上主机把所有的数据全部同步过来,然后立马断开,这个从库会与主库保持1个小时的数据差距. 在搭好的主从同步的从机上执行:
mysql> stop slave; mysql> change master to master_delay = 1800; #1800s后才同步 mysql> start slave;
但这个有个缺点就是: 从库在连上主库进行同步的一小段时间内刚好发生了删库事故或其他update不带条件的灾难,这个时候根本无法恢复. 因此最好开设双份的1小时延迟同步: 即对第一台从机执行一次延时1小时的命令change master to master_delay=3600;
过过半小时后再对另一台从机执行change master to master_delay=3600;
那么现在这两台从机就有半小时的同步间隔时间,即使事故发生在第一台从机连接的时候,仍旧有半小时的补救时间.
@2.另外就是全量备份 + 增量备份(用硬盘定时拷贝了)