跳转至

源数据库设置

在 Synchdb 可以与外部异构数据库交互并启动复制之前,需要根据下列流程进行配置

为 SynchDB 设置 MySQL

创建用户

创建用户

mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';

授予所需权限

mysql> GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'user' IDENTIFIED BY 'password';

确定用户的权限

mysql> FLUSH PRIVILEGES;

启用 binlog

检查 binlog 是否启用

// for MySQL 5.x
mysql> SELECT variable_value as "BINARY LOGGING STATUS (log-bin) ::"
FROM information_schema.global_variables WHERE variable_name='log_bin';

// for MySQL 8.x
mysql> SELECT variable_value as "BINARY LOGGING STATUS (log-bin) ::"
FROM performance_schema.global_variables WHERE variable_name='log_bin';

如果 binlog 处于“OFF”状态,则将以下属性添加到配置文件中

server-id                   = 223344
log_bin                     = mysql-bin
binlog_format               = ROW
binlog_row_image            = FULL
binlog_expire_logs_seconds  = 864000

再次检查binlog状态

// for MySQL 5.x
mysql> SELECT variable_value as "BINARY LOGGING STATUS (log-bin) ::"
FROM information_schema.global_variables WHERE variable_name='log_bin';

// for MySQL 8.x
mysql> SELECT variable_value as "BINARY LOGGING STATUS (log-bin) ::"
FROM performance_schema.global_variables WHERE variable_name='log_bin';

启用 GTID(可选)

全局事务标识符 (GTID) 唯一地标识集群内服务器上发生的事务。虽然 SynchDB 连接器不强制需要,但使用 GTID 可以简化复制,并使您能够更轻松地确认主服务器和副本服务器是否一致。

启用 gtid_mode

mysql> gtid_mode=ON

启用 enforce_gtid_consistency

mysql> enforce_gtid_consistency=ON

确认更改

mysql> show global variables like '%GTID%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| enforce_gtid_consistency | ON    |
| gtid_mode                | ON    |
+--------------------------+-------+

配置会话超时

当为大型数据库制处理 initial snapshot时,您建立的连接可能会在读取表时超时。您可以通过在 MySQL 配置文件中配置interactive_timeoutwait_timeout来防止此行为。

配置 interactive_timeout:

mysql> interactive_timeout=<duration in seconds>

配置 wait_timeout

mysql> wait_timeout=<duration in seconds>

启用查询日志事件

您可能希望查看每个二进制日志事件的原始 SQL 语句。在 MySQL 配置文件中启用binlog_rows_query_log_events选项允许您执行此操作。目前 SynchDB 不会以任何方式处理或解析原始 SQL 语句,即使它们包含在 binlog 内。这些仅供参考/调试

启用 binlog_rows_query_log_events

mysql> binlog_rows_query_log_events=ON

验证 Binlog 行值选项

验证数据库中 binlog_row_value_options 变量的设置。要使连接器能够使用 UPDATE 事件,必须将此变量设置为除 PARTIAL_JSON 以外的值。

check current variable value

mysql> show global variables where variable_name = 'binlog_row_value_options';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| binlog_row_value_options |       |
+--------------------------+-------+

如果变量的值为“PARTIAL_JSON”,请运行以下命令取消设置它

mysql> set @@global.binlog_row_value_options="" ;

为 SynchDB 设置 SQLServer

在 SQLServer 数据库上启用 CDC

在为表启用 CDC 之前,必须先为 SQL Server 数据库启用它。SQLServer 管理员通过运行系统存储过程来启用 CDC。可以使用 SQL Server Management Studio 或 Transact-SQL 来运行系统存储过程。

USE MyDB
GO
EXEC sys.sp_cdc_enable_db
GO

在 SQLServer 表上启用 CDC

SQLServer 管理员必须在您希望 SynchDB 捕获的源表上启用变更数据捕获。数据库必须已启用 CDC。要在表上启用 CDC,SQLServer 管理员需要为表运行存储过程“sys.sp_cdc_enable_table”。必须为要捕获的每个表启用 SQL Server CDC。

