hhdb数据库介绍(9-5)

备份恢复

使用mysqldump备份

mysqldump - 数据库备份程序

计算节点支持mysqldump功能,用法同MySQL一样。

使用mysqldump从计算节点导出数据时,要求指定添加如下参数:

--set-gtid-purged=OFF --no-tablespaces --skip-triggers --single-transaction --default-character-set=utf8mb4 --complete-insert --compact --skip-tz-utc [--replace|--insert-ignore] [--hex-blob] [--where=xxx]

使用mysqldump导出数据,再导入计算节点时,要求添加如下参数:

--no-defaults --no-tablespaces --complete-insert --default-character-set=utf8mb4 --hex-blob --master-data=2 --no-create-db --set-gtid-purged=OFF --single-transaction --skip-add-locks --skip-disable-keys --skip-triggers --skip-tz-utc [--replace|--insert-ignore] [--no-create-info|--no-data] [--where=xxx] --databases xxx

注意
default-character-set参数的值请根据实际情况填写,例如utf8或utf8mb4等。

若未使用指定参数,可能会出现时间差的问题,以及对于部分不支持的功能命令会报错。

使用二进制日志(增量)恢复

mysqlbinlog - 处理二进制日志文件的实用程序

计算节点支持mysqlbinlog命令,mysqlbinlog命令能够解析binlog文件用于同步增量数据,从而减少了将单机数据迁移至计算节点时的停机时间。使用mysqlbinlog连接远程实例获取binlog文件并解析出其中的SQL语句,然后交由计算节点执行,从而将某个数据库的增量数据导入到计算节点某个逻辑库下。首先,登入到管理端口(默认端口为3325),执行dbremapping命令添加数据库映射关系,关于dbremapping命令用法,请参考计算节点管理命令文档。

dbremapping @@add@期望被导入的数据库名:逻辑库名

然后使用mysqlbinlog语句执行选中部分的binlog中SQL语句,要求使用如下语法与参数:

mysqlbinlog -R -h主机名 -P端口号 -v --base64-output=decode-rows --skip-gtids --to-last-log --stop-never --database=数据库名 --start-position=binlog起始位置 binlog文件名 | mysql -u用户名 -p密码 -h服务器 -P服务端口 -c --show-warnings=false

注意
--to-last-log可替换为--stop-position,指定binlog终止位置而非执行到最新的binlog位置。此命令需要跟远程连接的实例同版本。

例如希望将192.168.200.77:3306中的物理库db01导入计算节点192.168.210.30中的逻辑库logicdb01:

1.先至192.168.210.30登入到管理端口3325,执行:

dbremapping @@add@db01:logicdb01

2.然后在192.168.210.30服务器上执行如下命令:

mysqlbinlog -R -h 192.168.200.77 -P3306 -v --base64-output=decode-rows --skip-gtids --to-last-log --stop-never --database=db01 --start-position=0 mysql-bin.000009 | mysql -uroot -proot --h192.168.210.30 --P3323 -c -A

mysqldump与mysqlbinlog的实际应用

此小节将展示如何在实际应用场景中,结合mysqldump的完整备份与mysqlbinlog的增量备份,将数据从源端单机数据库中迁移到HHDB Server中。

注意
整个操作过程中,不建议在数据迁移的源端或计算节点执行任何的DDL、参数变更等等非常规的操作动作。由于单线程操作且受网络延迟制约,此方式追数据的执行速度会慢于存储节点复制的执行速度,因此不保证计算节点的执行速度能够满足实时追上的要求,有可能存在数据延迟不断增大的现象,此时需要寻找业务低谷重试,或者另外规划方案。

场景描述:希望将源端192.168.210.45:3309(该实例为有生产数据的普通存储节点)中的物理库db01导入计算节点192.168.210.32中的逻辑库logicdb01,参考步骤如下:

1.使用mysqldump从数据迁移的源端(即192.168.210.45:3309)导出表结构,在192.168.210.45服务器上执行如下命令(必须添加如下参数):

mysqldump --no-defaults -h127.0.0.1 -P3309 -uhotdb_datasource -photdb_datasource **--no-data** --skip-triggers --set-gtid-purged=OFF --no-tablespaces --single-transaction --default-character-set=utf8mb4 --hex-blob --no-create-db --skip-add-locks --skip-disable-keys --skip-tz-utc --databases db01 >db01.sql

2.将表结构的SQL文件上传至计算节点所在服务器,即192.168.210.32后,登录到计算节点上执行如下命令,导入表结构成功:

source /root/db01.sql

3.使用mysqldump从数据迁移的源端(即192.168.210.45:3309)导出表数据,在192.168.210.45服务器上执行如下命令(必须添加如下参数):

mysqldump --no-defaults -h127.0.0.1 -P3309 -uhotdb_datasource -photdb_datasource **--no-create-info** --skip-triggers --set-gtid-purged=OFF --no-tablespaces --single-transaction --default-character-set=utf8mb4 --hex-blob --master-data=2 --no-create-db --skip-add-locks --skip-disable-keys --skip-tz-utc --databases db01 >db01-1.sql

4.打开表数据的导出文件,查看当前binlog位置,如下显示则binlog位置为2410,binlog文件为mysql-bin.000076:

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000076', MASTER_LOG_POS=2410;

5.将表数据的SQL文件上传至计算节点所在服务器,即192.168.210.32后,登录到计算节点上执行如下命令,导入表数据成功:

source /root/db01.sql

