暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mogdb数据库逻辑迁移_20240702

原创 杨卓 2024-07-02
145

1.需求说明

客户需求,对Mogdb测试库数据从老的单机,迁移到主从集群上来。测试库的名称及用户都会进行修改。

2.数据库迁移

新环境安装事项

老环境是B兼容性Mysql,UTF8字符集,新环境安装也选择兼容模式B,UTF8字符集

[omm@mogdb ~]$ gsql
gsql ((MogDB 5.0.5 build b77f1a82) 
MogDB=# \l+
                                                                   List of databases
   Name    | Owner | Encoding | Collate | Ctype | Access privileges | Compatibility |  Size   | Tablespace |            
    Description                 
-----------+-------+----------+---------+-------+-------------------+---------------+---------+------------+------------
--------------------------------
 mysql     | mysql | UTF8     | C       | C     |                   | B             | 20 GB   | pg_default | 
 postgres  | omm   | UTF8     | C       | C     |                   | A             | 9983 MB | pg_default | default adm
inistrative connection database
 template0 | omm   | UTF8     | C       | C     | =c/omm           +| A             | 25 MB   | pg_default | default tem
plate for new databases
           |       |          |         |       | omm=CTc/omm       |               |         |            | 
 template1 | omm   | UTF8     | C       | C     | =c/omm           +| A             | 25 MB   | pg_default | unmodifiabl
e empty database
           |       |          |         |       | omm=CTc/omm       |               |         |            | 
(4 rows)

源端导出

gs_dump --file=/data/backup_dir/dump_xxx_20240702_backup_01.dump \
--clean \
--format=c \
--username=xxx \
--password=xxxx \
 mysql
 
gs_dump[port='26000'][mysql][2024-07-02 11:27:09]: The total objects number is 5835.
gs_dump[port='26000'][mysql][2024-07-02 11:27:12]: [100.00%] 5835 objects have been dumped.
gs_dump: [port='26000'] [mysql] [archiver] [2024-07-02 11:27:12] WARNING: archive items not in correct section order
gs_dump[port='26000'][mysql][2024-07-02 11:30:27]: dump database xxx successfully
gs_dump[port='26000'][mysql][2024-07-02 11:30:27]: total time: 220644  ms

目标端导入

$ gs_restore --dbname=imxxx \
--username=imxxx \
--password=Imxxxxx \
--no-owner /dump_xxxxx_20240702_backup_03.dump


14100 SQL statements read in !
14200 SQL statements read in !
Error while PROCESSING TOC:
Error from TOC entry 26015; 3546 19191 SYNONYM dual omm
could not execute query: ERROR:  schema "sys" does not exist
    Command was: CREATE OR REPLACE SYNONYM "sys"."dual" FOR "pg_catalog"."sys_dummy";

Finish reading 14202 SQL statements!
end restore operation ...
WARNING: errors ignored on restore: 1
restore operation successful
total time: 5382689  ms

可以发现,提示导入成功,但是有告警信息,提示我们同义词创建失败。

check 表数量对比

SELECT table_catalog,table_schema,count(*) from 
 information_schema.tables
 group by table_catalog,table_schema
  order by 3;
  table_catalog |    table_schema    | count 
---------------+--------------------+-------

check indexes

select schemaname,tablename,count(*) 
 from pg_indexes
  group by schemaname,tablename
   order by 1,2;

select schemaname,count(*) 
 from pg_indexes
  group by schemaname
   order by 2;

check views

select schemaname,viewowner,count(*) 
from pg_views group by schemaname,viewowner
 order by 1,2;
     schemaname     | viewowner | count 
--------------------+-----------+-------

check sequence

https://support.enmotech.com/article/search/1457

\set get_table_name_by_seq 'select ts.nspname as object_schema,tbl.relname as table_name, col.attname as column_name,s.relname   as sequence_name from pg_class s  join pg_namespace sn on sn.oid = s.relnamespace  join pg_depend d on d.refobjid = s.oid and d.refclassid=''pg_class''::regclass  join pg_attrdef ad on ad.oid = d.objid and d.classid = ''pg_attrdef''::regclass  join pg_attribute col on col.attrelid = ad.adrelid and col.attnum = ad.adnum  join pg_class tbl on tbl.oid = ad.adrelid  join pg_namespace ts on ts.oid = tbl.relnamespace where s.relkind = ''S'' and d.deptype in (''a'', ''n'');'
mysql=# :get_table_name_by_seq
   object_schema    |  table_name  | column_name |      sequence_name       
--------------------+--------------+-------------+--------------------------

check 存储过程

--mysql=# select proname,prosrc from pg_proc ;
mysql=# select proname from pg_proc ;
(5472 rows)

check 同义词

mysql=# select 1 from dual;
 ?column? 
----------
        1
mysql=# select 1 from "pg_catalog"."sys_dummy";
 ?column? 
----------
        1
mysql=# 
mysql=# select * from PG_SYNONYM limit 10;
 synname | synnamespace | synowner | synobjschema | synobjname 
---------+--------------+----------+--------------+------------
 dual    |        19190 |       10 | pg_catalog   | sys_dummy
 
--pg_restore err sql
 CREATE OR REPLACE SYNONYM "sys"."dual" FOR "pg_catalog"."sys_dummy";
--change exec
 CREATE OR REPLACE SYNONYM "imss"."dual" FOR "pg_catalog"."sys_dummy";
imss=#  CREATE OR REPLACE SYNONYM "imss"."dual" FOR "pg_catalog"."sys_dummy";
CREATE SYNONYM
imss=# 
imss=#  select * from PG_SYNONYM limit 10;
 synname | synnamespace | synowner | synobjschema | synobjname 
---------+--------------+----------+--------------+------------
 dual    |        32699 |       10 | pg_catalog   | sys_dummy
(1 row)

check triggers

select * from information_schema.triggers;

迁移遇到的问题

导入报错-保留字

gs_dump: [port='26000'] [mysql] [archiver (db)] [2024-07-02 11:09:08] query failed: ERROR:  syntax error at or near "index"
LINE 1: ... create_user_id, length, package_id, handle_time, index, sec...

解决办法:
1.业务修改index字段名称,修改后,再次导入再次报错,客户使用非常多的index作为字段名称;
mysql=> ALTER TABLE xx.xx RENAME COLUMN "index" TO index_id;

2.导入时添加参数--quote-all-identifiers 

导入报错-Schema不存在

Error from TOC entry 542; 1259 19619 TABLE xxx mysql
could not execute query: ERROR:  role "mysql" does not exist
    Command was: ALTER TABLE xx.xxOWNER TO mysql;

由于source mysql,target db 和schema不是mysql,但是dump文件里面是导出source db里面记录owner to mysql; !!! 所以报错
1.新环境与源端保持一致,database,schema不合理的解决方案;
2.导入时参数指定--no-owner

业务反馈SQL变慢

迁移后,建议对整个schema收集统计信息
ANALYZE;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论