为 SynchDB 启用 3 个表customerdistricthistory 以进行捕获:

USE MyDB
GO
EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', @source_name = 'customer', @role_name = NULL, @supports_net_changes = 0;
EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', @source_name = 'district', @role_name = NULL, @supports_net_changes = 0;
EXEC sys.sp_cdc_enable_table @source_schema = 'dbo', @source_name = 'history', @role_name = NULL, @supports_net_changes = 0;
GO

验证用户对 CDC 表的权限

SQLServer 管理员可以运行系统存储过程来查询数据库或表以检索其 CDC 配置信息。

以下查询返回数据库中启用 CDC 的每个表的配置信息,其中包含调用者有权访问的更改数据。如果结果为空,请验证用户是否有权访问捕获实例和 CDC 表。

USE MyDB;
GO
EXEC sys.sp_cdc_help_change_data_capture
GO

当启用 CDC 时表架构发生更改

如果某个表已添加到 CDC 捕获列表并已被 SynchDB 捕获,则需要将 SQLServer 上此表发生的任何架构更改重新添加回 CDC 捕获列表,以向 SynchDB 生成正确的 DDL ALTER TABLE 事件。有关更多信息,请参阅 DDL 复制 页面。

为 SynchDB 设置 Oracle

以下示例基于容器数据库 FREE 和可插拔数据库 FREEPDB1:

为 Sys 用户设置密码

sqlplus / as sysdba
    Alter user sys identified by oracle;
Exit

配置日志挖掘器

sqlplus /nolog

    CONNECT sys/oracle as sysdba;
    alter system set db_recovery_file_dest_size = 10G;
    alter system set db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile;
    shutdown immediate;
    startup mount;
    alter database archivelog;
    alter database open;
    archive log list;
exit

创建 logminer 用户

sqlplus sys/oracle@//localhost:1521/FREE as sysdba

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
    ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
    exit;

sqlplus sys/oracle@//localhost:1521/FREE as sysdba

    CREATE TABLESPACE LOGMINER_TBS DATAFILE '/opt/oracle/oradata/FREE/logminer_tbs.dbf' SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
    exit;

sqlplus sys/oracle@//localhost:1521/FREEPDB1 as sysdba

    CREATE TABLESPACE LOGMINER_TBS DATAFILE '/opt/oracle/oradata/FREE/FREEPDB1/logminer_tbs.dbf' SIZE 25M REUSE AUTOEXTEND ON MAXSIZE UNLIMITED;
    exit;

sqlplus sys/oracle@//localhost:1521/FREE as sysdba

    CREATE USER c##dbzuser IDENTIFIED BY dbz DEFAULT TABLESPACE LOGMINER_TBS QUOTA UNLIMITED ON LOGMINER_TBS CONTAINER=ALL;

    GRANT CREATE SESSION TO c##dbzuser CONTAINER=ALL;
    GRANT SET CONTAINER TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ON V_$DATABASE TO c##dbzuser CONTAINER=ALL;
    GRANT FLASHBACK ANY TABLE TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ANY TABLE TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT_CATALOG_ROLE TO c##dbzuser CONTAINER=ALL;
    GRANT EXECUTE_CATALOG_ROLE TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ANY TRANSACTION TO c##dbzuser CONTAINER=ALL;
    GRANT LOGMINING TO c##dbzuser CONTAINER=ALL;

    GRANT SELECT ANY DICTIONARY TO c##dbzuser CONTAINER=ALL;

    GRANT CREATE TABLE TO c##dbzuser CONTAINER=ALL;
    GRANT LOCK ANY TABLE TO c##dbzuser CONTAINER=ALL;
    GRANT CREATE SEQUENCE TO c##dbzuser CONTAINER=ALL;

    GRANT EXECUTE ON DBMS_LOGMNR TO c##dbzuser CONTAINER=ALL;
    GRANT EXECUTE ON DBMS_LOGMNR_D TO c##dbzuser CONTAINER=ALL;

    GRANT SELECT ON V_$LOG TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ON V_$LOG_HISTORY TO c##dbzuser CONTAINER=ALL;

    GRANT SELECT ON V_$LOGMNR_LOGS TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ON V_$LOGMNR_CONTENTS TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ON V_$LOGMNR_PARAMETERS TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ON V_$LOGFILE TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ON V_$ARCHIVED_LOG TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ON V_$ARCHIVE_DEST_STATUS TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ON V_$TRANSACTION TO c##dbzuser CONTAINER=ALL; 
    GRANT SELECT ON V_$MYSTAT TO c##dbzuser CONTAINER=ALL;
    GRANT SELECT ON V_$STATNAME TO c##dbzuser CONTAINER=ALL; 

    GRANT EXECUTE ON DBMS_WORKLOAD_REPOSITORY TO C##DBZUSER;
    GRANT SELECT ON DBA_HIST_SNAPSHOT TO C##DBZUSER;
    GRANT EXECUTE ON DBMS_WORKLOAD_REPOSITORY TO PUBLIC;


    Exit