特别注意,如果使用了外键,需要额外执行以下命令:

set foreign_key_checks=0
source /root/db01.sql

执行过程中,应密切关注是否出现警告或错误,否则可能会出现数据会不一致的问题。

提示
如果业务数据没有数据乱码问题,可以考虑split切分文件,并行导入计算节点以加快处理速度。

6.使用mysqlbinlog做增量数据同步。若源端数据库名与计算节点的逻辑库名不相同,则需要在管理端口先添加数据库映射关系,例如:

dbremapping @@add@db01:logicdb01

然后到计算节点(192.168.210.32)所在服务器上执行如下命令,binlog开始位置为第四步记录的位置(此例子中为2410,binlog文件为mysql-bin.000076):

mysqlbinlog -R -h192.168.210.45 -P3309 -uhotdb_datasource -photdb_datasource -v --base64-output=decode-rows --skip-gtids --to-last-log --stop-never --database=db01 **--start-position=2410 mysql-bin.000076** | mysql -uroot -proot --h192.168.210.32 --P3323 -c -A

为了加快追数据的速度,建议执行mysqlbinlog命令的服务器就是计算节点所在服务器,这样节省了命令行客户端执行SQL时SQL和ok包通过网络来回的时间开销,可以极大提高计算节点单线程执行SQL的速度。

7.核对数据同步的正确性:此时需要进行必要的短时停服,中断业务系统向数据库的写入操作。通过人工在源端执行一条特殊数据后查看该条数据是否已经同步。等到确认计算节点已经追完最新数据后,停止mysqlbinlog命令,若需要的话,取消数据库名称映射。

提示
可以在源端都执行如下命令后,将执行结果中出现的SQL语句复制后,在源端和计算节点都执行一遍,查看执行结果是否一致来大致地判断数据是否一致;

use xxx # 逻辑库名
set session group_concat_max_len=1048576;
set @mytablename='xxx'; # 表名
set @mydbname=database();
select concat('select sum(crc32(concat(ifnull(',group_concat(column_name separator ','NULL'),ifnull('),','NULL')))) as sum from ',table_name,';') as sqltext from information_schema.columns where table_schema=@mydbname and table_name=@mytablename G

若执行结果一致,则表数据大概率一致。

例如在源端(192.168.200.77)存储节点中执行如下:

mysql> use db01
Database changed
mysql> set session group_concat_max_len=1048576;
Query OK, 0 rows affected (0.00 sec)
mysql> set @mytablename='table02';
Query OK, 0 rows affected (0.00 sec)
mysql> set @mydbname=database();
Query OK, 0 rows affected (0.00 sec)
mysql> select concat('select sum(crc32(concat(ifnull(',group_concat(column_name separator ',\'NULL\'),ifnull('),',\'NULL\')))) as sum from ',table_name,';') as sqltext from information_schema.columns where table_schema=@mydbname and table_name=@mytablename \G
*************************** 1. row ***************************
sqltext: select sum(crc32(concat(ifnull(id,'NULL'),ifnull(name,'NULL')))) as sum from table02;
1 row in set (0.00 sec)
msyql> select sum(crc32(concat(ifnull(id,'NULL'),ifnull(name,'NULL')))) as sum from table02;
+------------+
| sum        |
+------------+
| 1812521567 |
+------------+
1 row in set (0.00 sec)

其结果(1812521567)与在计算节点执行结果一致,则table02表数据大概率一致。

使用mydumper备份/myloader恢复

mydumper备份

计算节点支持mydumper多线程备份工具,前提需要在server.xml中新增参数并执行动态加载:

<property name="skipFTWRLAndUnlockTables">1</property><!--对FTWRL语句的响应方式的开关-->

使用mydumper从计算节点导出数据前,先创建备份文件存放目录,执行命令可参考如下:

mkdir -p /usr/local/mydumper
mydumper -h 192.168.210.130 -P 3323 -u root -p root -G -E -R -t 4 -c -o --hex-blob /usr/local/mydumper

推荐使用v0.13.1-1以上版本,否则无法支持--hex-blob参数,blob类型的表数据可能会错误。

备份完成后,在对应存放目录下可见备份文件格式如下:

更多详细参数请参考mydumper --help

myloader恢复

使用myloader恢复数据,执行命令参考如下:

myloader -u root -p root -P 33236 -h 192.168.210.130 -B hotdb -d /usr/local/mydumper

更多详细参数请参考myloader --help

使用mysqlpump备份

mysqlpump备份

计算节点支持mysqlpump功能,用法同MySQL一样。前提需要在server.xml中新增参数并执行动态加载:

<property name="skipFTWRLAndUnlockTables">1</property><!--对FTWRL语句的响应方式的开关-->

使用mysqlpump从计算节点导出数据时,要求指定添加如下参数:

--set-gtid-purged=OFF --skip-triggers --single-transaction --default-character-set=utf8mb4  --complete-insert --skip-tz-utc [--default-parallelism=xxx] [--replace|--insert-ignore] [--hex-blob] [--add-drop-user] [--users] [--exclude-databases|--exclude-tables] [--include-databases|--include-tables]

注意
1、default-character-set参数的值按实际情况填写,如utf8、utf8mb4等。
2、若未使用指定参数,可能会出现时间差的问题,以及对于部分不支持的功能命令会报错。
3、通过mysqlpump导出的createuser语句,计算节点不支持导入,需手动创建用户并赋权后导入。

posted @   恒辉信达  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示