# 转换数据库到OpenGauss

将MYSQL导入到OpenGauss需要使用官方工具,参考文献https://docs-opengauss.osinfra.cn/zh/docs/3.1.0/docs/DataMigration/%E5%85%A8%E9%87%8F%E8%BF%81%E7%A7%BB.html 官方文档标明工具为Chameleon_3.1.1,但是在页面上找到的下载链接并不存在该工具。所以采用下载源码安装的方式。 本机采用的Python版本为Python 3.6.9,因为该工具在更高的Python版本并不能编译,一直有各种的编译问题,所以最后选择了docker,选择ubuntu:bionic版本进行安装。

docker pull ubuntu:bionic;
docker run -it ubuntu:bionic;

# 编译openGauss-tools-chameleon

首先,安装python3,并且安装pip3

# apt-get install python3;
# apt-get install python3-pip;
# apt-get install git;

创建用户www,因为该编译的代码不能在root下面执行。拉取代码,

# adduser www
# su - www;
$ git clone git@gitee.com:opengauss/openGauss-tools-chameleon.git
$ python3 -m venv venv
$ source venv/bin/activate
$ cd openGauss-tools-chameleon
$ python3 setup.py install  

编译如果遇到mysql-config不存在问题,需要安装mysql-client。在ubuntu里面执行:

apt-get install libmysqlclient-dev

# 创建配置文件

$ chameleon set_configuration_files

进入目录修改

$ cd ~/.pg_chameleon/configuration
$ cp config-example.yml default.yml

# 修改配置文件

修改配置文件,该配置需要特别注意schema_mappings中的manager_1就是导出的数据库,而其对应是schema,pg的默认schema为public,但是导出工具openGauss-tools-chameleon没有办法对public进行命令修改,所以可能会引起报错,所以我们在这里采用的新的schema。

# global settings
pid_dir: '~/.pg_chameleon/pid/'
log_dir: '~/.pg_chameleon/logs/'
log_dest: file
log_level: info
log_days_keep: 10
rollbar_key: ''
rollbar_env: ''
dump_json: No

# type_override allows the user to override the default type conversion
# into a different one.

type_override:
#  "tinyint(1)":
#    override_to: boolean
#    override_tables:
#      - "*"

# specify the compress properties when creating tables
compress_properties:
  compresstype: 0
  compress_level: 0
  compress_chunk_size: 4096
  compress_prealloc_chunks: 0
  compress_byte_convert: false
  compress_diff_convert: false

# postgres destination connection
pg_conn:
  host: "47.116.215.73"
  port: "5432"
  user: "fizz_manager"
  password: "Root@123456"
  database: "fizz_manager"
  charset: "utf8"
  params:
#    maintenance_work_mem: "1G"
#    param1: value1
#    param2: value2

sources:
  mysql:
    readers: 4
    writers: 4
    retry: 3
    db_conn:
      host: "101.132.114.209"
      port: "3306"
      user: "manager_1"
      password: "root123456"
      charset: 'utf8'
      connect_timeout: 10
    schema_mappings:
      manager_1: fizz_manager
    limit_tables:
      - delphis_mediterranea.foo
    skip_tables:
      - delphis_mediterranea.bar
    enable_compress: No
    compress_tables:
      - delphis_mediterranea.foo
    grant_select_to:
      - usr_readonly
    lock_timeout: "120s"
    my_server_id: 100
    replica_batch_size: 10000
    replay_max_rows: 10000
    batch_retention: '1 day'
    copy_max_memory: "300M"
    copy_mode: 'file'
    out_dir: /tmp
    csv_dir: /tmp
    contain_columns: No
    column_split: ','
    sleep_loop: 1
    on_error_replay: continue
    on_error_read: continue
    auto_maintenance: "disabled"
    index_parallel_workers: 2
    gtid_enable: false
    type: mysql
    skip_events:
      insert:
        - delphis_mediterranea.foo  # skips inserts on delphis_mediterranea.foo
      delete:
        - delphis_mediterranea  # skips deletes on schema delphis_mediterranea
      update:
    keep_existing_schema: No
    migrate_default_value: Yes
    mysql_restart_config: No
    is_create_index: Yes
    index_dir: '~/.pg_chameleon/index/'
    is_skip_completed_tables: No
    with_datacheck: No
    slice_size: 100000
    csv_files_threshold:
    csv_dir_space_threshold:

# 搭建OpenGauss数据库

openGauss 3.1.0可以在arm64版本上运行,但是从3.1.1到5.0.0版本运行都会报错,即使是在其上面运行的docker也会有报错,可能是指令集的问题的,查看了一些帖子,无论是的官方的opengauss/opengauss,还是enmotech/opengauss从3.1.1起均有问题,所以只能在阿里云上linux2镜像下安装了,x86_64的架构下运行没有问题。由于3.1.0在openGauss-tools-chameleon运行之后会有报错,该报错是3.1.0不兼容3.1.1语法导致的。

unrecognized configuration parameter "dolphin.lower_case_table_names"

所以最终使用enmotech/opengauss:5.0.0进行安装。

docker run --name opengauss --privileged=true -d -p 5432:5432 -e GS_PASSWORD=Root@123456 -e GS_USERNAME=fizz_manager enmotech/opengauss:5.0.0

安装之后进入容器

docker exec -it <CONTAINER_ID> /bin/bash

切换到omm账号,omm是enmotech/opengauss创建账号,在前面,我们使用GS_PASSWORD设置里密码,并且数据库用户fizz_manager。

su - omm

操作数据库

$ gsql # 只有omm才能执行该指令, 而且在容器内不需要密码,在容器外面才需要账号密码
omm=# CREATE DATABASE fizz_manager WITH DBCOMPATIBILITY='B';
\c fizz_manager;
fizz_manager=# GRANT ALL PRIVILEGES ON all tables in schema public TO fizz_manager;
fizz_manager=# GRANT ALL privileges ON DATABASE fizz_manager TO fizz_manager;
fizz_manager=# alter database fizz_manager set dolphin.lower_case_table_names = 0; # 对齐mysql

# MYSQL 设置

使用root账号登录MYSQL之后执行

grant REPLICATION CLIENT ON *.* TO manager_1
grant RELOAD ON *.* TO manager_1

# 迁移数据

chameleon create_replica_schema --config default --debug
chameleon add_source --config default --source mysql --debug
chameleon init_replica --config default --source mysql --debug # 执行完毕有init_replica finished字样输出

# 导出数据库

在导出之前需要处理一下关键字

#重命名报错的两个表:

ALTER TABLE fizz_manager.tb_callback_request RENAME COLUMN body TO request_body; ALTER TABLE fizz_manager.tb_callback_request_replay_log RENAME COLUMN body TO request_body;


执行导出

gs_dump -p 5432 fizz_manager -f fizz_manager.sql -n fizz_manager -N hr -N public -N sch_chameleon


导出之后最后使用docker cp <CONTAINER_ID>:/home/omm/fizz_manager.sql ~/fizz_manager.sql 拷贝出来。

## 一些提醒
如果setuptools 报错,可以安装68.0.0版本

pip3 install setuptools==68.0.0

docker访问本机地址:host.docker.internal