数据库同步别再主从和备份迁移了,来试试克隆操作吧~

1. 数据库克隆概念介绍

在数据库MySQL 8.0(8.0.17+)版本中,引入了数据库的克隆功能,主要是借助clone-plugin实现的,是对数据页底层克隆;

克隆的数据是InnoDB存储引擎中的物理快照信息,包括schemas, tables, tablespaces, and data dictionary metadata;

在数据库中出现克隆功能,主要是为了满足目前云原生的技术应用场景,同时也是为了海量数据备份而诞生的;

在数据库中实现克隆功能应用有两种方式:

本地克隆(Local Cloning):

启动克隆操作的MySQL数据库服务器实例中的数据,将会克隆到同服务器或同节点上的一个目录里;

远程克隆(Remote Cloning):

默认情况下,远程克隆操作会删除接受者(recipient)数据目录中的数据,并将其替换为捐赠者(donor)的克隆数据;

也可以将数据克隆到接受者的其他目录中,以避免删除现有数据;(属于可选操作);

主要用于实现数据远程的快速热迁移操作,在迁移过程中,除了DDL操作情况,其他操作都不会出现阻塞情况;

还可以利用远程克隆技术,实现快速构建数据库的主从架构环境,实现主从数据信息快速复制同步;

2. 数据库克隆原理说明

在进行数据库克隆操作时,会经历几个重要的过程或步骤:

01 Page copy

在进行数据页复制操作时,会涉及到两个操作动作:

开启redo archiving功能,从当前点开始存储新增的redo_log,这样从当前位置点开始所有的增量修改都不会丢失;

同时上一步在page track的page被发送到目标端,确保当前位置点之前所有做的变更一定发送到目标端;

关于redo archiving实际上这是官方早就存在的功能,主要用于官方的企业级备份工具,clone利用了该特性来维持记录增量产生的redo

在开始克隆前会做一次checkpoint;

对于redo archiving功能应用,会开启一个后台线程log_archiver_thread()来做日志归档;

当有新的写入时(notify_about_advanced_write_lsn),也会通知线程去进行归档,当arch_log_sys处于活跃状态时

线程会控制日志写入以避免未归档的日志被覆盖(log_write_wait_on_archiver),注意如果log_write等待时间过长的话,archive任务会被中断掉;

02 Redo copy

停止redo archiving功能,所有归档的日志被发送到目标端,这些日志包含了从page copy阶段开始到现在的所有日志;

另外可能还需要记下当前的复制点,例如:最后一个事务提交时的binlog位置点或者gtid信息,在系统页中可以找到;

03 Done

目标端重启实例,通过crash recovery将redo log应用上去;

克隆原理过程分析参考链接:https://zhuanlan.zhihu.com/p/437760913

说明:整个克隆过程都会以事件信息记录,可以很清晰的看到克隆的流程,如果克隆过程中断,也会以追加方式进行继续克隆;

在进行克隆功能应用时,也是存在一些限制性操作的:(结合官方列出的限制)

对于MySQL 8.0.27之前版本,在进行克隆操作期间,是不允许在捐赠者和接受者上进行DDL操作,包括:truncate table操作;

对于MySQL 8.0.27之后版本,在捐赠者上默认允许并发DDL操作,对于捐赠者上并发DDL的支持由clone_block_DDL变量控制;

对于不同版本的MySQL数据库实例之间,是不能进行克隆操作的。对于捐赠者和接受者必须是确切相同数据库服务版本;

例如:你不能克隆数据在between MySQL 5.7 and MySQL 8.0. or between MySQL 8.0.19 and MySQL 8.0.20;

这个克隆功能只支持在数据库8.0.17版本或之后的版本

参考官方链接说明:https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-limitations.html

3. 数据库克隆功能实践

实现本地克隆操作过程:

克隆需求:实现快速创建和源数据库服务一模一样的多实例服务程序;

克隆操作步骤01:加载克隆插件信息

# 进行克隆插件加载配置

mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';

或者

[mysqld]

plugin-load-add=mysql_clone.so

clone=FORCE_PLUS_PERMANENT

# 查看克隆插件加载情况

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';

+------------------+----------------------+

| PLUGIN_NAME | PLUGIN_STATUS |

+------------------+----------------------+

| clone | ACTIVE |

+------------------+----------------------+

1 row in set (0.00 sec)

