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

Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触

原创 曹海峰 2025-03-04
381

前言

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

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

执行下脚本

root@ogg-mysql04 mysqlrouter]# /ogg/oraInventory/orainstRoot.sh

更改权限/ogg/oraInventory.

添加组的读取和写入权限。

删除全局的读取, 写入和执行权限。

更改组名/ogg/oraInventory 到 oinstall.

脚本的执行已完成。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

部署OGG

使用oggca来部署OGG微服务

/ogg/oggma/bin/oggca.sh

图形用户界面, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面

AI 生成的内容可能不正确。

图形用户界面

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

配置OGG

配置数据库连接

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 应用程序, 电子邮件

AI 生成的内容可能不正确。

添加trandata

Oracle需要添加trandata,MySQL不用该步骤

选择需要抽取数据库前面的箭头,点击登录

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

添加checkpointtable

checkpointtable无论是oracle还是MySQL都要添加。

点击目标端的连接

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

配置MySQL到oracle的同步

添加抽取

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

使用工具生成了10000条记录。这里用的是百灵(SQLark)生成的,速度很快。现在还免费注册,推荐大家使用。

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

可以看到捕捉到了这10000条记录。

添加分发路径

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

添加复制

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

复制创建完成。

图形用户界面, 应用程序, Word

AI 生成的内容可能不正确。

复制完成后,可以看到写入了10000条记录。

配置Oracle到MySQL同步

添加抽取

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

添加分发路径

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

添加复制

图形用户界面, 文本, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 应用程序

AI 生成的内容可能不正确。

图形用户界面, 文本, 应用程序, 电子邮件

AI 生成的内容可能不正确。

图形用户界面, 应用程序, Word

AI 生成的内容可能不正确。

到这配置都完成了,初始化数据有时间再写。

参数文件

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.*;
最后修改时间:2025-03-05 09:40:49
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论