原庫:*.*.101.73/74
系統環境: Suse 12.4
MySQL: 5.7.29
新庫:*.*.110.46/47
系統環境:CentOS7.7 64位
MySQL版本: 5.7.30
因業務側在*.*.101.73/74 mysql數據庫服務器上部署了java應用程序、Hadoop+Hbase數據庫等大數據環境,導致主機內存突然暴增告急,經雙方排查,發現數據庫進程本身才占用內存8.5%,大部分都是由應用緩存占用了內存。經與局方及業務側溝通,局方敦促業務側將數據庫服務器從73/74服務器遷移到*.*.110.46/47服務器上,我方負責實施數據庫的遷移操作。
本次遷移使用的MySQL自帶的備份工具mysqldump從原庫雙主(*.*.101.73/74)導出數據,通過nfs共享文件系統上傳到資源池新庫雙主(*.*.110.46/47)。
在資源池新庫分別將73、74數據庫的備份文件導入 46、47新庫,并啟動雙主復制進程:
mysql> change master to master_host=*.*.110.46,master_user=repl,master_password=xxxxxx,master_port=3306,master_auto_position=1;
結果報錯如下:
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log
從報錯信息來看,起初以為是執行復制的語句重復制賬號信息有誤,然后核對了repl賬號的口令是正確的,并查看了復制賬號repl的權限信息:
mysql>show grants for ‘repl’@’*.*.110.%’;
結果顯示沒有repl用戶的權限信息記錄。接著查看系統表user中數據信息,竟然沒有導入數據前創建的repl用戶記錄,哦,奇怪。
突然想到,由于我們備份的是原庫中所有表(--all-databases),導出的dump文件中包含有重新創建表結構的語句,所以馬上在資源池雙主庫新建復制賬號repl:
grant replication slave on *.* to repl@*.*.110.% identified by xxxxxx;
flush privileges;
然后重新執行復制語句并開啟復制進程依然報剛才的錯。然后就想到此次遷移是從Suse 12.4 MySQL-5.7.29 遷移到CentOS7.7 MySQL-5.7.30, 以為是版本不兼容。
接著將資源池46/47的MySQL版本降為 mysql 5.7.29。分別重新導入數據到新庫46/47上,導入數據庫的過程中46服務器導入正常,而發現47庫上通過source導入時非常的慢,每條執行返回10-30秒,當時沒有查具體原因,有可能是網絡卡頓吧。
最后查看原庫74/74的數據庫配置文件,返現沒有開啟GTID全局復制方式(說明,目前這邊項目MySQL數據庫幾乎都使用的基于GTID全局事務復制協議做的同步),而我執行的復制語句中有“master_auto_position=1”,原來新庫上執行的復制機制跟原庫不一致,這就是剛才開啟復制進程報錯的根本原因。
通過以上分析,我們得知,既然原庫使用的是binlog和pos做的同步,那么我們新庫也同樣按照這個方式來配置復制。其次由于剛才使用mysql內置工具導入數據時很緩慢,所以我們準備采用percona提供的xtrabackup 工具來做數據備份和恢復。
create user bkuser@localhost identified by xxxxxx;
grant reload,lock tables,replication client,process on *.* to bkuser@localhost;
flush privileges;
73服務器上:
innobackupex --defaults-file=/home/mysql/my_cnf/my.cnf --host=*.*.101.73 --user=bkuser --password=xxxxxx --port=3306 --socket=/app/gzyd/data/mysql/tmp/mysql.sock --no-timestamp /mysqlbackup/73_xtra_base_20200623
74服務器上:
innobackupex --defaults-file=/home/mysql/my_cnf/my.cnf --host=*.*.101.74 --user=bkuser --password=xxxxxx --port=3306 --socket=/app/gzyd/data/mysql/tmp/mysql.sock --no-timestamp /mysqlbackup/74_xtra_base_20200623
# 46/47庫上執行
mysql> flush table with read lock;
mysql> show master status;
注:記得記錄下master狀態信息,后面執行復制的時候要用到。
mysql> unlock table;
innobackupex --defaults-file=/home/mysql/my_cnf/my.cnf --use-memory=2G --apply-log /mysqlbackup/73_xtra_base_20200623
mysqladmin --login-path=myconn shutdown immediate
mv /data/mysql/data /data/mysql/data-bak20200624
mkdir /data/mysql/data
innobackupex --defaults-file=/home/mysql/my_cnf/my.cnf --copy-back /mysqlbackup/73_xtra_base_20200623
chown -R mysql.mysql /data/mysql/data
mysqld_safe --defaults-file=/home/mysql/my_cnf/my.cnf &
grant replication slave on *.* to repl@*.*.110.% identified by xxxxxx;
flush privileges;
2)配置46->47方向主從
登錄47服務器,執行復制語句:
stop slave;
change master to master_host=*.*.110.46,master_user=repl,master_password=xxxxxx,master_port=3306,master_log_file=bin.000001,master_log_pos=448;
start slave;
show slave statusG;
登錄46服務器,執行復制語句:
stop slave;
change master to master_host=*.*.110.47,master_user=repl,master_password=repQAv2wsx@gzydxk,master_port=3306,master_log_file=bin.000001,master_log_pos=1066;
start slave;
show slave statusG;
mysql> create database chg;
mysql> use chg;
mysql> create table t1(id int, name varchar(30));
mysql> insert into t1(id,name) values(1,zhangsan);
mysql> insert into t1(id,name) values(2,lisi);
然后到重復47上查看新插入的兩條數據是否同步過來:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| chg |
| mysql |
| performance_schema |
| smzrz |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> use chg;
mysql> show tables;
+---------------+
| Tables_in_chg |
+---------------+
| t1 |
+---------------+
1 row in set (0.00 sec)
mysql> select * from t1;
+------+----------+
| id | name |
+------+----------+
| 1 | zhangsan |
| 2 | lisi |
+------+----------+
2 rows in set (0.00 sec)
mysql> create database chg2;
mysql> use chg2;
mysql> create table t2(id int,name varchar(20));
mysql> insert into t2(id,name) values(1,derek);
mysql> insert into t2(id,name) values(2,john);
然后到重復47上查看新插入的兩條數據是否同步過來:
mysql> use chg2;
mysql> show tables;
+----------------+
| Tables_in_chg2 |
+----------------+
| t2 |
+----------------+
1 row in set (0.00 sec)
mysql> select * from t2;
+------+-------+
| id | name |
+------+-------+
| 1 | derek |
| 2 | john |
+------+-------+
MySQL數據庫類似的升級遷移操作注意事項:
①升級遷移操作前仔細檢查當前數據庫配置文件(my,cnf),關注關鍵性的參數配置。
②自此檢查數據庫的架構,如:具體使用哪種復制模式等。
③升級遷移變更前做好充分的數據測試。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130129.html
摘要:今天遇到了一個錯誤,翻譯一下就是堆棧溢出,很好奇就是一個簡單請求怎么會報這個錯誤,研究了一下,發現犯了一個很低級的錯誤,的參數錯誤了是未定義的變量,值為空,然后導致了這個問題,但是為什么,暫時還沒有搞明白,如果哪位對源代碼比較熟悉,知道是怎 今天遇到了一個錯誤, showImg(https://segmentfault.com/img/bVHYYa?w=1424&h=233);翻譯一下...
摘要:好啦,再次大功告成。由萬維網協會研制,它為用戶提供了對自己公開信息的更多的控制。支持的站點可以為瀏覽者聲明他們的隱私策略。果然在瀏覽器中打開設置隱私阻止永不,打開上述設置之后,跨域種瞬間成功。 前段時間開發了一個用戶登錄的模塊,需求很簡單,用戶輸入手機號和驗證碼,我們就會返回給用戶一套身份信息并保存在cookie里面。so easy,于是就有以下代碼: // 大致意思如下,并非真實模塊...
摘要:前者集成在中,后者主要是為微信用戶提供了另一種支付方式需要在微信的內置瀏覽器中打開頁面,再調起微信支付。步驟商戶后臺收到用戶支付單,調用微信支付統一下單接口。拿到所有參數后,就可以在頁面中發起微信支付的請求了。 微信支付,支持的支付方式比較多:有掃碼支付,刷卡支付,APP支付和公眾號支付。其中,APP和網站上最常用的就是APP支付和公眾號支付。前者集成在APP中,后者主要是為微信用戶提...
摘要:原文地址支付支付步驟為獲取支付寶的配置信息。將得到的數據請求支付寶客戶端進行支付。端將拼接好的字符串拿去請求支付寶客戶端即可調起支付寶進行支付。向支付寶申請新訂單,獲取支付。成功請求回來后,就可以向支付寶發出一次支付請求。 支付寶在所有支付方式中最好開發的了,因為文檔比較清晰,而且開發起來也比較簡單。因此,支付寶的坑是相對較少的。原文地址 APP支付 APP支付步驟為: 獲取支付寶的...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20