为指定捕获表启用补充日志数据

需要在每个被捕获的表运行此配置,以便正确处理 UPDATE 和 DELETE 操作。

ALTER TABLE customer ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
ALTER TABLE products ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
... etc

為 SynchDB 設定原生 Openlog Replicator 連接器

要求

  • Openlog Replicator 版本1.3.0 ~ 1.8.5(已驗證與 Debezium 2.7.x 相容)
  • 具有可供 OLR 存取的重做日誌的 Oracle 實例
  • 必須授予 OLR 額外的權限(見下文)
  • Openlog Replicator 必須已設定並正在執行
  • SynchDB 中已存在 Oracle 連接器(使用 synchdb_add_conninfo() 建立)
  • <<<重要>>> SynchDB 必須使用標誌 (WITH_OLR=1) 編譯和構建,才能支援原生 Openlog Replicator 連接器

請參閱此外部指南有關透過 Docker 部署 Openlog Replicator 的詳細信息,請參閱相關文件。

額外的 Oracle 權限

除了 Oracle 連接器所需的設定外,Openlog Replicator 還需要以下額外權限:

GRANT SELECT, FLASHBACK ON SYS.CCOL$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.CDEF$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.COL$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.DEFERRED_STG$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.ECOL$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.LOB$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.LOBCOMPPART$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.LOBFRAG$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.OBJ$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.TAB$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.TABCOMPART$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.TABPART$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.TABSUBPART$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.TS$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON SYS.USER$ TO DBZUSER;
GRANT SELECT, FLASHBACK ON XDB.XDB$TTSET TO DBZUSER;
GRANT FLASHBACK ANY TABLE TO DBZUSER;
GRANT SELECT ON SYS.V_$ARCHIVED_LOG TO DBZUSER;
GRANT SELECT ON SYS.V_$DATABASE TO DBZUSER;
GRANT SELECT ON SYS.V_$DATABASE_INCARNATION TO DBZUSER;
GRANT SELECT ON SYS.V_$LOG TO DBZUSER;
GRANT SELECT ON SYS.V_$LOGFILE TO DBZUSER;
GRANT SELECT ON SYS.V_$PARAMETER TO DBZUSER;
GRANT SELECT ON SYS.V_$STANDBY_LOG TO DBZUSER;
GRANT SELECT ON SYS.V_$TRANSPORTABLE_PLATFORM TO DBZUSER;
DECLARE
    CURSOR C1 IS SELECT TOKSUF FROM XDB.XDB$TTSET;
    CMD VARCHAR2(2000);
BEGIN
    FOR C IN C1 LOOP
        CMD := 'GRANT SELECT, FLASHBACK ON XDB.X$NM' || C.TOKSUF || ' TO DBZUSER';
        EXECUTE IMMEDIATE CMD;
        CMD := 'GRANT SELECT, FLASHBACK ON XDB.X$QN' || C.TOKSUF || ' TO DBZUSER';
        EXECUTE IMMEDIATE CMD;
        CMD := 'GRANT SELECT, FLASHBACK ON XDB.X$PT' || C.TOKSUF || ' TO DBZUSER';
        EXECUTE IMMEDIATE CMD;
    END LOOP;
END;

