MySql主從配置實戰教程

Windows下MySql主從配置實戰教程

MySql的主從配置教程

主庫MySql的安裝
1、MySQL的下載
2、MySQL配置文件的編寫
3、初始化數據庫
4、安裝服務
5、啓動MySql
6、登錄MySQL,修改密碼
從庫1MySql的安裝
1、MySQL的下載
2、MySQL配置文件的編寫
3、初始化數據庫
4、安裝服務
5、啓動MySQL
6、重置密碼
從庫2MySql的安裝
1、MySQL的下載
2、MySQL配置文件的編寫
3、初始化數據庫
4、安裝服務
5、啓動MySQL
6、重置密碼
關聯主庫與從庫
在主機上面操作
1、在主庫(master)中創建一個用戶用戶與從庫同步的用戶名和密碼,並授權。
2、在從庫上操作

  • 爲什麼要做主從複製
  • 在業務複雜的系統中,有這麼一個情景,有一句sql語句需要鎖表,導致暫時不能使用讀的服務,那麼就很影響運行中的業務,使用主從複製,讓主庫負責寫,從庫負責讀,這樣,即使主庫出現了鎖表的情景,通過讀從庫也可以保證業務的正常運作。
  • 做數據的熱備
  • 架構的擴展。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能。
  • Mysql主從複製的原理
  • binlog,主庫中保存更新事件日誌的二進制文件。
    主從複製的基礎是主庫記錄數據庫的所有變更記錄到binlog。binlog是數據庫中保存配置中過期時間內所有修改數據庫結構或內容的一個文件。如果過期時間是10d的話,那麼就是最近10d的數據庫修改記錄。

mysql主從複製是一個異步的複製過程,主庫發送更新事件到從庫,從庫讀取更新記錄,並執行更新記錄,使得從庫的內容與主庫保持一致。

在主庫裏,只要有更新事件出現,就會被依次地寫入到binlog裏面,是之後從庫連接到主庫時,從主庫拉取過來進行復制操作的數據源。

  • binlog輸出線程
    每當有從庫連接到主庫的時候,主庫都會創建一個線程然後發送binlog內容到從庫。
    對於每一個即將發送給從庫的sql事件,binlog輸出線程會將其鎖住。一旦該事件被線程讀取完之後,該鎖會被釋放,即使在該事件完全發送到從庫的時候,該鎖也會被釋放。
    在從庫裏,當複製開始的時候,從庫就會創建兩個線程進行處理:

可以知道,對於每一個主從複製的連接,都有三個線程。擁有多個從庫的主庫爲每一個連接到主庫的從庫創建一個binlog輸出線程,每一個從庫都有它自己的I/O線程和SQL線程。

從庫通過創建兩個獨立的線程,使得在進行復制時,從庫的讀和寫進行了分離。因此,即使負責執行的線程運行較慢,負責讀取更新語句的線程並不會因此變得緩慢。比如說,如果從庫有一段時間沒運行了,當它在此啓動的時候,儘管它的SQL線程執行比較慢,它的I/O線程可以快速地從主庫裏讀取所有的binlog內容。這樣一來,即使從庫在SQL線程執行完所有讀取到的語句前停止運行了,I/O線程也至少完全讀取了所有的內容,並將其安全地備份在從庫本地的relay log,隨時準備在從庫下一次啓動的時候執行語句。

  • 從庫I/O線程
    當START SLAVE語句在從庫開始執行之後,從庫創建一個I/O線程,該線程連接到主庫並請求主庫發送binlog裏面的更新記錄到從庫上。
    從庫I/O線程讀取主庫的binlog輸出線程發送的更新並拷貝這些更新到本地文件,其中包括relay log文件。
  • 從庫的SQL線程
    從庫創建一個SQL線程,這個線程讀取從庫I/O線程寫到relay log的更新事件並執行。

主庫MySql的安裝

1、MySQL的下載

將下好的MySQL存放在D盤中,所有文件內容如下:
在這裏插入圖片描述

2、MySQL配置文件的編寫

在當前目錄下新建my.ini文件,內容如下

[client]
# 設置mysql客戶端默認字符集
default-character-set=utf8

[mysqld]
# master服務唯一標識
server-id=1

# master-bin是一個存放二進制log文件的路徑,我這裏指定了一個mysql當前安裝目錄的mysql-bin文件夾
# 開啓二進制日誌
log_bin=master-bin
log_bin-index=master-bin.index

# binlog-do-db=需要同步的數據庫名(多個數據庫重複設置即可)
binlog-do-db=skysso

# 動清理30天之前的log文件(可自由指定時間)
expire_logs_days=30

# 設置3307端口
port=3307
character_set_server=utf8

# 設置mysql的安裝目錄
basedir="D:/mysql-master/"
# 設置mysql數據庫的數據的存放目錄
datadir="D:/mysql-master/data/"

# 允許最大連接數
max_connections=100
# 服務端使用的字符集默認爲8比特編碼的latin1字符集
character-set-server=utf8
# 創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

3、初始化數據庫

(管理員權限)切換到bin目錄下:

D:\mysql-master\bin>mysqld --initialize --user=mysql --console
2019-04-12T07:29:19.960548Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-04-12T07:29:22.760708Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-04-12T07:29:23.446747Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-04-12T07:29:23.706762Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: b1d8cfad-5cf4-11e9-8de2-7845c41512c0.
2019-04-12T07:29:23.718763Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-04-12T07:29:23.751765Z 1 [Note] A temporary password is generated for root@localhost: .Yx79bCq.YCe

