概要描述
当出现 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 的启动命令,如下图所示:
注意:选择的部分即为 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 自动重启,如下图所示:
然后执行 /usr/bin/txsql/tools/txsql.sh kill
,如下图所示:
1.3. 以 read-only 模式启动 txsql pod 中的 mysql 服务
在 1.1 步保存的 mysqld 启动命令后面添加一个参数:--rpl_phx_sync_master=OFF
,并在末尾增加一个 & 后台运行 mysqld;然后在 pod 内执行;切记要使用现场保留的启动命令来执行;然后ps -ef|grep mysqld
验证 mysqld 启动状态 ,如下图所示:
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
Executed_Gtid_Set 是当前这个节点已经执行过的 binlog 集合,一般是多条 : start–end 的形式,又被称为流水,必须选择一个包含的binlog 最多(即所有的条目中 end 数值最大的,也就是 server-UUID 为 ff9cf0ec-91df-11ea-9f6a-0050569fff17 )的 mysql 来作为数据备份的对象,因为它包含最新的数据;
然后去数据目录下(1.1 的 mysqld 启动命令参数 –datadir),查看 auto.cnf 确定 master 节点
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