克隆操作步骤02:创建克隆专用用户

mysql> create user clone_user@'%' identified by 'password';

mysql> grant backup_admin on *.* to 'clone_user';

-- backup_admin权限是mysql 8.0才有的备份锁的权限;

克隆操作步骤03:进行本地克隆操作

[root@xiaoQ-01 ~]# mkdir -p /data/test

[root@xiaoQ-01 ~]# chown -R mysql.mysql /data/

[root@xiaoQ-01 ~]# mysql -uclone_user -ppassword

mysql> clone local data directory = '/data/test/clonedir';

-- 完成本地数据库目录的克隆操作

克隆操作步骤04:观测本地克隆状态

mysql> select stage,state,end_time from performance_schema.clone_progress;

+---------------+----------------+-----------------------------------+

| stage | state | end_time |

+---------------+----------------+-----------------------------------+

| DROP DATA | Completed | 2022-11-28 01:11:17.715901 |

| FILE COPY | Completed | 2022-11-28 01:11:17.752819 |

| PAGE COPY | Completed | 2022-11-28 01:11:17.756830 |

| REDO COPY | Completed | 2022-11-28 01:11:17.757802 |

| FILE SYNC | Completed | 2022-11-28 01:11:17.912679 |

| RESTART | Not Started | NULL |

| RECOVERY | Not Started | NULL |

+---------------+----------------+-----------------------------------+

7 rows in set (0.00 sec)

-- 当克隆数据量比较大的时候,可以使用此SQL语句进行克隆状态查看

克隆操作步骤05:实现克隆日志观测

mysql> set global log_error_verbosity=3;

[root@xiaoQ-01 ~]# tail -f db01.err

mysql> clone local data directory = '/data/test/clonedir'

克隆操作步骤06:启动运行克隆实例

[root@xiaoQ-01 ~]# mysqld_safe --datadir=/data/test/clonedir --port=3333 --socket=/tmp/mysql3333.sock --user=mysql --mysqlx=off &

[root@xiaoQ-01 ~]# netstat -lntup|grep 3333

tcp6 0 0 :::3333 :::* LISTEN 52674/mysqld

实现远程克隆操作过程:

在进行实现远程克隆操作步骤之前,可以利用虚拟软件再次克隆出一台新的数据库8.0版本的服务器主机;

克隆操作步骤01:克隆操作环境准备

# 在克隆接收者主机上清理数据库服务环境:

[root@xiaoQ-02 ~]# pkill mysqld

[root@xiaoQ-02 ~]# rm -rf /data/3306/data/*

[root@xiaoQ-02 ~]# rm -rf /data/3306/binlog/*

[root@xiaoQ-02 ~]# rm -rf /data/3306/logs/*

# 在克隆接收者主机上进行实例初始化操作:

