|
数据库版本 | 实例角色 | ip地址 | 端口 |
---|---|---|---|
GreatSQL 8.0.32-26 | master | 192.168.134.199 | 5725 |
GreatSQL 8.0.32-26 | slave | 192.168.134.199 | 5726 |
shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5725.sock -p
greatsql> create user 'repl'@'%' identified by '123';
greatsql> grant replication slave on . to 'repl'@'%';
greatsql> CHANGE MASTER TO
master_host='192.168.134.199',
master_port=5725,
master_user='repl',
master_password='123',
master_auto_position=1,
master_delay = 7200;
greatsql> START SLAVE;
greatsql> SHOW SLAVE STATUS\G
shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5725.sock -p sysbench
greatsql> DROP TABLE sbtest2;
1、为了防止恢复失败,先备份一下从库。
可以使用Xtrabackup/mysqldump
,进行备份从库,这里演示使用 Xtrabackup 备份从库
$ xtrabackup --defaults-file=/data1/greatsql/greatsql5726/my5726.cnf -S /tmp/greatsql5726.sock --backup --slave-info \
--stream=xbstream --target-dir=/backup/full.xb
2、我们找到主库误操作在哪个binlog里面,并需要确认误操作的binlog位置信息。
$ /usr/local/greatsql/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -vvv ./* | grep -rli 'drop'
$ /usr/local/greatsql/bin/mysqlbinlog --no-defaults --base64-output=decode-rows -vvv mysql-bin.000002 |less
3、停止sql_thread线程,设置不延时复制,设置复制停止在误操作binlog位置点。
shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5726.sock -p
greatsql> STOP SLAVE;
greatsql> CHANGE MASTER TO master_delay = 0;
greatsql> START SLAVE io_thread;
greatsql> START SLAVE sql_thread until SQL_BEFORE_GTIDS='2fc5a82c-2ac3-11ee-9f7f-00163e402951:187';
greatsql> SHOW SLAVE STATUS\G
4、等待复制到需要的停止的位置点,sql_thread已经停止
5、查看从库误操作的表,备份出来恢复到主库
greatsql> SHOW TABLES FROM sysbench;
greatsql> SELECT COUNT(*) FROM sysbench.sbtest2;
shell> /usr/local/greatsql/bin/mysqldump -S /tmp/mysql5726.sock --set-gtid-purged=OFF --single-transaction --master-data=2 --max-allowed-packet=32M -q sysbench sbtest2 > sbtest2.sql
6、将sbtest2表备份数据恢复到主库里
shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5725.sock -p -A sysbench
greatsql> SET sql_log_bin = off;
greatsql> source sbtest2.sql;
greatsql> EXIT;
7、从库跳过误操作的gtid,重新设置延时从库,从库继续复制主库
shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5726.sock -p
greatsql> STOP SLAVE;
greatsql> SET gtid_next='2fc5a82c-2ac3-11ee-9f7f-00163e402951:187';
greatsql> BEGIN;COMMIT;
greatsql> SET gtid_next='automatic';
greatsql> CHANGE MASTER TO master_delay = 7200;
greatsql> START SLAVE;
greatsql> SHOW SLAVE STATUS\G
如何避免误删库、删表等误操作,以及如何提高数据库的安全性。
推荐阅读GreatSQL运维管理手册:数据库防范误操作 https://greatsql.cn/docs/8.0.32-26/6-oper-guide/7-avoid-mistakes.html
在线上生产环境中的任何操作都要十分谨慎,可能因为微小疏忽造成无法挽回的巨大损失。
比较常见的线上误操作有几种:
rm -fr /
,把整个系统中的所有文件都给强行删了。可以防范的方法有几个:
sql_safe_updates=1
,尽量避免被全表更新、删除的风险。万一发生误删数据或者误操作大面积更新数据,可以参考下面几种方法进行闪回或挽救:
为了让 GreatSQL 数据库运行更安全,建议遵循以下几点规范:
合作电话:010-64087828
社区邮箱:greatsql@greatdb.com