这两天突然想起前段时间 MySQL 转 PG 项目实施过程中曾经导致过 PostgreSQL 宕机的情况,但很快 PG 自己恢复,下面来模拟下当时的情形。
1 环境信息
PostgreSQL: 9.1.1
MySQL : 5.5.15
2 创建测试表 (on MySQL )
1 |
mysql> create table test_1 (id integer ,name varchar(32)); |
备注:为了演示,创建一张名为 test_1 的表,两个字段,并插入三条数据。
3 查看 foreign server ( On PostgreSQL)
1 |
adsystem=# /des |
4 创建外部表 ( On PostgreSQL)
1 |
adsystem=# create foreign table ft_test_1 (id integer) server mysql_svr OPTIONS (database '51mrp_adsystem', table 'test_1'); |
备注:在 PG 库中创建外部表时,故意只创建一张字段,与 MySQL 中的表 test_1 表结构不一样。
5 查询外部表 ( On PostgreSQL)
1 |
adsystem=# select * from ft_test_1; |
备注:当查询外部表 ft_test_1 时, PostgreSQL 服务出现连接中断的情况,当前 session 中断,查看数据库服务器日志如下。
6 csv 日志信息 ( On PostgreSQL)
1 |
2012-02-20 20:18:21.807 CST,,,13434,,4f41ebff.347a,2,,2012-02-20 14:45:19 CST,,0,LOG,00000,"server process (PID 20995) was terminated by signal 11: Segmentation fault",,,,,,,,,"" |
备注:PostgreSQL 出现短时间的中断,但又很快恢复正常,从日志文件来看,数据库首先是异常关闭,然后自动恢复正常,整个处理过程在 80 ms 左右,下面看下 PostgreSQL 正常的创建外部表的方法。
7 正确的方法 ( On PostgreSQL)
1 |
adsystem=# drop foreign table ft_test_1; |
备注:当外部表和源 MySQL 表的表结构一致时,上述故障不再发生,查询正常。
8 总结
- 在使用 mysql_fdw 迁移 MySQL 库数据到 PG 时,外部表的结构和 MySQL 的表结构必需一致;这个一致包括三方面:
- 字段类型一致;
- 字段总数一样,否则查询外部表时可能导致 PG 宕机;
- 字段顺序一致,否则数据可能出现问题。
- 在做 MySQL 转 PG项目时,外部表创建脚本务必需要仔细检查,并在测试环境全面测试。
原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/tech/database/237826.html