MySQL-5.7.10主主同步的安裝和配置

MySQL-5.7.10主主同步的安裝和配置

原創 2016年02月16日 13:04:01mysql

  • 2116

目錄

目錄 1linux

1. 安裝 1sql

2. 修改MySQL的root密碼 4數據庫

3. mysqld_safe和mysql.server 4socket

4. 主主同步配置 4ide

4.1. 建立同步用戶 4spa

4.2. my.cnf 5.net

4.3. 配置項說明 5命令行

4.4. 設置同步關係 6線程

4.5. 驗證 7

5. 常見錯誤 7

 

1. 安裝

這裏安裝的是最新的MySQL 5.7.10(5.7.十二、5.7.13(後續更新版本可能相似)有些區別,安裝過程當中遇到錯誤可搜索下本文,也許能夠找到解決辦法),下載網址爲:http://dev.mysql.com/downloads/mysql/

本文選擇是的「Linux - Generic」下的「Linux - Generic (glibc 2.5) (x86, 64-bit), Compressed TAR Archive」,它的二進制安裝包名爲mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz。

將MySQL二進制安裝包解壓後,可看到名爲INSTALL-BINARY(注意5.7.12版本INSTALL-BIARY文件位於docs目錄下,而不是根目錄)的文件,該文件有說明如何安裝MySQL,本文基本參照它進行的。

因爲官方提供的二進制安裝包,編譯的時候指定的「--prefix」爲「/usr/local/mysql」,因此強烈建議將mysql安裝在/usr/local目錄下,不然安裝過程會容易遇到問題。但同時建議將數據目錄指定爲一個足夠大的分區下的目錄。

固然,data目錄也能夠爲軟連接方式到足夠大的分區目錄,而且推薦使用軟連接方式。不然在使用mysql命令時,常常須要指定參數「--datadir」,好比mysqld、mysqld_safe和mysql_ssl_rsa_setup等都須要指定「--datadir」。

若是不是安裝在/usr/local/mysql,則須要爲mysqld指定--basedir、--character-sets-dir、--language、--lc-messages-dir、--plugin-dir等衆多參數值。

若是不能root用戶安裝,則還須要爲mysqld指定--slow-query-log-file、--socket、--pid-file、--plugin-dir和--general-log-file等參數值。

這些參數的默認值,均可以經過執行MySQL的「bin/mysqld --verbose --help」查看到。

# MySQL安裝目錄爲/usr/local/mysql,數據目錄實際爲/data/mysql/data

# 注意需以root用戶安裝MySQL,若是不能root用戶安裝,容易遇到安裝麻煩

# 並請注意5.7.6以前的版本安裝略有不一樣!

 

# 新建mysql用戶組

groupadd mysql

# 新建mysql用戶,並設置爲不能做爲linux登陸用戶

useradd -r -g mysql -s /bin/false mysql

 

# 進入到mysql安裝目錄

cd /usr/local

# 解壓二進制安裝包

tar xzf mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz

# 創建易記的、與版本無關的短連接

ln -s mysql-5.7.10-linux-glibc2.5-x86_64 mysql

 

# 進入到mysql目錄

cd mysql

 

# 建立數據目錄

mkdir -p /data/mysql/data

# 創建數據目錄軟連接,讓指向/usr/local/mysql/data指向/data/mysql/data

# mysql-5.7.12默認的數據目錄爲/var/lib/mysql,

# 而不是默認的/usr/local/mysql/data,請安裝的時候注意,

# 但mysql-5.7.13卻又是/usr/local/mysql/data

ln -s /data/mysql/data /usr/local/mysql/data

# 對於mysql-5.7.12(不包含mysql-5.7.13),應當以下:

#ln -s /data/mysql/data /var/lib/mysql

 

# 建立mysqld_safe日誌文件mariadb.log目錄(mysql-5.7.12要求,mysql-5.7.10不須要)

# mysqld的錯誤日誌文件默認位於data目錄下,日誌文件名爲機器名,後綴爲「.err」,

# 若是mysqld啓動不了,能夠檢查這兩個日誌文件,以找到解決辦法。

mkdir /var/log/mariadb

 

# 建立mysqld的pid文件mariadb.pid目錄(mysql-5.7.12要求,mysql-5.7.10不須要)

mkdir /var/run/mariadb

 

# 設置目錄權限

chmod 770 /data/mysql/data

chown -R mysql /data/mysql/data

