逻辑备份obdumper导出有哪些注意事项?

逻辑备份obdumper导出有哪些注意事项?

2 个赞

obdumper 导出注意事项

根据 OceanBase 官方文档和实践经验,obdumper 导出时需要关注以下几个方面的注意事项:

环境与权限

  • Java 环境要求:本地必须安装 Java 8+ 并配置 JAVA_HOME 环境变量,强烈建议使用 JDK 1.8.0_3xx 及以上版本。
  • JVM 内存配置:JVM 内存太小会影响导出性能甚至导致 Full GC 或 GC Crash。建议根据机器规格调整,如机器可用内存 16G,可将 JVM 堆内存设为 8G。
  • 用户权限:连接数据库的账号需要拥有 CREATESELECT 等权限。导出表结构时还需要指定 SYS 租户的 root 密码或 proxyro 用户及其密码,推荐使用 proxyro 用户获取元数据信息。
  • 版本兼容性:需确认 obdumper 版本与 OceanBase 数据库版本兼容。

数据一致性

  • 不锁表导出:obdumper 支持通过最新的快照版本以不锁表的方式导出全局一致的数据,避免影响线上业务。
  • 时间点快照导出:支持指定 SCN 或 TIMESTAMP,导出某一历史时刻的数据快照。

分区表导出

  • 组合分区需指定二级分区名:使用 --partition 选项导出分区数据时,对于组合分区表需要指定二级分区名,obdumper 无法直接导出一级分区内的数据。如果指定的分区名不存在,会报错提示。

对象定义导出限制

不同 OceanBase 版本对部分对象定义的支持存在差异:

  • MySQL 1.4.72:不支持导出唯一前缀索引定义(如 UNIQUE(c1(10))
  • MySQL 1.4.x:不支持导出生成列定义(如 GENERATED ALWAYS AS (expr)
  • MySQL 2.2.7x:不支持导出垂直分区(如 partition by column)、SYNONYM 对象定义、索引存储列(如 storing(column_list)
  • Oracle 模式:不支持导出 interval day(2) to second(0) 类型的数据

文件格式与命名

  • 文件命名规范:导出数据文件的命名格式为 table.group.sequence.suffix
  • 外键列顺序:外键包含多列时,导出时无法保证列的顺序。
  • 特殊字符限制:Windows 系统不能使用 \ 作为分隔符;数据库对象名不能包含 \ / : * ? " < > 等特殊符号,否则无法正常导出。
  • 分隔符转义:导出 CSV 格式时,如果字段内容中出现指定的分隔符,会对其进行转义处理。

性能调优

  • 并发线程:通过 --thread 参数控制导出并发数,默认为 CPU * 2,上限 32。
  • 分页大小:通过 --page-size 参数调整任务分页大小,默认 1000000。
  • 导出格式选择:CSV 格式通常比 SQL 格式导出速度更快。
  • 建议结构和数据分开导出:类似 MySQL 导出实践,建议 DDL 和 DML 分开执行,便于管理和排查问题。

生成列处理

  • 导出表数据中包含生成列时,默认会导出生成列的数据。可使用 --exclude-virtual-columns 选项跳过生成列。

逻辑库导出

  • 使用 --logical-database 选项时,导出的是随机的一个物理分库分表的定义,不可直接导入数据库,需要手动将物理库表结构改成逻辑库表结构后才能使用。