2021年2月15日 星期一

Mysql8 主從複製(Windows)

 一、安裝完注意事項

mysql 安裝完後,執行打 services.msc


在紅框按右鍵內容,綠框的路徑有 my.ini,有改過想生效要按紅框右鍵的重新啟動,我的路徑如下:

"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" MySQL80

注意 ProgramData 是隱藏資料夾,注意 [mysqld] 裡的 server-id 預設是 1,主和從必需不一樣

主還要在 [mysqld] 增加 binlog-do-db=bruce_test,bruce_test 為想複製的資料庫名稱,複製時是從當下複製,之前有的不會複製

如果有多個資料庫要複製,要寫多個 k=v,不是加逗號


二、網路

我使用 Oracle VM VirtualBox,必需先 ping 通

網路可以使用橋接介面卡或 NAT,兩個都是主機可上網就可以上網,但使用 NAT 時,虛擬機之間不能連線;而橋接都可以

關防火牆或開 port 使機器可以 ping 通


三、讓從機連主機

※主

SELECT * FROM mysql.user; 

可以看到所有使用者和權限

host 欄位:表示什麼 IP 可以連到 mysql server,預設是 localhost,將想給別人用的帳號(主)的 host 內容改成從的 IP,或者用 %,表示任何 IP 都可以連

plugin 欄位:預設是 caching_sha2_password,改成 mysql_native_password 才能被連



也可以新增使用者,這個使用者是要給從的 mysql 連的帳號

CREATE USER '帳號'@'%' IDENTIFIED BY '密碼';

ALTER USER '帳號'@'%' IDENTIFIED BY '密碼';

GRANT REPLICATION SLAVE ON *.* TO '帳號'@'%';

ALTER USER 'aaa'@'%' IDENTIFIED WITH mysql_native_password BY 'aaa';


update mysql.user set host='%' where user='root'; //aaa

show variables like '%safe_updates%';

SET SQL_SAFE_UPDATES=0;  // 預設安全性是開的(1),所以不能下修改的語法

FLUSH PRIVILEGES; // 改完後要重整

show master status; // 每次 flush privileges 後會不一樣


從機會用到 File 和 Position 欄位,Binlog_Do_DB 是要複製的資料庫、Binlog_Ignore_DB 是要忽略的資料庫


※從

從機打指令要下如下的語法才能連

mysql -uroot -p -h192.168.1.104 -P3306 --default-auth=mysql_native_password

mysql 指令在安裝目錄底下的 bin,也可增加環境變數

我的在 C:\Program Files\MySQL\MySQL Server 8.0\bin

有些語法在這一版還能用,但已經 deprecated 了,下面的語法,有註解的是 deprecated

// stop slave;
stop replica;


// change master to master_host='192.168.1.104',master_port=3306,master_user='bbb',master_password='bbb',master_log_file='BRUCE-HOME-bin.000015',master_log_pos=2357;

// 用 SOURCE_USER 和 SOURCE_PASSWORD 會有警告
CHANGE REPLICATION SOURCE to SOURCE_HOST='192.168.1.104',SOURCE_PORT=3306,SOURCE_USER='bbb',SOURCE_PASSWORD='bbb',SOURCE_LOG_FILE='BRUCE-HOME-bin.000015',SOURCE_LOG_POS=2357;

CHANGE REPLICATION SOURCE to SOURCE_HOST='192.168.1.104',SOURCE_PORT=3306,SOURCE_LOG_FILE='主的 FIle',SOURCE_LOG_POS=主的 Position;

// start slave;
start replica USER='bbb' PASSWORD='bbb';

show slave status; // 命令提示字元最後加個 \G,會比較好看
Slave_IO_Running 和 Slave_SQL_Running 為 Yes 就正確了
Slave_SQL_Running 為 No,通常都是 SOURCE_LOG_FILE、SOURCE_LOG_POS 不正確,要對應主的設定
Slave_IO_Running 為 Connecting 通常都是連線不正確,密碼錯誤、網路問題,還有主的一定要改成 mysql_native_password

如果有錯 last_sql_error、last_io_error 可以看到錯誤訊息
有錯要改必需先 stop replica --> 修改 --> start replica


主從複製在主機新增資料庫、表並 insert,從機也能看到就正確了,而在從機做的只有在從機能看到

沒有留言:

張貼留言