Openlog Replicator 設定範例

SynchDB 的 OLR 支援基於以下組態範例建置。

Version 1.3.0

{
  "version": "1.3.0",
  "source": [
    {
      "alias": "SOURCE",
      "name": "ORACLE",
      "reader": {
        "type": "online",
        "user": "DBZUSER",
        "password": "dbz",
        "server": "//ora19c:1521/FREE"
      },
      "format": {
        "type": "json",
        "column": 2,
        "db": 3,
        "interval-dts": 9,
        "interval-ytm": 4,
        "message": 2,
        "rid": 1,
        "schema": 7,
        "timestamp-all": 1,
        "scn-all": 1
      },
      "memory": {
        "min-mb": 64,
        "max-mb": 1024
      },
      "filter": {
        "table": [
          {"owner": "DBZUSER", "table": ".*"}
        ]
      },
      "flags": 32
    }
  ],
  "target": [
    {
      "alias": "SYNCHDB",
      "source": "SOURCE",
      "writer": {
        "type": "network",
        "uri": "0.0.0.0:7070"
      }
    }
  ]
}

Version 1.8.5

{
  "version": "1.8.5",
  "source": [
    {
      "alias": "SOURCE",
      "name": "ORACLE",
      "reader": {
        "type": "online",
        "user": "DBZUSER",
        "password": "dbz",
        "server": "//ora19c:1521/FREE"
      },
      "format": {
        "type": "json",
        "column": 2,
        "db": 3,
        "interval-dts": 9,
        "interval-ytm": 4,
        "message": 2,
        "rid": 1,
        "schema": 7,
        "timestamp-all": 1,
        "scn-type": 1
      },
      "memory": {
        "min-mb": 64,
        "max-mb": 1024,
        "swap-path": "/opt/OpenLogReplicator/olrswap"
      },
      "filter": {
        "table": [
          {"owner": "DBZUSER", "table": ".*"}
        ]
      },
      "flags": 32
    }
  ],
  "target": [
    {
      "alias": "DEBEZIUM",
      "source": "SOURCE",
      "writer": {
        "type": "network",
        "uri": "0.0.0.0:7070"
      }
    }
  ]
}

請注意以下事項:

  • "source".name": "ORACLE" -> 使用 synchdb_add_olr_conninfo() 定義 OLR 參數時,此項目應與 olr_source 值相符(請參閱下文)。
  • "source".reader".user" -> 使用 synchdb_add_conninfo() 建立連接器時,此項目應與 username 值相符。
  • "source".reader".password" -> 使用 synchdb_add_conninfo() 建立連接器時,此項目應與 password 值相符。
  • "source".reader".server" -> 使用 synchdb_add_conninfo() 建立連接器時,此項目應包含 hostnameportsource database 的值。
  • "source".filter".table":[] -> 此項目用於篩選 Openlog Replicator 擷取的變更事件。 <<<重要提示>>>:目前這是過濾來自 Oracle 的變更事件的唯一方法,因為 SynchDB 中的 OLR 實作目前不進行任何過濾。 (透過 synchdb_add_conninfo() 建立連接器時,tablesnapshot table 的值將被忽略。)
  • "format":{} -> Debezium 或原生 Openlog Replicator 連接器接收的特定有效負載格式。請按指定方式使用這些值。
  • "memory".swap-path" -> 這告訴 OLR 在記憶體不足的情況下將交換檔案寫入何處。
  • "target".[0].."writer"."type": -> 此項目必須指定“network”,因為 Debezium 和原生 Openlog Replicator 連接器都透過網路與 Openlog Replicator 通訊。
  • "target".[0].."writer"."uri": -> 這是 Openlog Replicator 監聽的綁定主機和端口,SynchDB 應該能夠在透過 synchdb_add_olr_conninfo() 定義 OLR 參數時,透過 olr_hostolrport 存取它們。

設定 SynchDB 的 Postgres 連接器

需要配置 PostgreSQL 伺服器,使其用作 SynchDB 的資料庫來源。

GUC 設定

