txsql 灾难情况下数据恢复

  其他常见问题
内容纲要

概要描述

当出现 txsql 服务不可用,所有 txsql pod 的状态均为 0/1 running 时,可以使用本案例的方法恢复 txsql 的数据;


详细说明

主要的原理是:
1、以 read-only 模式启动所有 txsql pod 中的 mysql 服务;
2、从流水最大的 txsql 节点的 mysql 中备份数据;
3、删除 txsql 每个节点上的数据目录,强制 txsql 在下次重启时重新初始化服务;
4、将备份的数据导入 txsql;


1、以 read_only 模式启动 txsql 中的 mysql 服务

1.1. 找到 mysqld 的启动命令:

启动 txsql 服务,等待所有的 txsql pod 状态为 0/1 running;然后依次进入所有 txsql 的 pod,命令如下:kubectl exec -it txsql-server-txsql1-xxxxxxxxxx-xxxxx bash
然后使用 ps -ef |grep mysqld 找到 mysqld 的启动命令,如下图所示:

file
file

注意:选择的部分即为 mysqld 的启动命令,需要粘贴到文本中备用

/usr/bin/txsql/sbin/mysqld --defaults-file=/usr/bin/txsql/etc/my.cnf --basedir=/usr/bin/txsql/percona.src --datadir=/vdir/hadoop/txsql/percona.workspace/data --plugin-dir=/usr/bin/txsql/percona.src/lib/mysql/plugin --user=mysql --super-read-only --log-error=/vdir/hadoop/txsql/log/my.err --pid-file=/vdir/hadoop/txsql/percona.workspace/data/percona.pid --socket=/vdir/hadoop/txsql/percona.workspace/tmp/percona.sock --port=13306 --rpl_phx_sync_master=OFF &

1.2. 修改脚本 /usr/bin/txsql/tools/txsql.sh 防止 txsql 的 pod 自动重启,如下图所示:

file

然后执行 /usr/bin/txsql/tools/txsql.sh kill ,如下图所示:

file

1.3. 以 read-only 模式启动 txsql pod 中的 mysql 服务
在 1.1 步保存的 mysqld 启动命令后面添加一个参数:--rpl_phx_sync_master=OFF,并在末尾增加一个 & 后台运行 mysqld;然后在 pod 内执行;切记要使用现场保留的启动命令来执行;然后ps -ef|grep mysqld验证 mysqld 启动状态 ,如下图所示:

file

2、从流水最大的 txsql 节点的 mysql 中备份数据;

2.1. 使用socket方式登录mysql数据库
socket 是上面获取到的 –-socket 参数的信息,-p 后面的密码是 /etc/txsql1/conf/db.properties 中的密码,例如:

mysql --socket=/vdir/hadoop/txsql/percona.workspace/tmp/percona.sock -p'493761713'
mysql> show master status\G; 
# 可以查看节点流水,如下图的 1-309024

file

Executed_Gtid_Set 是当前这个节点已经执行过的 binlog 集合,一般是多条 : start–end 的形式,又被称为流水,必须选择一个包含的binlog 最多(即所有的条目中 end 数值最大的,也就是 server-UUID 为 ff9cf0ec-91df-11ea-9f6a-0050569fff17 )的 mysql 来作为数据备份的对象,因为它包含最新的数据;

然后去数据目录下(1.1 的 mysqld 启动命令参数 –datadir),查看 auto.cnf 确定 master 节点

file

2.2. 然后执行全库备份:

/usr/bin/txsql/percona.src/bin/mysqldump -h 172.22.22.2 -P 13306 -u[user_name] -p[user_password] --set-gtid-purged=off --triggers --routines --events  --all-databases > alldata.sql

确定备份数据是正确的,可以用 head 和 tail 查看备份文件的开头和结尾是是否正确;
将备份数据保存到宿主机路径,比如备份到节点的 /etc/txsql1/conf/ 路径下,然后再 cp 一份到 /root/ 目录下

3、删除 txsql 每个节点上的数据目录,强制 txsql 在下次重启时重新初始化服务;

危险动作,请务必小心谨慎操作
停止 txsql pod 内所有服务,删除所有 txsql pod 的数据目录内的全部内容(1.1 的 mysqld 启动命令参数 –datadir)

/usr/bin/txsql/tools/txsql.sh kill
# 首先停止pod内所有服务
rm -rf /vdir/hadoop/txsql/*
# 再次提醒,危险操作,请确保备份的数据已经存储在pod之外的安全的目录下!

删除之后在 manager web 界面重启 txsql 服务。大约 10 分钟后,txsql 服务被重新部署,此时TxSQL应该处于健康的状态。

4、将备份的数据导入 txsql;

重新部署成功后,进入某个 txsql 的 pod,cd /usr/bin/txsql/tools,将步骤 2.2 备份的数据文件 alldata.sql 上传到 /usr/bin/txsql/tools 目录下;
执行 ./txsql.sh shell 登录 txsql, 然后 source alldata.sql 恢复数据;
然后执行 flush privileges 强制 mysql 刷新用户权限,刷新用户权限后再 source 一次;

cd /usr/bin/txsql/tools
./txsql.sh shell
# 注意要source两次,第一次 source 之后执行 flush privileges; 
# flush privileges 前必须要先 set sql_log_bin=0,否则会引起严重的错误,然后再 source 一次
mysql> use mysql;
mysql> set global super_read_only=off;
mysql> set global read_only=off;
mysql> source alldata.sql
mysql> use mysql;
mysql> set sql_log_bin=0;
mysql> update user set password=password('password') where user = 'inceptoruser';
mysql> GRANT ALL PRIVILEGES ON *.* TO inceptoruser@'%' IDENTIFIED BY 'password';
mysql> flush privileges;
mysql> source alldata.sql

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。