将PostgreSQL迁移到TeleDB 解码插件配置 > REPLICATION > wallevel logical minimal, archive, hotstandby, > or logical (change requires restart) > maxwalsenders 100 max number of walsender > processes (change requires restart) > walkeepsegments 4 in logfile segments, 16MB each; > 0 disables > walsendertimeout 60s in milliseconds; 0 disables > maxreplicationslots 100 max number of replication > slots (change requires restart) ③ 重启PostgreSQL。 ④ 验证配置是否生效。 > > 创建逻辑复制,使用逻辑复制插件decoderbufs > select from > pgcreatelogicalreplicationslot('decoderbufsdemo', 'decoderbufs'); > 对相关表进行数据操作 > 使用decoderbufs调试模式 > SELECT data FROM > pglogicalslotpeekchanges('decoderbufsdemo', NULL, NULL, 'debugmode', '1'); > 使用decoderbufs获取wal变更,更新wal位置 > SELECT data FROM pglogicalslotgetchanges('decoderbufsdemo', NULL, NULL, 'debugmode', '1'); > 查看逻辑复制的wal位置 > SELECT FROM pgreplicationslots WHERE slottype 'logical'; > 删除逻辑复制 > select pgdropreplicationslot("decoderbufsdemo"); 5. 创建源库DTS用户 > 如果仅做测试用,可以直接使用PostgreSQL的超级用户作为迁移用户,一般用户名为postgres。 > 如果需要授予精准的操作权限,则按照以下操作进行授权: > > CREATE USER和GRANT语法。 > 创建同步用户 (dts) > CREATE USER dts WITH PASSWORD 'xxx'; > 授权同步用户 (dts) 需要同步的 SCHEMA (public) 权限 > GRANT SELECT,REFERENCES,TRIGGER ON ALL TABLES IN SCHEMA public TO dts; > grant SELECT on ALL SEQUENCES IN SCHEMA public to dts; > grant usage on schema public to dts; > 开启同步用户 (dts) 的 REPLICATION > ALTER USER dts REPLICATION; > grant pgreadallsettings to dts; 6. 创建目标库DTS用户 > 如果仅做测试用,可以直接使用TeleDB的root用户作为迁移用户。 > 如果需要TeleDB的精准迁移权限,可按照如下配置操作: > > CREATE USER dts WITH PASSWORD 'xxx'; > grant usage on schema public to dts; > grant ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dts; > grant CREATE on DATABASE public to dts; > grant CREATE on schema public to dts; > > 如果要做增量迁移且迁移的表包含外键,那么除了上述权限外,还要保证该用户具有在会话级别执行SET sessionreplicationrole 'replica'的权限。可登录TeleDB控制台,将该参数设置并重启。 7. 如果需要做增量DDL,则需要手动在源库创建用于增量DDL的元数据结构 > 执行如下语句,创建存储DDL信息的表。勾选增量DDL时,迁移对象中必须包含这张表以及它的序列。 > > DROPTABLE IF EXISTS public.dtsddlinfo; > DROP SEQUENCE IF EXISTS public.dtsddlinfoidseq; > CREATETABLE public.dtsddlinfo( > id bigserial primary key, > ddl text, > username varchar(64) default currentuser, > txid varchar(16) default txidcurrent()::varchar(16), > tag varchar(64), > database varchar(64) default currentdatabase(), > schema varchar(64) default currentschema, > clientaddress varchar(64) default inetclientaddr(), > clientport integer default inetclientport(), > eventtime timestamp default currenttimestamp > ); 8. 执行如下语句,创建函数。 > CREATEOR REPLACE FUNCTION public.dtscaptureddl() > RETURNS eventtrigger > LANGUAGE plpgsql > SECURITY INVOKER > AS $BODY$ > declare ddl text; > declare realnum int; > declare maxnum int:50000; > begin > if (tgtag in('CREATE TABLE','ALTER TABLE','DROP TABLE','CREATE > SEQUENCE','ALTER SEQUENCE','DROP SEQUENCE','CREATE VIEW','ALTER VIEW','DROP VIEW','CREATE INDEX','ALTER INDEX','DROP INDEX')) then > select currentquery()into ddl; > insertinto public.dtsddlinfo(ddl, username, txid, tag, database, schema, clientaddress, clientport, eventtime) > values(ddl, currentuser, cast(txidcurrent()asvarchar(16)), tgtag, > currentdatabase(), currentschema, inetclientaddr(), > inetclientport(), currenttimestamp); > selectcount(id)into realnum from public.dtsddlinfo; > if realnum > maxnum then > if currentsetting('serverversionnum')::int deletefrom public.dtsddlinfo where id public.dtsddlinfo)andnot exists (select0from pglocks l join > pgdatabase d on l.databased.oid where d.datnamecurrentcatalog and pid<>pgbackendpid()and > locktype'relation'and relationtoregclass('public.dtsddlinfopkey')::oid > and mode'RowExclusiveLock'); > else > deletefrom public.dtsddlinfo where id public.dtsddlinfo)and(xmax0or > coalesce(txidstatus(xmax::text::bigint),'')<>'in progress'); > end if; > end if; > end if; > end; > $BODY$; > 将刚创建的函数的所有者修改为DTS连接源库的账号,以postgresql为例。 > > ALTER FUNCTION public.dtscaptureddl() OWNER TO postgres; > 执行下述命令,创建全局事件触发器。 > > CREATE EVENT TRIGGER dtsddlevent ON ddlcommandend EXECUTE PROCEDURE public.dtscaptureddl(); > 执行以下语句,将创建的事件触发器设置为enable。 > > ALTER EVENT TRIGGER dtsddlevent ENABLE ALWAYS; 9. 确认待迁移对象中是否包含触发器 > 如果将触发器作为结构的一部分,在DTS的调度逻辑上,触发器会先于全量迁移被迁移到TeleDB。这样可能会影响到全量迁移,导致数据不一致。 > 建议将触发器放到全量迁移之后,再新建一个迁移任务进行迁移。 10. 数据及业务信息统计 > 如果为非测试任务,需要在迁移之前统计业务以及迁移信息,方便进行迁移任务规划。 资源信息 源库规格信息 例:4C8G + 500G + SSD 目标库磁盘信息 例:4C8G + 500G + SSD 网络情况 例:为测试环境纯内网传输,无复杂的网络拓补结构 数据信息 总数据量 例:30GB 总库表数量 例:40个库,8000张表,2000个视图,5个触发器 每日新增数据量级 例:一天的WAL日志新增大概100GB 是否所有表都有主键 建议迁移前完善主键,提高性能,方便运维。如果存在无主键的表,则增量阶段源端对应表的增、删、改操作不会同步至目标端,可能导致数据不一致,请谨慎评估。 业务类 规划迁移批次 例:规划分3次进行迁移,迁移时间每天晚上20:0006:00,日期为20230918至20230920。实际迁移操作请与数据库全量备份操作错开,以免交叉影响,否则可能会导致备份失败,同时影响迁移效率。 数据迁移是否可停业务 例:能/不能 增量迁移情况 例:开启增量迁移,持续时间5天 可停业务时间长度 例:服务停机时间预计48小时 业务中是否存在百万级别的大事务 例:存在,涉及对表CLOUD.LOGS进行大事务操作,存在一个存储过程用不带where条件的delete语句定期清理该表。 操作步骤 1. 订购DTS数据迁移实例。 2. 进入实例配置页面。 1. DTS实例创建成功后,进入【数据迁移】实例列表页面,上一步骤购买成功的实例在实例列表中显示状态为“待配置”,进入实例配置页面进行配置: 3. 配置源库及目标库信息。 1. 进入实例配置第一个步骤的【配置源库及目标库信息】页面,填入源库与目标库的相关配置信息,包括数据库类型、IP地址端口、数据库账号、数据库密码等信息。 2. 完成上述信息的填写后,单击源数据库和目标数据库的“测试连接”按钮进行数据库连接测试,检查数据库能否正常连接。 4. 配置迁移对象及高级配置。 1. 源库和目标库连通性测试成功后,点下一步按钮,进入实例配置第二个步骤的【配置迁移对象及高级配置】页面,在“源库对象”中选择要迁移的源库对象,包含:库、TABLE、VIEW、FUNCTION等,选中后单击“>”按钮,将待迁移对象移动到“已选择对象”中。 2. 迁移对象配置说明: 配置 说明 任务步骤 如果只需要进行全量迁移,请同时勾选库表结构迁移和全量迁移。 如果需要进行不停机迁移,请同时勾选库表结构迁移、全量迁移和增量迁移。 注意:如果未选择增量迁移,为保障数据一致性,数据迁移期间请勿在源实例中执行DML和DDL操作。 迁移对象 源库为PostgreSQL的情况下,支持表、视图、函数、存储过程、物化视图、规则、触发器,域、自定义类型等对象的迁移。 在迁移对象框中单击待迁移的对象,然后单击将其移动到已选择对象框;已选择对象可以通过单击将对象回退。 选择迁移对象时,如不展开库的详细信息,则表示整库迁移,后续在增量任务过程中,可在源库创建新表,其他类型暂不支持。 映射名称更改 支持库表列三级名称映射,如需更改单个迁移对象在目标实例中的库名、表名和列名,选择对象,然后单击编辑按钮。 如需批量更改迁移对象在目标实例中的库名、表名,请单击已选择对象方框右上方的“批量编辑”。 若迁移任务仅包含结构迁移和全量迁移,支持列映射名称更改,若迁移任务包含增量迁移,不允许列映射名称更改。 库表名仅支持字母、数字和下划线,长度不超过64个字符。 注意:整库迁移时不建议做库表名映射。 过滤待迁移数据 支持设置where条件过滤数据,过滤条件不允许;和字符,如需使用引号,请使用单引号('),只有满足where条件的数据才会迁移到目标库。 增量迁移的DML 选择增量迁移DML操作,选中迁移对象,单击“编辑”,在弹跳框中选择所需增量迁移的DML操作。若在数据库级别和表级别都指定了DML操作,则表级别的设置会覆盖库级别的。 增量迁移的DDL 增量任务可选择是否迁移增量DDL。 是否定时开始任务 可选择任务开始的时间,默认单击开始任务后立即启动迁移任务。 注意 任务中存在整库迁移的情况下,则必须勾选增量DDL同步。 非整库迁移的情况下,若选择DDL同步,则只迁移待迁移对象的DDL语句。 非整库迁移的情况下,若未选择增量DDL同步,则增量阶段不会同步任何DDL语句。 5. 预检查和启动迁移。 完成迁移对象和高级配置后,单击“下一步预检查”,进入实例配置第三个步骤的【预检查】页面。预检查会检查如下列表信息,并给出检查结果,用户可以依据检查结果进行下一步操作。 检查项 检查内容 lcmonetary参数配置一致性检查 检查源库与目标库的lcmonetary参数配置是否一致。 pg版本检查 检查源库和目标库的pg版本是不是符合要求。 同名对象存在性检查 检查目标库中是否存在和待迁移库同名的待迁移对象。 扩展插件兼容性检查 检查源库中安装的扩展插件,在目标库是否存在。 约束完整性检查 检查待迁移对象中子表依赖的父表是否被选中。 检查hotstandbyfeedback参数配置 全量迁移源库pg为备节点时,hotstandbyfeedback参数需配置为ON。 源库用户权限检查 检查源库用于DTS任务的用户是否具有相应的权限。 源库连通性检查 检查数据传输服务器能否连通源数据库。 源数据库的模式名表名是否合法 检查源数据库的模式名表名是否合法,名称不可以包含+"%'<>,.字符。 源库参数wallevel是否为logical 勾选增量迁移时,检查源库wallevel参数值是否为logical。 目标库用户权限检查 检查目标库用于DTS任务的用户是否具有相应的权限。 目标库连通性检查 检查数据传输服务器能否连通目标数据库。 源库参数maxreplicationslots校验 勾选增量迁移时,检查源库maxreplicationslots参数值是否大于当前已使用的复制槽数量。 源库参数maxwalsenders校验 勾选增量迁移时,检查源库maxwalsenders参数值是否大于当前已使用的复制槽数量。 逻辑解码插件安装校验 勾选增量迁移时,检查源库是否安装逻辑解码插件decoderbufs。 待迁移表是否存在主键检查 勾选增量迁移时,检查待迁移表中是否存在无主键的表。 无日志表存在性检查 勾选增量迁移时,检查当前选择的待同步对象中的表是否存在无日志表。 源库主备状态检查 勾选增量迁移时,检查源库是否为集群中的主库。 ddl同步元数据检查 勾选ddl同步时,检查源库是否有ddl同步所需的元数据对象。 如果预检查通过,可单击【预检查】页面底部的启动迁移 按钮,开始迁移任务。或者单击数据迁移 按钮,返回任务列表,列表中的任务将会显示为 未启动 。 9. 勾选该任务,单击 开始任务 ,任务将显示为 运行中 ,直到该任务全量迁移完成,或者处于增量迁移状态。