# 转换数据库到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