[root@xiaoQ-02 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data

[root@xiaoQ-02 ~]# vim /etc/my.cnf

[mysqld]

server_id=2

-- 修改克隆接收者主机上的server_id的配置信息

# 在克隆接收者主机上进行实例的运行操作:

[root@xiaoQ-02 ~]# /etc/init.d/mysqld start

克隆操作步骤02:加载克隆插件信息

# 进行克隆插件加载配置

mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';

或者

[mysqld]

plugin-load-add=mysql_clone.so

clone=FORCE_PLUS_PERMANENT

-- 克隆插件信息需要在克隆主机的捐赠者和接受者上都进行安装

# 查看克隆插件加载情况

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';

+------------------+----------------------+

| PLUGIN_NAME | PLUGIN_STATUS |

+------------------+----------------------+

| clone | ACTIVE |

+------------------+----------------------+

1 row in set (0.00 sec)

-- 克隆插件信息需要在克隆主机的捐赠者和接受者上都进行安装后确认

克隆操作步骤03:创建克隆专用用户

# 在克隆捐赠者主机上进行授权(数据库01主机上设置)

mysql> create user test_jz@'%' identified by 'password';

mysql> grant backup_admin on *.* to test_jz@'%' ;

-- backup_admin权限是mysql 8.0才有的备份锁的权限;

# 在克隆接收者主机上进行授权(数据库02主机上设置)

mysql> create user test_js@'%' identified by 'password';

mysql> grant clone_admin on *.* to test_js@'%' ;

-- clone_admin权限是mysql 8.0才有的克隆同步数据的权限;

说明:可以在克隆捐赠者主机上和接收者主机上均创建两个用户信息,防止克隆同步数据后,接收者主机上不再含有接收用户信息;

克隆操作步骤04:进行远程克隆操作

# 在克隆接收者主机上进行设置

mysql> set global clone_valid_donor_list='192.168.30.101:3306';

-- 设置克隆同步数据的信任列表

# 在克隆接收者主机上进行克隆

[root@xiaoq-02 ~]# mysql -utest_js -ppassword -h192.168.30.102 -P3306

mysql> clone instance from test_jz@'192.168.30.101':3306 identified by 'password';

-- 在接收者主机上实现远程克隆操作

克隆操作步骤05:观测本地克隆状态

mysql> select stage,state,end_time from performance_schema.clone_progress;

+---------------+----------------+-----------------------------------+

| stage | state | end_time |

+---------------+----------------+-----------------------------------+

| DROP DATA | Completed | 2022-11-29 00:15:34.002378 |

| FILE COPY | Completed | 2022-11-29 00:15:35.218397 |

| PAGE COPY | Completed | 2022-11-29 00:15:35.225659 |

| REDO COPY | Completed | 2022-11-29 00:15:35.229777 |

| FILE SYNC | Completed | 2022-11-29 00:15:35.773431 |

| RESTART | Completed | 2022-11-29 00:15:39.189607 |

| RECOVERY | Completed | 2022-11-29 00:15:39.978301 |

+---------------+----------------+-----------------------------------+

7 rows in set (0.00 sec)

-- 当克隆数据量比较大的时候,可以使用此SQL语句进行克隆状态查看,在克隆接收者主机上进行查看

mysql> show databases;

-- 此时克隆接收者主机上查看到的数据信息,与克隆捐赠者主机上查看到的数据信息一致,即远程克隆操作完成

老男孩教育Linux运维云计算课程汇集了虚拟化、云计算、安全gongfang、Python开发、SRE等技术,课堂效率高、内容丰富全面,由浅入深,循序渐进,帮助学员稳扎稳打,夯实基础,在有限的时间内帮助学员高效提升,成为符合企业需求的技术型人才。

需要获取资料配套视频教程的小伙伴

评论区回复‘666’or后台丝我哦~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于 PostgreSQL 数据库迁移主从设置,可以使用以下步骤进行操作: 1. 数据库迁移: - 首先,确保目标服务器上已经安装了 PostgreSQL 数据库。 - 在源服务器上使用 `pg_dump` 命令导出数据库的结构和数据到一个 SQL 文件中: ``` pg_dump -U <用户名> -h <源服务器地址> -p <源服务器端口> -C -f <导出文件路径> <数据库名> ``` - 将导出的 SQL 文件拷贝到目标服务器上,可以使用 `scp` 命令进行拷贝: ``` scp <本地文件路径> <目标服务器用户名>@<目标服务器地址>:<目标服务器文件路径> ``` - 在目标服务器上创建一个新的空数据库(如果需要),然后使用 `psql` 命令导入 SQL 文件: ``` psql -U <用户名> -h <目标服务器地址> -p <目标服务器端口> -d <数据库名> -f <导入文件路径> ``` 2. 主从设置: - 首先,确保主服务器和从服务器上都已经安装了 PostgreSQL 数据库。 - 在主服务器上修改 `postgresql.conf` 配置文件,启用 WAL 归档和流复制: ``` wal_level = replica archive_mode = on archive_command = 'cp %p /path/to/archive/%f' max_wal_senders = 10 ``` - 在主服务器上修改 `pg_hba.conf` 配置文件,允许从服务器连接主服务器: ``` host replication <从服务器用户名> <从服务器地址>/32 md5 ``` - 在从服务器上创建一个空的目标数据库(如果需要)。 - 在从服务器上创建一个 `recovery.conf` 配置文件,指定从服务器作为备库,并配置连接主服务器的参数: ``` standby_mode = on primary_conninfo = 'host=<主服务器地址> port=<主服务器端口> user=<主服务器用户名> password=<主服务器密码>' restore_command = 'cp /path/to/archive/%f %p' ``` - 启动主服务器和从服务器上的 PostgreSQL 服务,从服务器会自动连接到主服务器并开始复制数据。 这些步骤可以帮助您进行 PostgreSQL 数据库迁移和设置主从复制。请根据您的实际情况进行相应的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值