1. 程式人生 > >MySQL基礎系列之 Windows主機上搭建主從複製

MySQL基礎系列之 Windows主機上搭建主從複製

1.首先要在本地建立2個MySQL服務(版本5.5),指定不同的埠。我這裡一個主(3306),一個從3308。
建立多個MySQL服務參考博文:https://blog.csdn.net/caiqing116/article/details/84899680
開門見山這裡先建立測試庫db_ssmdemo

CREATE DATABASE db_ssmdemo CHARACTER SET UTF8;

再建立測試表

CREATE TABLE `tb_basic_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵自增',
  `userId` varchar(32) DEFAULT NULL COMMENT '使用者ID',
  `utype` int(1) DEFAULT '0' COMMENT '使用者型別 0管理員1普通使用者',
  `username` varchar(20) DEFAULT NULL COMMENT '使用者名稱',
  `password` varchar(100) DEFAULT NULL COMMENT 'MD5加密密碼',
  `headimg` varchar(200) DEFAULT NULL COMMENT '頭像',
  `realname` varchar(20) DEFAULT NULL COMMENT '真實姓名',
  `sex` int(1) DEFAULT NULL COMMENT '性別',
  `age` int(2) DEFAULT NULL COMMENT '年齡',
  `mobile` varchar(20) DEFAULT NULL COMMENT '手機號',
  `email` varchar(50) DEFAULT NULL COMMENT '郵件地址',
  `credate` datetime DEFAULT NULL COMMENT '建立時間',
  `upddate` datetime DEFAULT NULL COMMENT '更新時間',
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

2.修改MySQL服務的主配置檔案:
D:\softTool\MySQL\MySQL Server 5.5/my.ini

[mysqld]
#主庫配置
server-id = 1    #服務id,不要出現重複
binlog-do-db=db_ssmdemo    #要同步的資料庫,多個用英文逗號隔開
#binlog-ignore-db=mysql    #不同步的資料庫,如果指定了binlog-do-db這裡應該
log-bin=mysql-bin #要生成的二進位制日記檔名稱(可以不用指定的)

D:\softTool\MySQL\MySQL Server 5.5 slave3308/my.ini

[mysqld]
#從庫配置
server-id = 3    #服務id,不要出現重複
replicate-do-db = db_ssmdemo    #要同步的資料庫,多個用英文逗號隔開
replicate-ignore-db = mysql    #不同步的資料庫
log-bin = mysql-bin #要生成的二進位制日誌檔名稱(可以不用指定的)

從節點整體主要配置我全部貼出如下:

[client]
port=3308

[mysql]
default-character-set=utf8

[mysqld]
port=3308

#從庫庫配置
#服務id
server-id = 3
#要同步的資料庫
replicate-do-db = db_ssmdemo
#不同步的資料庫
replicate-ignore-db = mysql
#要生成的二進位制日誌檔名稱
log-bin = mysql-bin

#Path to installation directory. All paths are usually resolved relative to this.
basedir="D:/softTool/MySQL/MySQL Server 5.5 slave3308/"

#Path to the database root
#資料目錄
datadir="D:/softTool/MySQL/MySQL Server 5.5 slave3308 Data/"

# created and no character set is defined
character-set-server=utf8

# The default storage engine that will be used when create new tables when
default-storage-engine=INNODB

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

# connection limit has been reached.
max_connections=160

# slowdown instead of a performance improvement.
query_cache_size=14M

# section [mysqld_safe]
table_cache=320
tmp_table_size=18M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=23M
key_buffer_size=20M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K

#*** INNODB Specific options ***
# innodb引擎的共享表空間資料檔案根目錄
innodb_data_home_dir="D:/softTool/MySQL/MySQL Server 5.5 slave3308 Data/"
innodb_additional_mem_pool_size=2M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=37M
innodb_log_file_size=10M
innodb_thread_concurrency=10

3、在主庫新增一個使用者 slaveroot3308並指定replication許可權(使用者名稱自定義)

GRANT REPLICATION SLAVE ON *.* TO 'slaveroot3308'@'從機資料庫ip(不帶埠號)' identified by '密碼';

如:

GRANT REPLICATION SLAVE ON *.* TO 'slaveroot3308'@'192.168.100.104' identified by '123456'; 

附相關語句:
驗證語句:SHOW GRANTS FOR 'slaveroot3308'@'192.168.100.104';
或:SELECT * FROM mysql.user WHERE user = 'slaveroot3308'
收回授權:REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'userName'@'host';
重新整理授權:FLUSH PRIVILEGES
檢視服務server-id是否相同:show variables like 'server_id';
檢視服務uuid是否相同:show variables like '%server_uuid%';

4、保持主從MySQL的db_ssmdemo資料庫初始狀態一致。
一般是先將所有的表加讀鎖,然後copy磁碟上的資料庫資料夾,或者直接停止服務,然後將資料檔案拷貝過去。我這裡的操作過程是

(1)先將主庫鎖表,防止資料插入:flush tables with read lock;
這個命令是全域性讀鎖定,執行了命令之後所有庫所有表都被鎖定只讀。一般都是用在資料庫聯機備份,這個時候資料庫的寫操作將被阻塞,讀操作順利進行。

(2)將主庫3306的需要同步的資料庫所有資料備份然後還原到從庫同步資料庫中
此過程方法非常多,我就不在這裡贅述了。

(3)在主資料庫裡面執行show master status;記下file和position欄位對應的引數。

mysql> show master status;

在這裡插入圖片描述
(4)在從庫設定它的master
如果之前有啟動過則先slave stop;

mysql> 
change master to master_host='192.168.100.104',
master_port=3306,master_user='slaveroot3308',master_password='123456',
master_log_file='mysql-bin.000074',master_log_pos=667;

這裡的master_log_file和master_log_pos對應剛才show master status記下的引數。
(5)slave start在從庫開啟從資料庫複製功能;

mysql> slave start;

驗證:可以在從庫通過show slave status來檢視一些引數判斷主從是否正常搭建
在這裡插入圖片描述
如上圖所示:Slave_IO_Running 和 Slave_SQL_Running 都是Yes說明搭建成功
(6)主庫解鎖unlock tables

5.操作主庫插入資料檢視從庫是否同步了資料驗證

INSERT INTO `tb_basic_user`
VALUES
	(
		'1','bc8bbfb770ee4f2c9ba0f988a7a92d4f','1','墨傾池',
		'E10ADC3949BA59ABBE56E057F20F883E',NULL,'雲天望垂',NULL,
            '18',NULL,NULL,'2018-12-07 14:50:20',NULL
	);

分表查詢主從庫資料,可以看到從庫也有資料了
在這裡插入圖片描述
在這裡插入圖片描述

6.注意點
(1)主從間的資料庫不是實時同步,就算網路連線正常,也存在瞬間,主從資料不一致。

(2)如果主從的網路斷開,從會在網路正常後,批量同步。

(3)如果對從庫進行修改資料,那麼很可能從在執行主的bin-log時出現錯誤而停止同步,比如在從庫某張表新增了資料,主庫新增資料的時候同步到從庫,極有可能發生主鍵衝突,導致同步異常。所以這個是很危險的操作。所以一般情況下,非常小心的修改從上的資料。