摘要:
在数字化时代,数据迁移是企业升级数据库系统的关键步骤。本文将为您详细介绍如何将MySQL数据库迁移到AntDB,包括详细的步骤、技巧和注意事项。无论您是数据库管理员还是开发者,本文都将帮助您顺利完成迁移,提升数据库性能和稳定性。
1. 软件安装
1.1 安装必要的Perl模块
为了使用Ora2Pg工具进行数据库迁移,您需要在系统中安装以下Perl模块。请按照以下步骤操作:
步骤1:安装DBI、JSON、DBD:Pg、DBD:Oracle
yum install mysql-devel
yum install postgresql-devel
yum install -y perl-ExtUtils-CBuilder perl-ExtUtils-MakeMake
复制
步骤2:安装其他必需软件包
下载并安装以下软件包:
- CPAN-2.27.tar.gz
- DBD-mysql-4.050.tar.gz
- DBD-Oracle-1.80.tar.gz(Oracle迁移需要的包)
- DBD-Pg-3.10.5.tar.gz
- Devel-CheckLib-1.14.tar.gz
- instantclient_11_2.tar.gz(Oracle迁移需要的包)
- ora2pg-20.0.zip
- Time-HiRes-1.9760.tar.gz
步骤3:解压并安装软件包
将下载的软件包上传到服务器(例如:/data/mysql2pg目录下),然后使用root用户执行以下命令:
cd /data/mysql2pg/ tar -zxvf instantclient_11_2.tar.gz unzip instantclient-basic-linux.x64-21.3.0.0.0.zip unzip instantclient-sdk-linux.x64-21.3.0.0.0.zip unzip instantclient-sqlplus-linux.x64-21.3.0.0.0.zip
复制
设置环境变量:
export ORACLE_HOME= /data/mysql2pg/instantclient_11_2 export LD_LIBRARY_PATH=$ORACLE_HOME : $LD_LIBRARY_PATH
复制
进入每个软件包目录,执行以下命令安装:
perl Makefile.PL
make
make install
复制
注意:先安装DBI再安装DBD。
执行 ora2pg --help 查看是否安装成功。
2.创建迁移项目
2.1 使用ora2pg初始化迁移项目
创建迁移项目是迁移过程的第一步。使用以下命令初始化迁移项目:
ora2pg --init_project oramig -m
复制
-m/–mysql 选项和–init_project/-i 选项一起使用,用于告知ora2pg我们正在处理MySQL格式。
2.2 项目目录结构
创建迁移项目后,当前目录下会生成一个名为 oramig 的目录模板。该目录包含以下内容:
- schema 和 sources 目录:存放各对象的DDL语句。schema 存放转换为PL/PGSQL后的语句,sources 存放转换前的PL/SQL语句。
- data 目录:存放表数据文件。
- config 目录:包含配置文件 ora2pg.conf。
- reports 目录:存放迁移报告。
术语解释
- Ora2Pg:一个用于将Oracle数据库迁移到PostgreSQL的工具,也支持MySQL迁移。
- DBI:Perl数据库接口,用于连接和操作数据库。
- DBD:数据库驱动,用于特定数据库类型的连接和操作。
常见问题解答
Q: 安装过程中遇到权限问题怎么办?
A: 确保您以root用户身份执行安装命令。如果仍然遇到问题,请检查文件权限和所有权。
Q: 如何验证ora2pg是否成功安装?
A: 执行 ora2pg --help 命令,如果显示帮助信息,则表示安装成功。
3.修改配置文件
3.1 配置文件的重要性
配置文件是数据库迁移过程中的关键,它包含了连接数据库所需的所有参数。以下是您需要修改的参数:
3.2 修改 conf 目录下的 ora2pg.conf 文件
参数名 | 描述 | 示例值 |
---|---|---|
ORACLE\_HOME | 设置环境变量 ORACLE\_HOME,DBD::Oracle 模块使用该变量查找 Oracle 共享库 | /data/mysql2pg/instantclient_11_ 2 |
ORACLE\_DSN | 设置标准 DBI DSN 格式的数据源名称。 | Oracle: dbi:Oracle:host=oradb_host.myhost.com;sid=DB_ SID;port=1521 mysql: dbi:mysql:host=192.168.1.10;database=sakila;port=3306 |
ORACLE\_USER | 指定连接 Oracle 数据库的用户名。 | sys as username |
ORACLE\_PWD | 指定连接 Oracle 数据库的密码。 | your\_password |
USER\_GRANTS | 如果使用普通用户连接 Oracle 数据库,并且该用户没有访问 DBA\ _… 表的权限,将该参数设置为 1。 | 1 or 0 |
ORA_INITIAL_ COMMAND | 建立 Oracle 数据库连接后,执行一个初始化命令。 | ALTER SESSION SET NLS_DATE_ FORMAT=‘YYYY-MM-DD HH24:MI:SS’ |
REPLACE_ZERO_ DATE | 指定日期为0时的替换值。当表结构中有一个date类型的列且有非NULL约束时,可以使用它来指定一个固定的日期. | 2023-03-14 00:00:00 |
注:从mysql迁移和从oracle迁移,配置文件的差距只在ORACLE_DSN,其余参数可复用。
术语解释
- DSN:数据源名称,用于指定数据库的连接信息。
- DBD:数据库驱动,用于特定数据库类型的连接和操作。
常见问题解答
Q: 如何确保配置文件的正确性?
A: 在修改配置文件后,执行 ora2pg -t SHOW_VERSION -c config/ora2pg.conf 命令来测试数据库的连接。
Q: 如果连接测试失败怎么办?
A: 检查您的配置文件中的参数是否正确,特别是用户名、密码、主机和端口。确保您的网络连接没有问题。
4. 导出MySQL数据
4.1 创建具有远程连接权限的用户
在MySQL上创建用户并授予权限:
create user 'username' @'host' identified by 'password' ; grant all privileges on * . * to 'username' @'%' with grant option ;
flush privileges ;
复制
4.2 导出数据
执行以下命令导出MySQL数据:
sh export_schema.sh ora2pg -t COPY -o data.sql -b ./data -c ./config/ora2pg.conf
复制
注意:如果导出过程中遇到权限问题,请确保您的用户具有足够的权限。
常见问题解答
Q: 数据导出过程中遇到错误怎么办?
A: 检查您的数据文件路径和权限。确保您的用户有足够的权限访问这些文件。
Q: 如何处理导出的数据文件过大的问题?
A: 您可以将数据分割成多个文件,或者使用压缩工具来减小文件大小。
5. 数据导入到AntDB
5.1 修改配置文件,配置antdb的连接方式
ORACLE_DSN dbi:pg:host=${hostip};database=fed_host_1_2_0;port=19999
复制
ORACLE_USER 和 ORACLE_PWD
这两个选项用于指定连接 antdb 数据库的用户名和密码。
设置好 antdb 数据库的 DSN 之后,可以执行以下命令测试数据库的连接:
ora2pg -t SHOW_VERSION -c config/ora2pg.conf
复制
5.2 导入数据
使用以下命令将数据导入AntDB:
sh import_all.sh -d fed_guest_1_2_0 \ -h ${hostip} \ -U adb63 \ -p 19999 \ -o adb63
复制
参数说明:
- -d 指定数据库
- -h 指定AntDB所在服务器ip
- -U 指定数据库连接用户
- -o 指定创建database的用户
注意点:
- 如果导入表的某个字段报错,确认是否是因为AntDB关键词导致,可更改字段名解决。
- 如果导入索引,报已存在,是因为oracle/mysql的同一个表的索引名称不可重复,但是不同表可重复,但是AntDB全库索引名称都不可重复,需要手动更改索引名称。
术语解释
- AntDB:兼容PostgreSQL语法的数据库,与PostgreSQL生态全面适配。
常见问题解答
Q: 数据导入AntDB时遇到索引名称冲突怎么办?
A: 手动更改索引名称,确保全库索引名称唯一。
Q: 数据导入后如何验证数据的完整性?
A: 使用 select count( *) 语句对比AntDB和MySQL中的数据量,确保数据一致性。
6. 校验数据量
6.1 查询AntDB导入所有的表的count数
使用以下命令查询AntDB中所有表的数据量:
psql -d fed_guest_1_2_0 -p 19999 -c "SELECT concat('select ''',tablename,''' as table_name,count(1) as sum from ',tablename,';') FROM pg_tables where schemaname = 'public' order by 1;" > select_antdb.sql 2 > &1
/* 注:得到的s elect_antdb.sql是所有表的select count(1)语句 */
psql -d fed_guest_1_2_0 -p 19999 -f select_antdb.sql > select_antdb.out 2>&1
/* 注:得到的 select_antdb.out是所有表的数据量 */
复制
6.2 查询MySQL源库所有的表的count数
使用以下命令查询MySQL中所有表的数据量:
mysql -u root -P 30306 -h 10.19 .36.200 -p1qaz@WSX -D fed_guest_1_2_0 -e "SELECT concat('select ''',table_name,''' as table_name,count(1) as sum from ',table_name,';') FROM information_schema.tables where TABLE_SCHEMA = 'fed_guest_1_2_0' order by 1;" > select_mysql.sql 2 > &1
/* 注:得到的s elect_mysql.sql是所有表的select count(1)语句 */
mysql -u root -P 30306 -h 10.19.36.200 -p1qaz@WSX -D fed_guest_1_2_0 -e "source /home/puaiuc/ select_mysql.sql "> select_mysql.sql.out 2>&1
/* 注:得到的select_mysql.sql.out 是所有表的数据量 */
复制
6.3 比对数据量
使用 diff 命令比对AntDB和MySQL的数据量:
diff -B -w -y select_antdb.out select_mysql.out
复制
术语解释
- count( *):SQL语句,用于计算表中的行数。
常见问题解答
Q: 数据量不一致怎么办?
A: 检查数据导入过程中是否有错误,或者数据是否有损坏。重新导入数据并验证。
Q: 如何处理数据导入后的性能问题?
A: 优化数据库配置,如增加内存、优化查询语句等。
7. AntDB的优势和数据类型对比
7.1 AntDB的优势
AntDB是兼容PostgreSQL语法的数据库,与PostgreSQL生态全面适配:
- 执行复杂查询时,性能更好且更稳定。
- 对大表(上亿条记录,数十GB大小)的支持更好。
- 支持JSON,XML等现代应用程序功能。
- 支持物化视图。
- 窗口函数功能支持较好。
- PostgreSQL的插件体系带来了无限可能,如PostGIS,Citus,Timescaledb,Pipelinedb等。
7.2 数据类型对比
MySQL | AntDB |
---|---|
TINYINT | 不支持,可以通过domain定制 |
SMALLINT | SMALLINT |
MEDIUMINT | 不支持,可以通过domain定制 |
INT | INT/INTEGER |
BIGINT | BIGINT |
有符号和无符号 | 不支持,可以通过domain定制 |
float4/real | float4/real |
double | double |
decimal | decimal |
numeric | numeric |
DATE | DATE |
TIME | TIMESTAMP |
YEAR | 不支持,可以通过domain定制 |
DATETIME | TIMESTAMP |
TIMESTAMP | TIMESTAMP |
CHAR | CHAR |
VARCHAR | VARCHAR |
TINYBLOB | bytea |
TINYTEXT | TEXT |
BLOB | bytea |
TEXT | TEXT |
MEDIUMBLOB | bytea |
MEDIUMTEXT | TEXT |
LONGBLOB | bytea |
LONGTEXT | TEXT |
JSON | JSON/JSONB |
术语解释
- domain:在PostgreSQL中,domain是创建在另一种数据类型基础上的逻辑数据类型,用于限制该数据类型的值。
常见问题解答
Q: 如何在AntDB中创建自定义类型?
A: 使用 create domain 语句来创建自定义类型,例如:
create domain uint8 as numeric ( 20 , 0 ) check ( value <= (( 2 ^ 64 :: numeric ):: numeric ( 20 , 0 ) - 1 ) and value >= 0 :: numeric ( 20 , 0 ));
复制
Q: AntDB中如何优化查询性能?
A: 使用物化视图、索引和合理的查询优化技术来提高查询性能。
8. SQL语句对比和其他功能对比
8.1 SQL语句对比
以下是MySQL和AntDB在SQL语句上的差异:
-
CREATE TABLE:AntDB不支持使用反引号包裹表名和字段名。
-
ALTER TABLE:AntDB不支持某些MySQL的语法
ALTER TABLE table_name ADD INDEX index_name(col_list);
ALTER TABLE table_name ADD UNIQUE(col_list);
ALTER TABLE table_name ADD PRIMARY KEY(col_list);
ALTER TABLE table_name DROP INDEX index_name;
ALTER TABLE table_name DROP primary key; -
REPLACE INTO:AntDB不支持MySQL的 REPLACE INTO 语法。
-
更新并返回:AntDB使用 returning 子句来返回更新后的行。
-
插入冲突处理:AntDB使用 on conflict 子句来处理插入冲突。
-
LIMIT:AntDB不支持MySQL的 LIMIT offset_no, limit_no 语法。
8.2 其他功能对比
功能 | MySQL | PostgreSQL/AntDB |
---|---|---|
默认事务级别 | REPEATABLE-READ | READ-COMMITTED |
BEGIN>COMMIT/ROLLBACK | 只支持对DML的 | DML和DDL都支持 |
表名、索引名等 | 同一个表的索引名称不可重复,但是不同表可重复 | 全库索引名称都不可重复 |
术语解释
- DML:数据操作语言,包括 SELECT, INSERT, UPDATE, DELETE。
- DDL:数据定义语言,包括 CREATE, ALTER, DROP。
常见问题解答
Q: 如何在AntDB中处理不支持的MySQL语法?
A: 使用AntDB提供的转换工具或手动修改SQL语句以适应AntDB的语法。
Q: 如何在AntDB中实现MySQL的自动记录创建时间和修改时间的功能?
A: 使用触发器和函数来实现,例如:
CREATE OR REPLACE FUNCTION "public" . "cs_timestamp" ()
RETURNS "pg_catalog" . "trigger" AS $BODY$ begin
new.modify_time = current_timestamp ;
return new; end
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100 ;
复制
然后创建触发器:
create trigger cs_name before update on ai_enum_dic for each row execute procedure cs_timestamp();
复制
结语
感谢您阅读本文,希望这些详细的步骤和技巧,能帮助您顺利完成MySQL到AntDB的迁移。如有任何疑问或需要进一步的帮助,欢迎在评论区留言。
如果觉得本文有帮助,请分享给您的同事或朋友,或在社交媒体上分享本文。订阅亚信安慧AntDB公众号,获取更多数据库迁移和优化的技巧!
关于亚信安慧AntDB数据库
AntDB数据库始于2008年,在运营商的核心系统上,服务国内24个省市自治区的数亿用户,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行超十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。
文章被以下合辑收录
评论
