1. 程式人生 > >Mysql主從配置詳解(第一篇,共五篇)

Mysql主從配置詳解(第一篇,共五篇)

使用Docker容器搭建MySql主從複製

使用Docker容器搭建MySql主從複製

檢視容器ip命令為docker inspect 96fd[id前四位]

Master_mysql_ip_172.17.0.4

slave_mysql_ip_172.17.0.5

1.docker上面尋找mysq,命令如下所示:docker search mysql

https://note.youdao.com/yws/api/group/67516516/noteresource/010DF9F3391A49898B241F130325A843/version/169?method=get-resource&shareToken=F467872CC9004F3186C8F38BA3E13050&entryId=185053850

2.pull mysql到本地,命令如下:docker pull mysql:5.6

https://note.youdao.com/yws/api/group/67516516/noteresource/53C25AB1A0354A53A449E5D4179C748C/version/166?method=get-resource&shareToken=F467872CC9004F3186C8F38BA3E13050&entryId=185053850

(成功之後,使用docker images檢視是否已經下載成功)

3.在主機下面新建conf資料夾,新增master.cnf和slave.cnf配置檔案

(建立檔案命令如下:mkdir conf、vim master.cnf 記住配置檔案必須是以cnf結尾。)

https://note.youdao.com/yws/api/group/67516516/noteresource/01B5E1F72A6F4FBC9909978F2E3888BD/version/167?method=get-resource&shareToken=F467872CC9004F3186C8F38BA3E13050&entryId=185053850

master.cnf檔案:

[mysqld]

pid-file = /var/run/mysqld/mysqld.pid

socket = /var/run/mysqld/mysqld.sock

datadir = /var/lib/mysql

symbolic-links=0

character-set-server = utf8

#skip-networking

innodb_print_all_deadlocks = 1

max_connections = 2000

max_connect_errors = 6000

open_files_limit = 65535

table_open_cache = 128

max_allowed_packet = 4M

binlog_cache_size = 1M

max_heap_table_size = 8M

tmp_table_size = 16M

read_buffer_size = 2M

read_rnd_buffer_size = 8M

sort_buffer_size = 8M

join_buffer_size = 28M

key_buffer_size = 4M

thread_cache_size = 8

query_cache_type = 1

query_cache_size = 8M

query_cache_limit = 2M

ft_min_word_len = 4

log-bin = mysql-bin

server-id = 1

binlog_format = mixed

performance_schema = 0

explicit_defaults_for_timestamp

#lower_case_table_names = 1

interactive_timeout = 28800

wait_timeout = 28800

# Recommended in standard MySQL setup

sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES

[mysqldump]

quick

max_allowed_packet = 16M

[myisamchk]

key_buffer_size = 8M

sort_buffer_size = 8M

read_buffer = 4M

write_buffer = 4M

slave.cnf檔案:

[mysqld]

pid-file = /var/run/mysqld/mysqld.pid

socket = /var/run/mysqld/mysqld.sock

datadir = /var/lib/mysql

symbolic-links=0

character-set-server = utf8

#skip-networking

innodb_print_all_deadlocks = 1

max_connections = 2000

max_connect_errors = 6000

open_files_limit = 65535

table_open_cache = 128

max_allowed_packet = 4M

binlog_cache_size = 1M

max_heap_table_size = 8M

tmp_table_size = 16M

read_buffer_size = 2M

read_rnd_buffer_size = 8M

sort_buffer_size = 8M

join_buffer_size = 28M

key_buffer_size = 4M

thread_cache_size = 8

query_cache_type = 1

query_cache_size = 8M

query_cache_limit = 2M

ft_min_word_len = 4

log-bin = mysql-bin

server-id = 2

binlog_format = mixed

performance_schema = 0

explicit_defaults_for_timestamp

#lower_case_table_names = 1

interactive_timeout = 28800

wait_timeout = 28800

# Recommended in standard MySQL setup

sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES

[mysqldump]

quick

max_allowed_packet = 16M

[myisamchk]

key_buffer_size = 8M

sort_buffer_size = 8M

read_buffer = 4M

write_buffer = 4M