chgrp -R mysql /data/mysql/data

chown -R mysql .

chgrp -R mysql .

 

# 下列4條mysql-5.7.12要求,mysql-5.7.10不須要

chmod 770 /var/log/mariadb

chmod 770 /var/run/mariadb

chown -R mysql /var/log/mariadb

chgrp -R mysql /var/run/mariadb

 

# 初始化(成功執行完mysqld後,會提供一個臨時的root密碼,請務必記住)

# 另外須要注意臨時密碼會過時,因此須要儘可能修改root密碼

# 但若是指定參數–initial-insecure,則賬號root@localhost的密碼爲空

bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp

 

# 安裝和配置SSL

bin/mysql_ssl_rsa_setup

 

# 重置目錄權限

chown -R root .

chown -R mysql /data/mysql/data

 

# 修改/etc/profile中的環境變量PATH

# 將MySQL的bin目錄加入到PATH的最前面

export PATH=/usr/local/mysql/bin:$PATH

 

# 啓動mysql,請不要使用「bin/mysqld_safe --user=mysql &」來啓動MySQL

# 緣由是5.7.12和5.7.10等版本的參數值不一致。

# 使用「bin/mysqld_safe --user=mysql &」啓動MySQL,將不能使用5.7.12版本mysql.server來中止MySQL,故推薦使用mysql.server來啓動MySQL,由mysql.server間接調用mysqld

support-files/mysql.server start

# 若是mysql.server不能正常中止MySQL,請日後查看解決辦法

 

# 查看端口是否已起來(不修改配置和不指定參數--port,默認端口號爲3306)

netstat -lpnt|grep 3306

 

# 中止MySQL

support-files/mysql.server stop

 

# 設置mysql隨着系統自啓動

cp support-files/mysql.server /etc/init.d/mysql.server

 

以上使用的都是MySQL默認配置,若是須要定製化,能夠經過修改文件my.cnf來達成。MySQL 5.7.10不帶my.cnf,只有個support-files/my-default.cnf。

經過執行命令「support-files/my-default.cnf」,能夠了解到MySQL搜索my.cnf的順序依次爲:/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf,這樣能夠複製一份my-default.cnf,而後再修改,如:cp support-files/my-default.cnf /etc/my.cnf。

2. 修改MySQL的root密碼

因爲上一步生成的是root臨時密碼,所以須要修改,以防過時不能使用。使用臨時密碼進入MySQL Cli,以設置正式密碼(注意保持mysql要和mysqld版本相同,不然可能會遇到「Your password has expired」錯誤,簡便的作法是修改環境變量PATH,讓新版的mysql位於老版本mysql的搜索路徑以前,好比export PATH=/usr/local/mysql/bin:$PATH):

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');

並建議使用單引號括起密碼,使用雙引號有轉義問題!示例:

mysql -uroot -h127.0.0.1 -p'8d#uhJdf(:Y<',其中'8d#uhJdf(:Y<'爲臨時密碼。

3. mysqld_safe和mysql.server

mysql.server會調用mysqld_safe,二者均可以用來啓動MySQL,但中止和重啓只有mysql.server具有。Mysql.server經過讀取pid文件來中止MySQL,pid文件默認位於data目錄,但能夠經過命令行參數pid-file來修改。

能夠爲mysqld_safe指定參數--user,來肯定運行mysqld的運行用戶,若是不指定的話,默認爲mysql(由mysqld_safe文件中的變量user指定)。

以root執行msyqld_safe或mysql.server啓動mysqld時,mysqld會自動切換到--user指定的用戶,如mysql。經過ps aux|grep mysqld,能夠看到mysqld_safe運行在用戶root下,而mysqld運行在用戶mysql下。

 

若是使用mysql.server遇到錯誤:ERROR! MySQL server PID file could not be found!,則是由於mysqld的--pid-file參數和mysql.server的不一致。

執行ps aux|grep mysqld便可查看到mysqld的--pid-file參數值,或執行「mysqld --verbose --help」也能夠查看到mysqld的--pid-file參數值:bin/mysqld --verbose --help|grep pid-file。

簡單的解決辦法是修改mysql.server文件,搜索變量mysqld_pid_file_path(有些版本變量名爲server_pid_file),並設置變量mysqld_pid_file_path的值和mysqld的--pid-file參數值相同便可。