wal_level = logical
max_wal_senders = << 可能需要根據您的需求進行調整 - 預設值為 10 >>
max_replication_slots = << 可能需要根據您的需求進行調整 - 預設值為 10 >>
wal_writer_delay = << 如果 `synchronous_commit` 的值不是 “on”,建議設定為 10ms。預設值為 200ms >>

權限設定

建立一個具有複製權限的新使用者:

CREATE ROLE <name> REPLICATION LOGIN;

SynchDB 從為 PostgreSQL 來源表建立的發布中取得來源表的變更事件流。發布包含從一個或多個表產生的經過篩選的變更事件集。每個發布中的數據都根據發布規範進行過濾。規格可以由 PostgreSQL 資料庫管理員或 Debezium 連接器建立。為了允許 SynchDB Postgres 連接器建立發布並指定要複製到其中的數據,連接器必須以資料庫中的特定權限運行。

有幾種方法可以確定如何建立發布。通常,最好在設定連接器之前,為要捕獲的表手動建立發布。但是,您可以設定環境,使 SynchDB 自動建立發布並指定要新增到其中的資料。

SynchDB 使用包含清單屬性(當使用 synchdb_add_conninfo 建立連接器時)來指定如何將資料插入到發布中。

要使 SynchDB 建立 PostgreSQL 發布,它必須以具有以下權限的使用者身分執行:

  • 資料庫中的複製權限,用於將表格新增至發布。
  • 資料庫的 CREATE 權限,用於新增發布。
  • 需要對錶擁有 SELECT 權限才能複製初始表資料。表所有者自動擁有對錶的 SELECT 權限。

若要將表格新增至發布中,使用者必須是該表格的擁有者。但由於來源表已存在,因此需要一種機制與原始所有者共享所有權。若要啟用共享所有權,您可以建立 PostgreSQL 複製群組,然後將現有表格擁有者和複製使用者新增至該群組。

步驟:

  • 建立複製組。
CREATE ROLE <replication_group>;
  • 將表格的原始擁有者新增至該群組。
GRANT REPLICATION_GROUP TO <original_owner>;
  • 將 Debezium 複製使用者新增至該群組。
GRANT REPLICATION_GROUP TO <replication_user>;
  • 將表格的所有權轉移給
ALTER TABLE <table_name> OWNER TO REPLICATION_GROUP;

pg_hba 設定

要使 Debezium 能夠複製 PostgreSQL 數據,您必須配置資料庫以允許與執行 PostgreSQL 連接器的主機進行複製。若要指定允許與資料庫複製的用戶端,請在 PostgreSQL 基於主機的驗證檔案 pg_hba.conf 新增條目。有關 pg_hba.conf 文件的更多信息,請參閱 PostgreSQL 文件

local replication <youruser> trust
host replication <youruser> 127.0.0.1/32 trust
host replication <youruser> ::1/128 trust

安裝 DDL 觸發器和自訂 LSN 視圖

若要將使用者表 DDL 邏輯複製到 SynchDB,您必須在來源 PostgreSQL 資料庫中安裝 DDL 觸發器。此外,您還需要建立自訂視圖,該視圖會傳回來源資料庫中的目前 LSN,以便 SynchDB 可以在快照過程中透過 FDW 檢索它。

SynchDB 原始碼庫包含一個用於設定的 SQL 腳本和一個用於清理的腳本。請確保在來源 PostgreSQL 資料庫中運行它們:

通过 psql 會話安裝 DDL 觸發器函數:

psql -U <user> -d <database> < postgres-connector-src-ddl-setup.sql

通过 psql 會話清理 DDL 觸發器函數:

psql -U <user> -d <database> < postgres-connector-src-ddl-teardown.sql

如果您不需要 DDL 複製,則無需在來源資料庫安裝此 DDL 觸發器函數。但是,如果您想要對來源資料庫(目前表格 + 資料)進行目前快照,則需要目前 LSN 視圖。您無需載入上述 SQL 腳本,即可將其新增至來源資料庫。請確保此視圖是在 public 模式下建立的。

CREATE VIEW synchdb_wal_lsn AS SELECT pg_current_wal_lsn()::pg_lsn AS wal_lsn;