概要描述
当出现 txsql 服务不可用,所有 txsql pod 的状态均为 0/1 running 时,可以使用本案例的方法恢复 txsql 的数据;
详细说明
主要的操作步骤如下:
- 以 read-only 模式启动所有 txsql pod 中的 mysql 服务;
- 根据流水确认主的 txsql server
- 从主的 txsql server 节点的 mysql 中备份数据;
- 删除 txsql 每个节点上的数据目录,强制 txsql 在下次重启时重新初始化服务;
- 将备份的数据导入 txsql;
PS:建议直接对三个 txsql server 都执行全库备份。
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 节点;
2.1. 使用socket方式登录 mysql数据库,任选一个 pod 操作
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;
# ff9cf0ec-91df-11ea-9f6a-0050569fff17: 1-309024
# 那么 ff9cf0ec-91df-11ea-9f6a-0050569fff17 就是主 txsql 的 server_uuid;
2.2. select @@server_uuid; 确认主的 txsql server ,三个 pod 都操作
然后执行 select @@server_uuid;
查看server_uuid,看哪一个能对得上这个最大的 Executed_Gtid_Set 的 uuid ,则备份哪一个。
mysql> select @@server_uuid;
+--------------------------------------+
| @@server_uuid |
+--------------------------------------+
| ff9cf0ec-91df-11ea-9f6a-0050569fff17 |
+--------------------------------------+
3、连接主库执行全库备份(连接第 2 步确认的主txsql server)
PS:建议直接对三个 txsql server 都执行全库备份。
3.1. 然后执行全库备份:
/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/ 目录下
4、删除 txsql 每个节点上的数据目录,强制 txsql 在下次重启时重新初始化服务;
危险动作,请务必小心谨慎操作
停止 txsql pod 内所有服务,删除所有 txsql pod 的数据目录内的全部内容(1.1 的 mysqld 启动命令参数 –datadir,这里一定要看清楚,是 datadir ,要把数据目录保留,目录下的文件全删掉。)
/usr/bin/txsql/tools/txsql.sh kill
# 首先停止pod内所有服务
rm -rf /vdir/hadoop/txsql/*
# 此处切记,如果是 aquila-txsql 或者 guardian-txsql ,data 目录一定要保留。
# 此处切记,如果是 aquila-txsql 或者 guardian-txsql ,data 目录一定要保留。
# 此处切记,如果是 aquila-txsql 或者 guardian-txsql ,data 目录一定要保留。
rm -rf /vdir/guardian/txsql/data/*
# 再次提醒,危险操作,请确保备份的数据已经存储在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