MySQL数据库如何克隆(带脚本)

 更新时间:2024年03月29日 09:23:33   作者:ReadVersion  
这篇文章主要介绍了MySQL数据库如何克隆(带脚本)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1、捐赠者和接受者

INSTALL PLUGIN clone SONAME 'mysql_clone.so';

2、创建用户及授权

捐赠者:

  • 创建克隆所需用户:
CREATE USER `clone_user`@`192.168.1.%` IDENTIFIED by 'clone_user'; 
GRANT BACKUP_ADMIN ON *.* TO `clone_user`@`192.168.1.%`   # BACKUP_ADMIN是MySQL8.0 才有的备份锁的权限

接受者:

  • 创建执行克隆权限的用户:
CREATE USER clone_user@'192.168.1.%' IDENTIFIED by 'clone_user'; 
GRANT CLONE_ADMIN ON *.* TO 'clone_user'@'192.168.1.%'; 

CLONE_ADMIN权限 = BACKUP_ADMIN权限 + SHUTDOWN权限。

SHUTDOWN权限允许用户shutdown和restart mysqld。

授权不同是因为,接受者需要restart mysqld。

3、接受者设置捐赠者列表清单

SET GLOBAL clone_valid_donor_list = '192.168.1.11:3306';

4、接受者执行

CLONE INSTANCE FROM clone_user@'192.168.1.11':3306 IDENTIFIED BY 'clone_user';

注意:

ERROR 3870 (HY000): Clone Donor plugin validate_password is not active in Recipient.

https://dev.mysql.com/doc/refman/5.6/en/validate-password-installation.html

5、查看进度

SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;

6、在接受者查询捐赠款的日志信息

SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;

7、查询进度的另一条SQL

select 
stage,
state,
cast(begin_time as DATETIME) as "START TIME",
cast(end_time as DATETIME) as "FINISH TIME",
lpad(sys.format_time(power(10,12) * (unix_timestamp(end_time) - unix_timestamp(begin_time))), 10, ' ') as DURATION,
lpad(concat(format(round(estimate/1024/1024,0), 0), "MB"), 16, ' ') as "Estimate",
case when begin_time is NULL then LPAD('%0', 7, ' ')
when estimate > 0 then
lpad(concat(round(data*100/estimate, 0), "%"), 7, ' ')
when end_time is NULL then lpad('0%', 7, ' ')
else lpad('100%', 7, ' ')
end as "Done(%)"
from performance_schema.clone_progress;

8、 修改主从关系

CHANGE MASTER TO MASTER_HOST='10.0.14.141', MASTER_PORT=61106 ,MASTER_USER='repl',MASTER_PASSWORD='xxxxxxxx',MASTER_AUTO_POSITION = 1;

9、clone脚本

有一步重新初始化的操作,记得修改对应的目录

#!/usr/bin/env bash

CLONE_ADMIN_USER="clone_user@'192.168.x.%'"
CLONE_VALID_DONOR_LIST="192.168.x.x"
MYSQL_PORT=3306
ROOT_PASSWORD="123456"

