前言
OGG 23ai已经发布一段时间了,正好2025年春节23.7发布,趁此机会把23.7相关的实验做了一遍,我慢慢把文档发上来。
先说说几个变化。从OGG 23ai开始,操作系统使用红帽8以上系统了,另外传统模式已经成为历史,23ai就只有微服务架构了。
很多人也写过关于使用MySQL上使用OGG的文章,但是他们都以单机为主,我写的是基于MySQL InnoDB Cluster,也适用于MGR架构。
环境规划
本文采用5台虚拟机,其中一台安装Oracle 19.26和 OGG for Oracle 23.7.0.25.01,三个机器安装MySQL 8.4.4,一台机器安装MySQL Router和OGG for MySQL 23.7.0.25.01。采用MySQL Router是在MySQL切换主备之后,不用修改OGG里MySQL数据库的IP地址。
主机名 | IP | 操作系统 | 数据库版本 | OGG版本 |
ogg-mysql00 | 172.16.1.7 | Oracle Linux 8.10 | oracle 19.26 | OGG for Oracle 23.7.0.25.01 |
ogg-mysql01 | 172.16.1.8 | Oracle Linux 8.10 | MySQL 8.4.4 |
|
ogg-mysql02 | 172.16.1.9 | Oracle Linux 8.10 | MySQL 8.4.4 |
|
ogg-mysql03 | 172.16.1.10 | Oracle Linux 8.10 | MySQL 8.4.4 |
|
ogg-mysql04 | 172.16.1.11 | Oracle Linux 8.10 |
| OGG for MySQL 23.7.0.25.01 |
Oracle 19.26采用多租户特性,建了两个PDB,pdb1和pdb2;MySQL建了两个数据库test1、test2和ogg。从Oracle到MySQL复制的时候,pdb1作为源头,test2作为目标。从MySQL往Oracle复制的时候,test1作为与源头,pdb2作为目标。ogg数据源用于存放ogg数据。
配置Oracle数据库
ogg-mysql00上安装数据库oracle 19.26,安装过程这里就省略了。
修改数据库为归档模式
SHUTDOWN immediate
STARTUP mount
ALTER SYSTEM SET log_archive_dest_1 = 'location=/arch';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
如果数据库已经是归档模式,这一步可以省略。
设置force logging
ALTER DATABASE FORCE LOGGING;
CDB添加附加日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
PDB添加附加日志
登录到pdb1,添加附加日志
Alter session set container=pdb1;
ALTER PLUGGABLE DATABASE ADD SUPPLEMENTAL LOG DATA;
数据库开启OGG支持
ALTER SYSTEM SET enable_goldengate_replication = TRUE;
创建OGG用户
先创建OGG表空间
CREATE TABLESPACE OGG
DATAFILE
SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
需要在每个PDB都创建表空间
在CDB创建OGG用户
CREATE USER c##ogg IDENTIFIED BY ******
DEFAULT TABLESPACE ogg;
给OGG用户授权
EXEC dbms_goldengate_auth.grant_admin_privilege('C##OGG',container=>'all');
EXEC dbms_goldengate_auth.grant_admin_privilege('C##OGG','*', grant_optional_privileges=>'*',container=>'all');
GRANT DBA TO c##ogg container=all;
如果归档存放在ASM中,还需要以下授权:
GRANT SELECT ON SYSTEM.logmnr_session$ TO c##ogg;
创建测试用户
在PDB1和PDB2中分别创建test用户
创建test表空间
CREATE TABLESPACE TEST
DATAFILE
SIZE 100M AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
LOGGING
ONLINE
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
创建用户
CREATE USER test IDENTIFIED BY ****** DEFAULT TABLESPACE test;
给test用户授权
GRANT CONNECT, RESOURCE, UNLIMITED TABLESPACE TO test;
GRANT UNLIMITED TABLESPACE TO test;
创建测试表
在PDB1和PDB2的test用户下面创建测试表
CREATE TABLE "TEST"."T1"
( "ID" NUMBER NOT NULL ENABLE,
"NAME" VARCHAR2(255),
"ADDRESS" VARCHAR2(255),
"AGE" NUMBER,
"BIRTHDAY" DATE,
PRIMARY KEY ("ID")
TABLESPACE "TEST";
配置TNS
给CDB和每个PDB创建TNS
CDB=
( DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST=ogg-mysql00)
(PORT=1521)
)
(CONNECT_DATA=
(SERVICE_NAME=ogg)
)
)
PDB1=
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST= ogg-mysql00)
(PORT=1521)
)
(CONNECT_DATA=
(SERVICE_NAME=pdb1)
)
)
PDB2=
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCP)
(HOST= ogg-mysql00)
(PORT=1521)
)
(CONNECT_DATA=
(SERVICE_NAME=pdb2)
)
)
创建OGG安装目录
创建OGG的安装目录,将可执行文件和部署目录分开
mkdir -p /ogg/oggma
mkdir -p /ogg/ogginst
chown -R oracle: /ogg
配置MySQL InnoDB Cluster
安装MySQL
ogg-mysql01,ogg-myslq02,ogg-mysql03上分别安装MySQL 8.4.4。为了方便以下机器成为节点一、节点二、节点三。
禁用SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
禁用防火墙
systemctl disable firewalld
systemctl stop firewalld
安装MySQL源
rpm -ivh https://dev.mysql.com/get/mysql84-community-release-el8-1.noarch.rpm
禁用DNF MySQL模块
dnf module -y disable mysql
安装MySQL
dnf install mysql-community-server -y
配置MySQL
编辑my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
lower_case_table_names = 1
[client]
socket=/data/mysql/mysql.sock
[mysql]
socket=/data/mysql/mysql.sock
启动MySQL,在三台MySQL服务器执行
systemctl start mysqld
查看/var/log/mysqld.log,查看系统生产的默认MySQL密码,然后使用它登录控制台
mysql -uroot -p
输入刚才查到的密码
修改密码并开启远程登录
ALTER USER 'root'@'localhost' IDENTIFIED BY 'AAAAbbbb123#';
set global validate_password.policy=0;
set global validate_password.length=1;
ALTER USER 'root'@'localhost' IDENTIFIED BY '******';
create user 'root'@'%' identified by '******';
grant all privileges on *.* to 'root'@'%' with grant option;
flush privileges;
为了创建集群,可以提前把复制用户和集群用户建好
SET SQL_LOG_BIN=0;
SET GLOBAL validate_password.policy=0;
SET GLOBAL validate_password.length=1;
CREATE USER repl@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
SET SQL_LOG_BIN=0;
set global validate_password.policy=0;
set global validate_password.length=1;
CREATE USER IF NOT EXISTS `icadmin`@`%` IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
GRANT SELECT,RELOAD,SHUTDOWN,PROCESS,FILE,SUPER,EXECUTE,REPLICATION SLAVE,REPLICATION CLIENT,CREATE USER ON *.* TO `icadmin`@`%` WITH GRANT OPTION;
GRANT BACKUP_ADMIN,CLONE_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,SYSTEM_VARIABLES_ADMIN ON *.* TO `icadmin`@`%` WITH GRANT OPTION;
GRANT INSERT,UPDATE,DELETE ON `mysql`.* TO `icadmin`@`%` WITH GRANT OPTION;
GRANT INSERT,UPDATE,DELETE,CREATE,DROP,REFERENCES,INDEX,ALTER,CREATE TEMPORARY TABLES,LOCK TABLES,EXECUTE,CREATE VIEW,SHOW VIEW,CREATE ROUTINE,ALTER ROUTINE,EVENT,TRIGGER ON `mysql_innodb_cluster_metadata`.* TO `icadmin`@`%` WITH GRANT OPTION;
GRANT INSERT,UPDATE,DELETE,CREATE,DROP,REFERENCES,INDEX,ALTER,CREATE TEMPORARY TABLES,LOCK TABLES,EXECUTE,CREATE VIEW,SHOW VIEW,CREATE ROUTINE,ALTER ROUTINE,EVENT,TRIGGER ON `mysql_innodb_cluster_metadata_bkp`.* TO `icadmin`@`%` WITH GRANT OPTION;
GRANT INSERT,UPDATE,DELETE,CREATE,DROP,REFERENCES,INDEX,ALTER,CREATE TEMPORARY TABLES,LOCK TABLES,EXECUTE,CREATE VIEW,SHOW VIEW,CREATE ROUTINE,ALTER ROUTINE,EVENT,TRIGGER ON `mysql_innodb_cluster_metadata_previous`.* TO `icadmin`@`%` WITH GRANT OPTION;
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
配置MGR
OGG支持从MGR抽取数据,但是只支持单主的架构,不支持多主架构,因此这里配置的就是单主模式。
登录MySQL服务器,安装组复制插件。以下操作需要在所有MySQL服务器上执行
mysql -uroot -p
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
show plugins;
关闭MySQL
systemctl stop mysqld
节点一编辑my.cnf [mysqld]部分加入以下参数
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
binlog_format=ROW
server-id=1
transaction_isolation = READ-COMMITTED
log_replica_updates=1
binlog_checksum=NONE
relay_log = ogg-mysql01-relay-bin
relay-log-index = ogg-mysql01-relay-index
group_replication_group_name = "189e8e7a-05bc-467c-8884-78b07d637a6d"
group_replication_ip_allowlist = "127.0.0.1/8,172.16.0.0/16"
group_replication_start_on_boot = OFF
group_replication_local_address = "172.16.1.8:33081"
group_replication_group_seeds = "172.16.1.8:33081,172.16.1.9:33081,172.16.1.10:33081"
group_replication_bootstrap_group = OFF
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
节点二编辑my.cnf加入以下内容:
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
binlog_format=ROW
server-id=2
transaction_isolation = READ-COMMITTED
log_replica_updates=1
binlog_checksum=NONE
relay_log = ogg-mysql02-relay-bin
relay-log-index = ogg-mysql02-relay-index
group_replication_group_name = "189e8e7a-05bc-467c-8884-78b07d637a6d"
group_replication_ip_allowlist = "127.0.0.1/8,172.16.0.0/16"
group_replication_start_on_boot = OFF
group_replication_local_address = "172.16.1.9:33081"
group_replication_group_seeds = "172.16.1.8:33081,172.16.1.9:33081,172.16.1.10:33081"
group_replication_bootstrap_group = OFF
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY
节点三编辑my.cnf加入以下内容:
gtid_mode=ON
enforce_gtid_consistency=ON
log_bin=binlog
binlog_format=ROW
server-id=3
transaction_isolation = READ-COMMITTED
log_replica_updates=1
binlog_checksum=NONE
relay_log = ogg-mysql03-relay-bin
relay-log-index = ogg-mysql03-relay-index
group_replication_group_name = "189e8e7a-05bc-467c-8884-78b07d637a6d"
group_replication_ip_allowlist = "127.0.0.1/8,172.16.0.0/16"
group_replication_start_on_boot = OFF
group_replication_local_address = "172.16.1.10:33081"
group_replication_group_seeds = "172.16.1.8:33081,172.16.1.9:33081,172.16.1.10:33081"
group_replication_bootstrap_group = OFF
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
参数根据实际情况修改即可。
log_replica_updates这个参数非常重要,启用该参数,任意节点成为主的时候,ogg都可以抽取到数据。OGG23ai之前版本官方文档说ogg支持MGR,但是没有提到该参数,搭建完之后我发现主库发生切换就抽取不到数据,后来研究之后加上该参数就好了。如今OGG 23ai的文档已经明确说明该参数了。
在三个节点启动MySQL
systemctl start myslqd
登录节点一启用组复制
myslq -uroot -p
SET GLOBAL group_replication_bootstrap_group=ON;
set global group_replication_recovery_get_public_key=on;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
SELECT * FROM performance_schema.replication_group_members;
其他节点执行:
set global group_replication_recovery_get_public_key=on;
START GROUP_REPLICATION;
创建InnoDB Cluster
安装MySQL shell,这个在哪个节点安装都可以,这里是在节点一安装。
dnf install mysql-shell -y
登录MySQL shell
mysqlsh --uri icadmin@ogg-mysql01:3306
创建集群
var cluster = dba.createCluster('my', {adoptFromGR: true});
安装MySQL router
安装MySQL router,使用ogg连接可以实现透明切换,不用更改数据库IP。这里是将mysqlrouter和OGG for MySQL安装到同一台机器上。
dnf install mysql-router -y
生成元数据
mysqlrouter --bootstrap root@ogg-mysql01:3306 --conf-use-sockets --user=mysqlrouter --conf-bind-address=ogg-mysql04 --directory /etc/mysqlrouter
执行完之后,从日志看,读写端口是6446,只读端口是6447。我们连接MySQL就用6446。
启动MySQL router
systemctl start mysqlrouter
然后就可以登录MySQL了
myslq -uroot -h 172.16.1.11 -p
创建数据库
这里创建三个数据库
CREATE DATABASE `test1` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_zh_0900_as_cs';
CREATE DATABASE `test2` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_zh_0900_as_cs';
CREATE DATABASE `ogg` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_zh_0900_as_cs';
创建测试表
在test1和test2数据库都执行
CREATE TABLE `t1` (
`ID` int NOT NULL,
`NAME` varchar(255) NULL,
`ADDRESS` varchar(255) NULL,
`AGE` int NULL,
`BIRTHDAY` datetime NULL,
PRIMARY KEY (`ID`)
);
创建OGG用户
set global validate_password.policy=0;
set global validate_password.length=1;
create user 'ogg'@'%' identified by '123456';
grant all privileges on *.* to 'ogg'@'%' with grant option;
grant insert,update,delete,select on test1.* to ogg;
grant insert,update,delete,select on test2.* to ogg;
grant drop on test1.* to ogg;
grant drop on test2.* to ogg;
grant insert,update,delete,select on *.* to ogg;
flush privileges;
到此MySQL的配置已经完成,下一步就说OGG的具体配置。
安装OGG
OGG for Oracle和OGG for MySQL安装过程是一样的,这里就写一个,不再区分。
配置环境变量
修改oracle用户环境变量
cat>>~/.bash_profile<
export OGG_HOME=/ogg/oggma
export OGG_ETC_HOME=/ogg/ogginst/sm/etc
export OGG_VAR_HOME=/ogg/ogginst/sm/var
EOF
解压缩安装文件
unzip ggs_Linux_x64_MySQL_services_shiphome.zip
安装OGG
cd ggs_Linux_x64_MySQL_services_shiphome/Disk1/
./runInstaller
执行下脚本
root@ogg-mysql04 mysqlrouter]# /ogg/oraInventory/orainstRoot.sh
更改权限/ogg/oraInventory.
添加组的读取和写入权限。
删除全局的读取, 写入和执行权限。
更改组名/ogg/oraInventory 到 oinstall.
脚本的执行已完成。
部署OGG
使用oggca来部署OGG微服务
/ogg/oggma/bin/oggca.sh
配置OGG
配置数据库连接
添加trandata
Oracle需要添加trandata,MySQL不用该步骤
选择需要抽取数据库前面的箭头,点击登录
添加checkpointtable
checkpointtable无论是oracle还是MySQL都要添加。
点击目标端的连接
配置MySQL到oracle的同步
添加抽取
使用工具生成了10000条记录。这里用的是百灵(SQLark)生成的,速度很快。现在还免费注册,推荐大家使用。
可以看到捕捉到了这10000条记录。
添加分发路径
添加复制
复制创建完成。
复制完成后,可以看到写入了10000条记录。
配置Oracle到MySQL同步
添加抽取
添加分发路径
添加复制
到这配置都完成了,初始化数据有时间再写。
参数文件
E_ORCL
EXTRACT E_ORCL
USERIDALIAS oggcdb domain OracleGoldenGate
SETENV (NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8")
EXTTRAIL ORCL/lt
TRANLOGOPTIONS INTEGRATEDPARAMS(parallelism 2)
TABLEEXCLUDE pdb1.test.SYS_EXPORT_SCHEMA*;
--GETUPDATEBEFORES
NOCOMPRESSDELETES
NOCOMPRESSUPDATES
FETCHOPTIONS NOUSESNAPSHOT
FETCHOPTIONS FETCHPKUPDATECOLS
BR BROFF
TABLE pdb1.test.*;
ORCL
REPLICAT ORCL
USERIDALIAS oggtest2 DOMAIN OracleGoldenGate
MAP pdb1.test.*, TARGET test2.*;
E_MYSQL
EXTRACT E_MYSQL
SETENV (TZ="+08:00")
USERIDALIAS oggtest1, DOMAIN OracleGoldenGate
TRANLOGOPTIONS ALTLOGDEST REMOTE
EXTTRAIL MYSQL/lt
TABLE test1.*;
MYSQL
REPLICAT MYSQL
USERIDALIAS oggpdb2 DOMAIN OracleGoldenGate
MAP test1.*, TARGET pdb2.test.*;