對於mysql-5.7.13,mysql.server中的mysqld_pid_file_path默認值爲$datadir/`hostname`.pid,而mysqld的--pid-file參數值爲/var/lib/mysql/`hostname`.pid,二者不一致,將文件中的變量值修改爲一致後即正常工做,如:mysqld_pid_file_path=/var/lib/mysql/`hostname`.pid。

 

若是啓動不成功,又找不到出錯日誌信息,則能夠考慮修改mysql.server,將:

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &

一行的重定向先註釋掉,如:

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args #>/dev/null 2>&1 &

以即可以在屏幕上觀察到出錯緣由。

4. 主主同步配置

4.1. 建立同步用戶

啓動MySQL,而後進入MySQL CLi,執行如下命令建立用於同步的用戶:

grant replication slave,file on *.* to 'user'@'peer' identified by 'password';

flush privileges;

 

其中user爲用於同步的用戶名,peer爲另外一主的IP地址,password爲user的MySQL密碼,這3個的值需根據實際進行修改。

注意,兩主機器都須要建立同步用戶。並確保peer爲另外一主的IP地址,其它user和password兩主建議保持相同,示例(假設兩主IP分別爲192.168.1.1和192.168.1.2):

Ø 192.168.1.1上執行:

grant replication slave,file on *.* to 'replication'@'192.168.1.2' identified by '123456';

flush privileges;

Ø 192.168.1.2上執行:

grant replication slave,file on *.* to 'replication'@'192.168.1.1' identified by '123456';

flush privileges;

4.2. my.cnf

修改/etc/my.cnf,實現主主配置。

若是不存在/etc/my.cnf,則複製support-files/my-default.cnf生成my.cnf,兩臺機器的my.cnf分別配置爲(不難看到,只有server_id和auto_increment_increment兩項不一樣):

機器A

機器B

server-id=1

user=mysql

log-bin=mysql-bin

log-slave-updates

slave-skip-errors=all

sync_binlog=1

auto_increment_increment=1

auto_increment_offset=1

server-id=2

user=mysql

log-bin=mysql-bin

log-slave-updates

slave-skip-errors=all

sync_binlog=1

auto_increment_increment=2

auto_increment_offset=1

4.3. 配置項說明

配置項

配置項說明

server-id

不能相同!惟一標識號,值位於1~2^32-1之間

user

這個能夠不指定,則使用mysqld_safe指定的用戶,或者mysqld_safe默認的用戶mysql

log-bin

啓用二進制日誌文件

log-slave-updates

配置從庫上的更新操做是否寫二進制文件,須要和log-bin一塊兒使用

slave-skip-errors

值爲all表示讓從庫跳過全部錯誤(但不能跳過全部DDL所引發的主從錯誤),也能夠只跳過指定的錯誤,如:--slave-skip-errors=1062,1053;也能夠配置只跳過DDL錯誤,如:--slave-skip-errors=ddl_exist_errors,這等同於:

--slave-skip-errors=1007,1008,1050,1051,1054,1060,1061,1068,1094,1146

sync_binlog

值爲1表示主機每次提交事務的時候把二進制日誌的內容同步到磁盤上

auto_increment_increment

auto_increment_offset

和auto_increment_offset一塊兒用於主主同步,用來錯開自增,防止鍵值衝突,因此auto_increment_increment和auto_increment_offset二者,至少要有一項值不一樣。

 

上述配置會致使同步全部的數據庫,藉助下列配置項也能夠選擇性的同步或不一樣步:

配置項

配置項說明

binlog-do-db=test1

binlog-do-db=test2

表示只同步數據庫test1和test2,若是還想同步test3,只須要新增一行:binlog-do-db=test3便可

binlog-ignore-db=db1

binlog-ignore-db=db2

表示不一樣步數據庫db1和db2,若是還有db3不想同步,新增一行:binlog-ignore-db=db3便可

 

相關配置項(對於主從同步,只須要在從上配置):replicate-do-db、replicate-ignore-db、replicate_wild_do_table和replicate_wild_ignore_table。

4.4. 設置同步關係

分別重啓MySQL,進入MySQL Cli,執行命令「show master status\G」,記住「File」和「Position」的值,如:

mysql> show master status\G

*************************** 1. row ***************************

             File: mysql-bin.000004

         Position: 682

     Binlog_Do_DB: test

 Binlog_Ignore_DB: mysql

Executed_Gtid_Set: 

1 row in set (0.00 sec)

 