# 仅支持GTID模式
# GTID_MODE=1
#删除旧文件
function  del_old_file() {
    systemctl stop mysqld && rm -rf /data/logs/* && rm -rf /data1/data* && rm -rf /data/data/binlog/* && rm -rf /data/data/relaylog/*
}

function start_mysqld() {
    systemctl start mysqld
    OLDPASSWORD=`grep 'temporary password' /data/logs//mysqld.log | awk '{printf $NF}'`
    SETPASSWDTXT="set global validate_password.policy='LOW';alter user root@localhost identified by '${ROOT_PASSWORD}';"
    mysql -h localhost -P${MYSQL_PORT} -uroot -p${OLDPASSWORD} -e "${SETPASSWDTXT}" --connect-expired-password
}

function install_plugin() {
    INSTALL_PLUGIN_SQL="INSTALL PLUGIN clone SONAME 'mysql_clone.so'"
    mysql -h localhost -P${MYSQL_PORT} -uroot -p${ROOT_PASSWORD} -e "${INSTALL_PLUGIN_SQL}" --connect-expired-password
}
function set_clone_user() {
    SET_CLONE_USER_SQL="set global validate_password.policy='LOW';CREATE USER IF NOT EXISTS ${CLONE_ADMIN_USER} IDENTIFIED by 'clone_user';GRANT BACKUP_ADMIN,CLONE_ADMIN ON *.* TO ${CLONE_ADMIN_USER};"
    mysql -h localhost -P${MYSQL_PORT} -uroot -p${ROOT_PASSWORD} -e "${SET_CLONE_USER_SQL}" --connect-expired-password
}

function begin_clone() {
    CLONE_SQL="SET GLOBAL clone_valid_donor_list = '${CLONE_VALID_DONOR_LIST}:${MYSQL_PORT}';CLONE INSTANCE FROM clone_user@'${CLONE_VALID_DONOR_LIST}':${MYSQL_PORT} IDENTIFIED BY 'clone_user';"
    mysql -h localhost -P${MYSQL_PORT} -uroot -p${ROOT_PASSWORD} -e "${CLONE_SQL}" --connect-expired-password && echo "CLONE ENDS ... "
}
function change_master() {
    CHANGE_MASTER_SQL="STOP SLAVE;CHANGE MASTER TO MASTER_HOST='${CLONE_VALID_DONOR_LIST}', MASTER_PORT=${MYSQL_PORT} ,MASTER_USER='repl',MASTER_PASSWORD='repl20150602',MASTER_AUTO_POSITION = 1;START SLAVE;"
    mysql -h localhost -P${MYSQL_PORT} -uroot -p${ROOT_PASSWORD} -e "${CHANGE_MASTER_SQL}" --connect-expired-password
}

function execute_all() {
    del_old_file
    start_mysqld
    install_plugin
    set_clone_user
    begin_clone
    change_master
}
function usage() {
    echo "mysql-clone {-h|-d|-s|-u|-c|-m|-a}"
    echo "del_old_file(-d)               -- stop mysqld and delete old mysql-datafiles"
    echo "start_mysqld(-s)               -- start mysqld and set newpassword"
    echo "install_plugin(-i)               -- install clone plgin"
    echo "set_clone_user(-u)             -- set clone user"
    echo "begin_clone(-c)                -- set clone donor and clone"
    echo "change_master(-m)                -- change master"
    echo "execute_all(-a)                -- execute all"
}

case "$1" in
    '-d')
        del_old_file
        ;;
    '-s')
        start_mysqld
        ;;
    '-i')
        install_plugin
        ;;
    '-u')
        set_clone_user
        ;;
    '-c')
        begin_clone
        ;;
    '-m')
        change_master
        ;;
    '-a')
        execute_all
        ;;
    *)
        usage
esac

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一文详解MySQL Binlog日志与主从复制

    一文详解MySQL Binlog日志与主从复制

    这篇文章主要介绍了一文详解MySQL Binlog日志与主从复制,Binlog是Binary log的缩写,即二进制日志,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • 详细介绍基于MySQL的搜索引擎MySQL-Fullltext

    详细介绍基于MySQL的搜索引擎MySQL-Fullltext

    这篇文章主要详细介绍基于MySQL的搜索引擎MySQL-Fullltext,需要用到C和C#以及JavaScript的知识,属于MySQL的高阶应用,需要的朋友可以参考下
    2015-04-04
  • MySQL判断空值的三种方法

    MySQL判断空值的三种方法

    在创建表时,可以指定的列是否可以不包含值,如果在一个列不包含值,则其称其为空值NULL,NULL一个特殊值,代表缺失的值或者不适用的情况,表示未知数据,本文给大家介绍了MySQL判断空值的三种方法,需要的朋友可以参考下
    2024-03-03
  • mysql类似oracle rownum写法实例详解

    mysql类似oracle rownum写法实例详解

    在本篇文章里小编给大家分享的是关于mysql类似oracle rownum写法以及相关实例内容,需要的朋友们可以学习下。
    2019-09-09
  • mysql-connector-java与mysql版本的对应关系说明

    mysql-connector-java与mysql版本的对应关系说明

    这篇文章主要介绍了mysql-connector-java与mysql版本的对应关系说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Mysql InnoDB和MyISAM区别原理解析

    Mysql InnoDB和MyISAM区别原理解析

    这篇文章主要介绍了Mysql InnoDB和MyISAM区别原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 详解Mysql双机热备和负载均衡的实现步骤

    详解Mysql双机热备和负载均衡的实现步骤

    MySQL数据库没有增量备份的机制,但它提供了一种主从备份的机制,就是把主数据库的所有的数据同时写到备份数据库中。这篇文章主要介绍了Mysql的双机热备和负载均衡,需要的朋友可以参考下
    2019-10-10
  • mysql实现定时备份的详细图文教程

    mysql实现定时备份的详细图文教程

    这篇文章主要给大家介绍了关于mysql实现定时备份的详细图文教程,我们都知道数据是无价,如果不对数据进行备份,相当是让数据在裸跑,一旦服务器出问题,只有哭的份了,需要的朋友可以参考下
    2023-07-07
  • Window环境下MySQL UDF提权

    Window环境下MySQL UDF提权

    本文章仅记录某次内网渗透过程中遇到的MySQL 采用UDF提权等方式进行获取权限,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2023-03-03
  • mysql socket文件作用详解

    mysql socket文件作用详解

    这篇文章主要介绍了mysql socket文件作用的相关资料,需要的朋友可以参考下
    2016-09-09

最新评论