写点什么

通过延时从库 +binlog 复制,恢复误操作数据

作者:GreatSQL
  • 2024-12-04
    福建
  • 本文字数:2762 字

    阅读完需:约 9 分钟

通过延时从库+binlog 复制,恢复误操作数据

一、介绍环境

二、主库配置

shell> /usr/local/greatsql/bin/mysql -S /tmp/mysql5725.sock -pgreatsql> 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 sysbenchgreatsql> 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 -pgreatsql> 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 sysbenchgreatsql> 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

1.常见危险误操作

在线上生产环境中的任何操作都要十分谨慎,可能因为微小疏忽造成无法挽回的巨大损失。


比较常见的线上误操作有几种:


  • 想要删除当前目录下的文件,却不小心执行了 rm -fr /,把整个系统中的所有文件都给强行删了。

  • 误以为是测试环境,想要删除某个数据对象,却把线上生产环境的数据库、表等数据对象给删除了。

  • 误以为是测试环境,想要关闭或重启数据库实例,甚至是关闭或重启主机操作系统。

  • 服务器更换硬盘等热插拔操作,现场工程师搞错信息,把正常的服务器给插拔了。

  • 只想更新或删除部分数据,但由于还没来得及写好 WHERE 条件,不小心按下了回车键,导致全表被更新或删除。


可以防范的方法有几个:


  1. 总是确认每个数据库是否有可靠的备份策略,以及备份文件的有效性。

  2. 配置好一个延迟复制实例,避免在主节点上误操作删除数据后,还可以在从节点上实现快速恢复。

  3. 避免层层跳转的服务器连接方式,每跳转一次,就多了一分误操作的可能性。

  4. 完成操作后立即退出生产业务服务器,减少犯错误的机会。

  5. 经常性确认服务器、数据库和路径标示,并且在每次操作前都要反复确认服务器信息。

  6. 每个服务器主机系统上都要设置唯一的主机名,提高辨识度。

  7. 生产环境和测试环境要物理隔绝开,使之不能相互连接。

  8. 连接生产环境使用专门的操作机或必须先拨 VPN 等,多加一道防护门槛。

  9. 避免同时打开多个终端或操作窗口,这非常容易导致犯错。

  10. 所有重要操作执行前,都先在文档中写清楚,并逐一检查确认无误。

  11. 每个数据库的账号只授予必要的权限,避免权限过高而有了更多破坏的机会。

  12. 不要在生产环境执行删除操作,而是改成 RENAME 操作,先改名,确认无误后再删除,而不是直接删除。

  13. 在数据库中设置 sql_safe_updates=1,尽量避免被全表更新、删除的风险。


万一发生误删数据或者误操作大面积更新数据,可以参考下面几种方法进行闪回或挽救:


  1. [MySQL 数据误删除的总结(opens new window)]:https://mp.weixin.qq.com/s/zMtgC24j7iIJ9xwbNo6AYQ

  2. [MySQL 闪回工具 binlog2sql(opens new window)]:https://mp.weixin.qq.com/s/hEE12-LeCUsC1zKH48hcag

  3. [my2sql 工具之快速入门(opens new window)]:https://mp.weixin.qq.com/s/APgBs7MvJuxJvLwg5i7N_w

  4. [Slave 被误写入数据如何恢复到主库(opens new window)]:https://mp.weixin.qq.com/s/yoUNEehE6eOBQ7uFqSR48A

  5. [延迟从库加上 MASTER_DELAY,主库宕机后如何快速恢复服务(opens new window)]:https://mp.weixin.qq.com/s/qlAhbJq_ZPB5OXDd_zTQNw

  6. [一个延迟库恢复的案例(opens new window)]:https://mp.weixin.qq.com/s/i8cvftodUhkcejswuLSQ3w

  7. [浅谈 MySQL 闪回的实现(opens new window)]:https://mp.weixin.qq.com/s/ZuXS2UcgGS2p2x3p9mTwQg

2.数据安全维护建议

为了让 GreatSQL 数据库运行更安全,建议遵循以下几点规范:


  • 在应用端,所有用户请求及输入数据都要做预处理,不能直接提交到数据库,避免被 SQL 注入。

  • 定期扫描应用端用户请求日志,扫描异常请求并及时处理。

  • 应用服务器端部署防火墙,阻断用户非法请求。

  • 应用程序上线前,都需要进行必要安全扫描,避免常见 SQL 注入等风险。

  • 数据库端定期扫描请求特征,判断是否有符合安全隐患的请求,及时阻断处理。

  • 数据库端启用审计(AUDIT)、SQL 防火墙等组件,及时发现并阻断非法请求。

  • 数据库中存储的敏感数据,务必先进行单向加密,避免被破解、信息泄漏。

  • 生产环境中的数据,导入开发测试环境前,要先进行转码脱敏操作,避免信息泄漏。

  • 做好连接请求检测和监控,发现有异常频繁请求时,及时阻断处理。


发布于: 2024-12-04阅读数: 2
用户头像

GreatSQL

关注

GreatSQL社区 2023-01-31 加入

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。 社区:https://greatsql.cn/ Gitee: https://gitee.com/GreatSQL/GreatSQL

评论

发布
暂无评论
通过延时从库+binlog复制,恢复误操作数据_GreatSQL_InfoQ写作社区