設置同步關係(兩個主都須要設置):

stop slave;

change master to master_host='peer',master_user='user',master_password='password',master_log_file='mysql-bin.000004', master_log_pos=682;

 

若是不先執行「stop slave;」,則可能遇到以下錯誤:

ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.

 

這裏,peer、user和password三者的取值爲「建立同步用戶」時指定的值。設置示例:

change master to master_host='192.168.1.2',master_user='replication',master_password='123456',master_log_file='mysql-bin.000004', master_log_pos=682;

 

因爲前面一步調用「stop slave;」,中止了複製。在完成後,需再啓動複製:

start slave;

 

4.5. 驗證

執行命令「show slave status\G;」查看複製狀態,若是出現「Slave_IO_Running: Yes」和「Slave_SQL_Running: Yes」,則表示狀態正常。

進一步,能夠分別建立一個表,如:create table test1 (a int)和create table test2 (b int)。再分別使用show tables查看是否同步過去。

5. 常見錯誤

1) ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.

遇到這個問題,多是由於客戶端mysql和服務端版本不一致,好比mysql-5.5.41鏈接5.7.12。

2) TIMESTAMP with implicit DEFAULT value is deprecated

執行MySQL的「bin/mysqld --initialize --user=mysql」時報的錯誤。

緣由是從MySQL 5.6版本開始,timestamp的默認值已被標爲deprecated,即若是類型爲timestamp的字段,若是沒有明確聲明默認值爲NULL,則默認爲NOT NULL。若是設置timestamp字段爲NULL,則自動存儲當前的timestamp。

3) Can't find error-message file '/usr/local/mysql/share/errmsg.sys'

執行MySQL的「bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp」時報的錯誤。

這多是由於以前有執行過,致使data目錄不爲空,經過「bin/mysqld --verbose --help|grep datadir」能夠查看到默認的數據目錄爲/var/lib/mysql/。須要保證/var/lib/mysql/目錄爲空。或者經過指定參數--datadir改變數據目錄,如「bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp --datadir=/data/mysql/data」。

4) Can't find error-message file '/usr/local/mysql/share/errmsg.sys'

對於錯誤:

Can't find error-message file '/usr/local/mysql/share/errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.

從官網下載的MySQL默認安裝目錄爲/usr/local/mysql,若是實際爲其它目錄,則建議經過參數--basedir指定,不然會遇到很多安裝問題。經過執行「bin/mysqld --verbose --help|grep basedir」便可看到「--basedir」的默認值爲/usr/local/mysql/。

5) Can't connect to local MySQL server through socket

使用mysql試圖進入MySQL Cli時,遇到錯誤:

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

多是由於客戶端的版本和服務端的版本不一致,若是是這樣,一般不存在/var/lib/mysql/mysql.sock。能夠修改環境變量PATH來解決,讓新安裝的MySQL的bin目錄位於PATH前頭,如:

export MYSQL_HOME=/usr/local/mysql

export PATH=$MYSQL_HOME/bin:$PATH

export MANPATH=$MYSQL_HOME/man:$MANPATH

6) ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread;run STOP SLAVE IO_THREAD FOR CHANNEL '' first.

在設置同步關係時,沒有先中止slaves線程。解決辦法爲在設置同步關係以前,先執行下「stop slave」,以中止slave線程。

7) ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

執行mysql時報的錯,是因爲服務端mysqld和客戶端mysql二者的mysql.sock文件位置不一樣。

解決辦法:

使用「ps aux|grep mysqld」或「cat "/proc/`pidof mysqld`/cmdline"」查看mysqld參數「--socket」的值,好比多是「/var/lib/mysql/mysql.sock」。

顯然不是mysql要找的「/tmp/mysql.sock」,指定下mysql的參數「-S」便可解決問題,如:mysql -S/var/lib/mysql/mysql.sock -uroot -p(坑爹的MySQL-5.7.12,默認參數各類不一致)。

8) mysqld: Table 'mysql.plugin' doesn't exist

2016-05-18T03:33:56.235882Z 0 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.

可使用「bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp」重作下初始化,便可解決。

 

9) 2016-05-18T03:41:02.970764Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist

辦法同上。

10) 2016-05-18T03:44:42.731483Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.

執行「bin/mysqld --initialize --user=mysql --explicit_defaults_for_timestamp」時報的錯誤,解決辦法是清空data目錄後再執行。

相關文章
相關標籤/搜索