天天看點

MySQL-5.7.10主主同步的安裝和配置 目錄 1. 安裝 2. 修改MySQL的root密碼 3. mysqld_safe和mysql.server 4. 主主同步配置 5. 常見錯誤

MySQL-5.7.10主主同步的安裝和配置 目錄 1. 安裝 2. 修改MySQL的root密碼 3. mysqld_safe和mysql.server 4. 主主同步配置 5. 常見錯誤

<a href="#_Toc10006%20">目錄 1</a>

<a href="#_Toc19650%20">1. 安裝 1</a>

<a href="#_Toc7971%20">2. 修改MySQL的root密碼 4</a>

<a href="#_Toc22085%20">3. mysqld_safe和mysql.server 4</a>

<a href="#_Toc31932%20">4. 主主同步配置 4</a>

<a href="#_Toc25006%20">4.1. 建立同步使用者 4</a>

<a href="#_Toc13833%20">4.2. my.cnf 5</a>

<a href="#_Toc19158%20">4.3. 配置項說明 5</a>

<a href="#_Toc17537%20">4.4. 設定同步關系 6</a>

<a href="#_Toc9788%20">4.5. 驗證 7</a>

<a href="#_Toc28678%20">5. 常見錯誤 7</a>

本文選擇是的“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 .

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

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

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

# 啟動mysql,請不要使用“bin/mysqld_safe --user=mysql &amp;”來啟動MySQL

# 原因是5.7.12和5.7.10等版本的參數值不一緻。

# 使用“bin/mysqld_safe --user=mysql &amp;”啟動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。

由于上一步生成的是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為臨時密碼。

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 &gt;/dev/null 2&gt;&amp;1 &amp;

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

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

以便可以在螢幕上觀察到出錯原因。

啟動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';

? 192.168.1.2上執行:

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

修改/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

auto_increment_increment=2

配置項

配置項說明

server-id

不能相同!唯一辨別号,值位于1~2^32-1之間

user

這個可以不指定,則使用mysqld_safe指定的使用者,或者mysqld_safe預設的使用者mysql

log-bin

啟用二進制日志檔案

配置從庫上的更新操作是否寫二進制檔案,需要和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。

分别重新開機MySQL,進入MySQL Cli,執行指令“show master status\G”,記住“File”和“Position”的值,如:

mysql&gt; 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;

執行指令“show slave status\G;”檢視複制狀态,如果出現“Slave_IO_Running: Yes”和“Slave_SQL_Running: Yes”,則表示狀态正常。

進一步,可以分别建立一個表,如:create table test1 (a int)和create table test2 (b int)。再分别使用show tables檢視是否同步過去。

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目錄後再執行。

繼續閱讀