4、安裝服務

mysqld --install mysql-master --defaults-file=“D:\mysql-master\my.ini”

就是將mysql-master加入service服務中,以後啓動的時候只需要通過net start
mysql-master命令就行。同理,關閉服務的時候只要使用net stop mysql-master.

5、啓動MySql

net start mysql-master

6、登錄MySQL,修改密碼

mysql -uroot -p -P3307

set password for root@localhost = password('root');

從庫1MySql的安裝

1、MySQL的下載

2、MySQL配置文件的編寫

[client]
# 設置mysql客戶端默認字符集
default-character-set=utf8

[mysqld]
# 服務唯一標識
server-id=2

# master-bin是一個存放二進制log文件的路徑,我這裏指定了一個mysql當前安裝目錄的mysql-bin文件夾
# 開啓二進制日誌
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index

# 當slave從庫宕機後,假如relay-log損壞了,導致一部分中繼日誌沒有處理,
# 則自動放棄所有未執行的relay-log,並且重新從master上獲取日誌,這樣就保證了relay-log的完整性
relay_log_recovery=1

# 只讀模式(普通用戶)
read_only=1

# 只讀模式(超級管理員)
super_read_only=1

# binlog-do-db=需要同步的數據庫名(多個數據庫重複設置即可)
binlog-do-db=skysso

# 動清理30天之前的log文件(可自由指定時間)
expire_logs_days=30

# 設置3308端口
port=3308
character_set_server=utf8

# 設置mysql的安裝目錄
basedir="D:/mysql-slave/"
# 設置mysql數據庫的數據的存放目錄
datadir="D:/mysql-slave/data/"

# 允許最大連接數
max_connections=100
# 服務端使用的字符集默認爲8比特編碼的latin1字符集
character-set-server=utf8
# 創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

3、初始化數據庫

mysqld --initialize --user=mysql --console

2019-04-12T07:49:10.739657Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-04-12T07:49:13.819833Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-04-12T07:49:14.471870Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-04-12T07:49:14.703883Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 77bcae4a-5cf7-11e9-a628-7845c41512c0.
2019-04-12T07:49:14.715884Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-04-12T07:49:14.737885Z 1 [Note] A temporary password is generated for root@localhost: r29Pq!Ic1uZR

4、安裝服務

mysqld --install mysql-slave3308 --defaults-file="D:\mysql-slave\my.ini"

5、啓動MySQL

net start mysql-slave3308

6、重置密碼

mysql -uroot -p -P3308
set password for root@localhost=password('root');

從庫2MySql的安裝

1、MySQL的下載

2、MySQL配置文件的編寫

[client]
# 設置mysql客戶端默認字符集
default-character-set=utf8

[mysqld]
# 服務唯一標識
server-id=2

# master-bin是一個存放二進制log文件的路徑,我這裏指定了一個mysql當前安裝目錄的mysql-bin文件夾
# 開啓二進制日誌
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index

# 設置3308端口
port=3308
character_set_server=utf8

# 設置mysql的安裝目錄
basedir="D:/mysql-slave/"
# 設置mysql數據庫的數據的存放目錄
datadir="D:/mysql-slave/data/"

# 允許最大連接數
max_connections=100
# 服務端使用的字符集默認爲8比特編碼的latin1字符集
character-set-server=utf8
# 創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB

3、初始化數據庫

mysqld --initialize --user=mysql --console

2019-04-12T07:49:10.739657Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-04-12T07:49:13.819833Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-04-12T07:49:14.471870Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-04-12T07:49:14.703883Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 77bcae4a-5cf7-11e9-a628-7845c41512c0.
2019-04-12T07:49:14.715884Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-04-12T07:49:14.737885Z 1 [Note] A temporary password is generated for root@localhost: r29Pq!Ic1uZR

4、安裝服務

mysqld --install mysql-slave3308 --defaults-file="D:\mysql-slave\my.ini"

5、啓動MySQL

net start mysql-slave3308

6、重置密碼

mysql -uroot -p -P3308
set password for root@localhost=password('root');

關聯主庫與從庫

在主機上面操作

1、在主庫(master)中創建一個用戶用戶與從庫同步的用戶名和密碼,並授權。

# 創建有複製權限的賬號
GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'backdb'@'%' IDENTIFIED BY 'root';
 # 查看主庫狀態(記錄File、Position、Binlog_Do_DB的值) 
show master status;
# 查看big-log日誌是否開啓成功
show variables like '%log_bin%';

2、在從庫上操作

# 查看從庫狀態(Slave_IO_State、Slave_IO_Runing、Slave_SQL_Runing這三個參數很重要)
show SLAVE STATUS;

# 關聯主庫和從庫(操作之時主庫停止操作,還得先關閉主從同步)相關的參數在主庫中執行`show master status`命令中獲取
change master to 
    master_host='主庫IP地址',
    master_port=主庫端口,
    master_user='主庫用戶名',
    master_password='主庫用戶密碼',
    master_log_file='要同步的文件名稱',
    master_log_pos=要開始同步的位置;

# 關閉主從同步
stop slave;

# 重置主從同步信息
reset slave;

# 開啓主從同步
start slave

參考連接 :
MySql主從配置實戰教程 : https://mp.weixin.qq.com/s/OSTaRJJz8y-t3_EyP38dqg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章