MySQL數(shù)據(jù)庫如何克隆(帶腳本)
1、捐贈者和接受者
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
2、創(chuàng)建用戶及授權(quán)
捐贈者:
- 創(chuàng)建克隆所需用戶:
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 才有的備份鎖的權(quán)限
接受者:
- 創(chuàng)建執(zhí)行克隆權(quán)限的用戶:
CREATE USER clone_user@'192.168.1.%' IDENTIFIED by 'clone_user'; GRANT CLONE_ADMIN ON *.* TO 'clone_user'@'192.168.1.%';
CLONE_ADMIN權(quán)限 = BACKUP_ADMIN權(quán)限 + SHUTDOWN權(quán)限。
SHUTDOWN權(quán)限允許用戶shutdown和restart mysqld。
授權(quán)不同是因為,接受者需要restart mysqld。
3、接受者設(shè)置捐贈者列表清單
SET GLOBAL clone_valid_donor_list = '192.168.1.11:3306';
4、接受者執(zhí)行
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、查看進(jìn)度
SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
6、在接受者查詢捐贈款的日志信息
SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
7、查詢進(jìn)度的另一條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、 修改主從關(guān)系
CHANGE MASTER TO MASTER_HOST='10.0.14.141', MASTER_PORT=61106 ,MASTER_USER='repl',MASTER_PASSWORD='xxxxxxxx',MASTER_AUTO_POSITION = 1;
9、clone腳本
有一步重新初始化的操作,記得修改對應(yīng)的目錄
#!/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
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL中使用case when 語句實現(xiàn)多條件查詢的方法
今天在一個應(yīng)用中使用到了一個比較特殊的數(shù)據(jù)查詢要求。需要的朋友可以參考下。2010-12-12Mysql分組查詢每組最新的一條數(shù)據(jù)的五種實現(xiàn)過程
本文介紹了五種在MySQL中獲取每個分組最新一條數(shù)據(jù)的方法,包括子查詢和JOIN、窗口函數(shù)、變量、聚合函數(shù)和子查詢以及使用DISTINCT關(guān)鍵字,推薦使用子查詢和JOIN操作或窗口函數(shù),避免使用變量2024-11-11解決windows下mysql8修改my.ini設(shè)置datadir后無法啟動問題
在修改MySQL的my.ini文件以更改數(shù)據(jù)目錄后,可能會遇到無法啟動的問題,這通常是因為字符編碼被改變或新路徑權(quán)限不足,正確的做法是備份my.ini文件,確保使用ANSI字符編碼修改datadir,并確保新路徑有足夠的權(quán)限,特別是SYSTEM或NETWORKSERVICE權(quán)限2025-01-01MySQL聯(lián)合查詢之輕松實現(xiàn)數(shù)據(jù)關(guān)聯(lián)詳解
MySQL中當(dāng)查詢數(shù)據(jù)來自多張表時需要用到關(guān)聯(lián)查詢,下面這篇文章主要給大家介紹了關(guān)于MySQL聯(lián)合查詢之輕松實現(xiàn)數(shù)據(jù)關(guān)聯(lián)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06MySQL數(shù)據(jù)庫學(xué)習(xí)之排序與單行處理函數(shù)詳解
這篇文章主要為大家詳細(xì)介紹一下MySQL數(shù)據(jù)庫中排序與單行處理函數(shù)的使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)MySQL有一定幫助,需要的可以參考一下2022-07-07