1.概述
逻辑导入导出是基于数据库对象级的操作,也是一种常用的备份操作方式,只能基于备份时刻进行数据转储,也是数据迁移的一种方法,专别是在跨大版本存在兼容性问题的时候。
在进行数据导出时,导出完整一致的数据,不阻塞业务读写。
例如,T1时刻启动导出Vastbase数据库,那么导出数据结果将会是 T1时刻该数据库的数据状态,T1时刻之后对数据库的修改不会被导出。
导入恢复时也只能恢复到导出T1时刻状态的数据。
语法格式:
详细信息使用 --help 查看
2.逻辑导入导出工具
- vb_dump
只能针对一个数据库,能够生成一个数据库的一致性备份 - vb_dumpall
针对整个数据库簇/数据库实例 - copy
纯数据转储,可针对SQL查询结果集进行转储 - vb _restore
自定义转储格式的导入恢复(纯文本格式用vsql导入) - VDS/Dbeaver/..
可视化图形工具的鼠标右键操作,实则也是依托内置的dump命令工具 - 其他工具
vb_ttdump/vb_ttrestore,vb_bulkload
2.1 vb_dump
vb_dump [OPTION.... [DBNAME]
- -h -p -U -d: 连接到指定数据库主机地址\端口\连接用户名\导出的数据库名
- -a,--data-only: 只导出数据
- -s,--schema-only: 只导出对象定义不导出数据
- -E encoding, --encoding=encoding: 指定字符集编码
- -j, --jobs=NUM: 导出并发数,仅支持目录格式并行导出备份
- -f, --fie=FILENAME : 导出文件名
- -F,--format=p|c|d|t: 导出数据格式(text, 自定义转储格式,目录,tar)
- -n,--schema=schema: 导出指定模式
- -t,--table=table:导出指定表
- -Z0~9:使用qzip压缩
- -c:创建对象前先删除,在重新创建之前清理(删除)数据库对象
- -C:创建对象,在转储(dump)文件中包含创建数据库的命令
- --disable-triggers:禁用触发器
- --inserts,应用insert命令模式导出数据,比默认的copy形式慢很多,但可用于将数据导入到其他数据库
- --column-inserts,导出的数据,有显式列名
- --quote-all-identifiers,强制对所有标识符加引号
- --no-publications,不转储发布
- --no-subscriptions,不转储订阅
其中导出数据格式使用场景如下:
注:
纯文本格式可能由于分隔符问题导致恢复异常;
目录归档格式支持并发,对速度有要求的时候可以考虑使用;
2.2 vb_restore
vb_restore是Vastbase提供的针对vb_dump导出数据的导入工具。
通过此工具可导入出vb_dump生成的二进制归档格式(c)、目录格式(d)、tar格式(t)的备份文件。
vb restore的主要功能包含:
- 导入到数据库
如果连接参数中指定了数据库,则数据将被导入到指定的数据库中。
其中,并行导入必须指定连接的密码。
导入时生成列会自动更新,并像普通列一样保存。 - 导入到脚本文件
如果未指定导入数据库,则必须指定list选项。
将会创建包含重建数据库所必须的SQL语句脚本并写入到文件或者标准输出。
等效于直接使用vb_dump导出为纯文本格式。
多用于TOC文件选择性恢复。(相当于中间加了一层过滤)
注意事项:
2.3 vb_dumpall
使用vb_dumpall一次导出Vastbase的所有数据库。
包括默认数据库postgres的数据、自定义数据库的数据以及Vastbase G100所有数据库公共的全局对象。
vb_dumpall在导出Vastbase G100所有数据库时分为两部分:
- vb_dumpal自身对所有数据库公共的全局对象进行导出,包括有关数据库用户和组、表空间以及属性(例如,适用于数据库整体的访问权限)信息。
- vb_dumpall通过调用vb_dump来完成Vastbase中各数据库的SQL脚本文件导出,该脚本文件包
含将数据库恢复为其保存时的状态所需要的全部SQL语句。
说明: 以上两部分导出的结果为纯文本格式的SQL脚本文件,也仅支持纯文本格式导出。
所以只能使用vsql进行导入恢复。
注意事项:
2.4 COPY备份恢复
功能描述:
- 通过 COPY 命令实现在表和文件之间拷贝数据
- COPY TO 把一个表的数据拷贝到一个文件,支持将SELECT查询结果导出到标准文件系统中
- COPY FROM 从一个文件拷贝数据到一个表,把数据附加到表中已经存在的内容里(如CSV)
COPY的注意事项:
尤其是空格、换行符,最好是指定分隔符;如果数据里面的分隔符和默认导出的分隔符存在冲突的时候,导入回去识别会有误,数据对不上等情况。
2.5 vb_ttdump/vb_ttrestore案例
本例中有张1个多G的表,我们使用vb_ttdump导出来。
其中-D指定目录,-f指定文件。
从打印结果中可以看到,首先调用了gs_dump导出DDL,然后对表做一个vacuum freeze(事务冻结),然后刷脏页。确保落盘之后直接用cp命令拷贝表对象对应的物理文件。
可以看到导出文件:表数据文件、导出原信息文件、日志等。
整个过程耗时最多的是做vacuum freeze。如果表没做过Vacuum则耗时会比相对长一些。
对应的恢复工具就是vb_ttrestore:
从打印结果可以看到,恢复首先调用gs_restore恢复表的DDL,再用cp拷贝表的物理文件。
2.6 vb_ttdump
vb_ttdump工具提供了一种通用的快速在线导出数据的方法(物理迁移)其可以最小支持到以表为粒度在线快速迁移,通常与vb_ttrestore工具一起使用。(大表推荐使用)
- 该工具支持以分区为粒度的动态加载(用于在替换物理文件之后重新加载物理文件)和数据迁移操作,并且支持表结构变更后的数据迁移操作。(可以导出单个分区)
- 分区级别的动态动态加载和数据迁移操作仅支持在一级分区中使用,包括hash分区,range分
区与list分区。
使用该工具导出数据时,会对指定导出的对象进行刷脏操作,同时将其置为只读状态,命令执行完成后,会自动将相关对象只读状态解除。
2.7 vb_ttrestore
vb_ttrestore工具提供了一种通用的快速在线导入数据的方法,其可以最小支持到表级别的细粒度在线快速迁移,通常与vb_ttdump工具一起使用 。
- vb_ttrestore工具支持以分区为粒度的动态加载(用于在替换物理文件之后重新加载物理文件)和数据迁移操作,并且支持表结构变更后的数据迁移操作。
- 分区级别的动态动态加载和数据迁移操作仅支持在一级分区中使用,包括hash分区,range分区与list分区。
注意事项:
2.8 vb_bulkload
功能描述:
- vb_bulkload是Vastbase提供的一款批量加载数据工具,使用该工具可以提升加载的效率和性能。
相对于copy命令,最大的优势是速度,它将跳过shared buffer和WAL buffer快速将文件写入到数据库。 - vb_bulkload还提供了出错清理功能: 使用vb_bulkload工具导入出错之后,本次导入的数据都会进行回滚; 即实现在导入报错时清理本次导入数据,防止这些数据被访问,造成查询、执行计划不准确等问题。
注意事项:
- 使用此功能需安装vb_bulkload插件
- 在使用vb bulkload工具导入出错之后,本次导入的数据都要进行回滚,所以需要将本次导入数据清理, 防止这些数据被访问,造成查询、执行计划不准确等问题
- vb bulkload不支持ustore表格式
- 导入的目标数据文件需放入服务端,即数据库所在服务器
3.案例及问题
3.1 磁盘空间有限,导出数据无法完全落盘
磁盘处理:
- 磁盘扩容(挂载新磁盘)
- 磁盘空间整理,清理非必要文件和数据
数据库处理 - 清理或压缩存储数据库运行日志、cbm日志
- 开启wdr的环境可考虑truncate快照表(postgres库snapshot模式下的表)
- 膨胀表对象空间回收
- 导出采用压缩方式减少文件大小,优选二进制或目录格式
- 采用管道符让数据不落盘(通过网络传输的方式进行导出和导入)
3.2 操作窗口时间有限
特别是在跨大版本兼容性问题迁移时,停机窗口时间有限
使用并发导入导出:
- 在系统资源充足的情况加大并发数进行数据导出导入
- 实例迁移可先dumpall导出实例对象定义,再同时分库开并发进行数据导出导入
使用exbase迁移数据: - 部分版本已支持
- exbase功能支持情况如下
3.3 案例问题: 分区表导出主键列会多出tableoid导致导入恢复报错
问题描述:dump导出带主键的分区表主键列会自动带上tableoid导致恢复时报错:
included columns must not intersect with key columns
问题确认: 2.2.5版本的缺陷,2210和2215以上版本已修复
问题处理: 手动去掉tableoid把主键约束加上
MVS工单: HL2025006240
3.4 案例问题:带双引号的关键字导入报错
问题描述:导出带双引号字段创建的表导入恢复报错:
问题确认:该字段为关键字且未在关键字参数vb_exclude_reserved_words排除之外的,导出不会带双引号,导入恢复时报错关键字不能当列名使用
问题处理:
- 业务调整列名,规范不适用保留字当列名
- 使用参数vb_exclude_reserved_words排除关键字,注意排除后的影响范围,例如排除关键字body会导致无法正常创建包体,在不存在使用包和包体的情况下根据必要性可考虑排除
- 列名使用带双引号,导出时可带上参数--quote-all-identifiers,强制对所有标识符加引号(注意加双引号是区分大小写的)
使用普通导出后发现,用关键字过滤会给列名加上双引号。但是用加双引号的形式建的列,导出时是不带双引号的。
第二种方式加了--quote-all-identifiers,不管是不是关键字都会加双引号,这种就会导入成功。要注意也因为加了双引号所以是区分大小写的。
3.5 案例问题:导出导入出现发布端逻辑复制槽消失
场景需求:需要多次导出导入以做数据核验
问题描述:每次导入恢复后都会出现发布端逻辑复制槽消失,需要手动重建订阅
问题确认:由于存在多次数据导入要求覆盖操作,对此在导出时带上-c 参数先删除已有对象再重新导入,因此该参数操作也会将订阅语句的删除创建一同导出
问题存疑:导出的订阅删除重建后为何状态是失效的f?
问题核对:通过导出为sql文本查看具体的创建语句,看到状态enabled确实是false
问题处理:
- 导入恢复后需要手动激活订阅:ALTER SUBSCRIPTION name ENABLE;
- 在导出语句加上参数 --no-publications(不转储发布)--no-subscriptions(不转储订阅)
3.6 案例问题:导出单表时报错找不到表
问题描述:MySQL兼容模式下,vb_dump表报错 No matching tables were found,pg_dump报语法错误在""char""处或附近
问题确认:mysql兼容模式下,bool类型的返回值形式发生了变化,本来是字符形式的t/f,变为了1/0形式,所以vb_dump内部处理在判断函数返回值时走了错误的路径。
这个问题是支持dolphin mysql协议这个feature的代码导致的,该特性有GUC参数可以控制。
问题处理:调整参数配置b_format_pg_bool_out_applications='vb_dump' 可以规避该问题
MVS工单:HL2025008825
3.7 案例问题:参数配置影响数据导入恢复
场景需求:将准生产环境的VB库迁移到测试环境
问题描述:导出操作正常, 导入操作报错
ERROR: syntax error at or near "@" LINE 2: @eventid VARCHAR(16)= ''
问题确认:都是SQL Server兼容模式,准生产环境参数配置是on,测试环境是off
问题处理:调整参数enable_set_variable_mssql _format为on再重新导入
3.8 案例问题:ustore表导入报错
场景需求:将准生产环境的VB库迁移到测试环境
问题描述:导出操作正常导入操作报错 ERROR:Ustoreis disabled,please set enable_ustore=on.
问题确认:根据报错提示问题也是很明显的,准生产环境enable_ustore参数配置是on,测试环境是off
问题存疑:为什么准生产环境会用到ustore表?人为创建还是迁移所致?
问题核对:exbase目标端转换确实是ustore表,且只是个别表存在该情况
问题定位:源库SQLServer迁移到G100 2.2 Build 15 MSSQL兼容模式,原始语句存在include index语法会被转换成storage_type=ustore
问题处理:同业务确认并无强制使用ustore需求,而是exbase的迁移问题,且ustore只用于POC特性,不上生产,故将ustore表手动重建成astore表并关闭参数
MVS工单:HL2024004943
3.9 建议:运行 ANALYZE | ANALYSE 优化程序提供有用的统计数据
数据导入恢复后
exbase迁移后
数据库重启后
主备切换后