(我加粗的那些是開啟主從資料庫的關鍵,重要引數解釋如下:

lower_case_table_names:忽略表名、列名等資料結構的大小寫(注意:不是每行記錄內容的大小寫!)。

server-id=1: 表示此MySQL伺服器是主伺服器 。

log-bin:開啟二進位制記錄。這是為了主從複製而做的設定。本文使用RBR(Row-Based Replication)模式。

slow_query_log=1:開啟慢查詢日誌。如果某一條SQL執行的時間超過long_query_time設定的秒數,那麼就記錄下來。記錄檔案路徑可以使用show variables;命令,在變數名是slow_query_log_file下查詢到具體的日誌檔案路徑。

long_query_time=1:單位是秒。指如果某一條SQL語句執行時間超過1秒,就記錄下來。必須開啟慢查詢日誌了以後,此變數才能使用。

log_error:開啟錯誤日誌。show variables like 'log_error'; 就可以查詢到日誌檔案的路徑。mysql的docker官方映象如果設定別的取值會導致容器無法正常啟動。

4.執行容器

啟動master容器:

docker run -p 3306:3306 --name master -v /conf/master.cnf:/etc/mysql/conf.d/master.cnf -e MYSQL_ROOT_PASSWORD=qwer1234 -dit mysql:latest /bin/bash

啟動slave容器:

docker run -p 3307:3306 --name slave -v /conf/slave.cnf:/etc/mysql/conf.d/slave.cnf -e MYSQL_ROOT_PASSWORD=qwer1234 -dit mysql:latest /bin/bash

(引數解釋如下:

-p 3306:3306:將容器的3306埠對映到主機的3306埠。

-v /conf/master.cnf:/etc/mysql/conf.d/master.cnf:將主機當前目錄下的conf/master.cnf掛載到容器的/etc/mysql/conf.d/master.cnf記住只能是在conf.d的檔案下面才可以。

-e MYSQL_ROOT_PASSWORD=220316:初始化root使用者的密碼。)

https://note.youdao.com/yws/api/group/67516516/noteresource/5DA7A47F1C9A48DABCB31DFD47A15930/version/171?method=get-resource&shareToken=F467872CC9004F3186C8F38BA3E13050&entryId=185053850

5.進入容器中,命令如下:

進入到slave容器中:docker exec -i -t 1f105944a7c4 /bin/bash

進入到master容器中:docker exec -i -t 7e4c483127c7 /bin/bash

https://note.youdao.com/yws/api/group/67516516/noteresource/66812F0F57A446D9A40332F054C03E8F/version/172?method=get-resource&shareToken=F467872CC9004F3186C8F38BA3E13050&entryId=185053850

6.進入master容器中,進入mysql中,命令如下:mysql -hlocalhost -uroot -p

報錯:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

https://note.youdao.com/yws/api/group/67516516/noteresource/3C5926E434164172980277D7482859EF/version/170?method=get-resource&shareToken=F467872CC9004F3186C8F38BA3E13050&entryId=185053850

7.檢視master資料庫狀態,命令如下:show master status;

https://note.youdao.com/yws/api/group/67516516/noteresource/7A436A42326D4AF6A95B192F520D4AAD/version/168?method=get-resource&shareToken=F467872CC9004F3186C8F38BA3E13050&entryId=185053850

(如果出現這個表格就說明啟動成功了,這邊我們需要記錄file欄位的值(binlog.000002),position(4178)因為在slave中需要用這個值進行主從關聯)

8.在master資料庫中建立使用者,命令如下:create user hefeihu;

9.在master資料庫中給剛才建立的使用者賦予一定許可權,命令如下:

GRANT ALL PRIVILEGES ON *.* TO [email protected]'%' IDENTIFIED BY '220316'; FLUSH PRIVILEGES;FLUSH PRIVILEGES;

(引數介紹:

1.FLUSH PRIVILEGES;這個命令必須填寫,否則上面設定的使用者許可權失效。

2.ip地址是可以設定範圍的。例如:GRANT REPLICATION SLAVE ON *.* TO'linzhiqiang'@'192.168.0.%' IDENTIFIED BY'220316';

3.操作的資料庫也是可以指定的。

4.使用者的許可權也是可以設定的。具體的命令大家可以自己去學習,我這裡就不多說了。

如果不設定使用者許可權的話,本地可以連線的上mysql伺服器,區域網或者外網是連線不上,會顯示連線被拒絕或者使用者沒有這個許可權。除此之外許可權還可以精確到某個資料庫,連線者的IP地址區間,設定是某個資料的操作問題等等都可以進行設定。我這邊設定的是linzhiqiang這個使用者具備所有使用者資料庫的許可權,所有的ip地址都可以通過Master這個使用者來連線主資料庫。)

10.在slave資料庫中配置主從關係關聯:

change master to

master_host='172.17.0.4',

master_port=3306,

master_user='hefeihu',

master_password='qwer1234',

master_log_file='binlog.000002',

master_log_pos=4888;

------------------------------------------

change master to

master_host='192.168.88.22', //Master 伺服器Ip地址,也就是上面寫的192.168.88.22

master_port=3306,//Master 埠號

master_user='linzhiqiang',//Master 使用者名稱

master_password='220316',//使用者密碼

master_log_file='mysql-bin.000004',//Master伺服器產生的日誌要和Master伺服器所配置的相互對應如下如所示的file對應

master_log_pos=0;//要和Master伺服器所配置的相互對應如下如所示的Position對應(經過測試發現如果是一樣的只能同步一次,所以這裡修正成0,0是可以每次都同步成功的)

(我這邊用//是為了解釋方便,資料庫中操作的時候一定不要加上!!!)

12.在salve資料庫中啟動服務,命令如下:start slave;

13.在salve資料庫中檢視啟動狀態,命令如下:show slave status\G

https://note.youdao.com/yws/api/group/67516516/noteresource/EA2C1E9ED55E44BBA0CEA625C9424FE9/version/165?method=get-resource&shareToken=F467872CC9004F3186C8F38BA3E13050&entryId=185053850

 Slave_SQL_Running: No

14.利用Navicat進行測試,是否同步成功。

https://note.youdao.com/yws/api/group/67516516/noteresource/ECAC965B8981485ABBDE8D0A683A6388/version/164?method=get-resource&shareToken=F467872CC9004F3186C8F38BA3E13050&entryId=185053850

結果顯示同步成功!!!

docker run -p 3306:3306 --name master -v /conf/master.cnf:/etc/mysql/conf.d/master.cnf -e MYSQL_ROOT_PASSWORD=qwer1234 -d mysql:5.6