快速搭建主從的指令碼和問題排查

jeanron100發表於2017-09-01

    今天寫了一個快速搭建MySQL主從環境的指令碼,思路和前幾天釋出的MGR快速搭建的有一點像,但是最根本的差別就是這個指令碼支援5.6,5.7版本。其實sandbox本身也能夠做這些事情,自己寫這個只是想把這個過程自己記錄下來,明白可能在哪些地方有一些注意的細節。

  本來以為寫起來會很容易,結果在最後除錯的時候發現MySQL 5.7版本沒問題了,MySQL 5.6版本碰到了問題。提示的資訊顯示從庫連線主庫抓取binlog的時候連線有問題,換句話說,就是資料庫連線失敗,導致從庫無法應用binlog.

  這就奇怪了,MySQL 5.7可以,到了MySQL 5.6怎麼就不行了呢?

我看了下,涉及到複製使用者的語句就兩行:

CREATE USER rpl_usersss@'%';

GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%' IDENTIFIED BY 'rpl_pass';

仔細看也沒什麼特別之處啊。

難道是其他的地方的配置有問題?我們簡單來對比一下。

MySQL 5.7中,使用如下的方式連線是沒有問題的

# /usr/local/mysql_5.7/bin/mysql  -urpl_user -prpl_pass -h 127.0.0.1 -P33081
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.19-log MySQL Community Server (GPL)
。。。
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL 5.6中,使用者名稱密碼不變的情況下,為什麼使用127.0.0.1就不行了呢。

# /usr/local/mysql_5.6/bin/mysql  -urpl_user -prpl_pass -h 127.0.0.1 -P33091
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'rpl_user'@'localhost' (using password: YES)
我前前後後花了不少的時間去對比,發現始終是提示使用者名稱密碼錯誤,但是我確認使用者名稱密碼是相同的。
帶著疑問我檢視了mysql.user表,看看裡面的一些基本資訊。
mysql> select user,host from mysql.user;
+----------+------------------+
| user     | host             |
+----------+------------------+
| rpl_user | %                |
| root     | 127.0.0.1        |
| root     | ::1              |
|          | localhost        |
| root     | localhost        |
|          | oel64.oracle.com |
| root     | oel64.oracle.com |
+----------+------------------+
7 rows in set (0.00 sec)
這樣一個配置,使用者rpl_user是使用域名解析的方式,%的範圍很廣,所以倒不存在特殊的對映關係。
帶著疑問,從安全的角度來看,MySQL 5.6中有一些匿名使用者,還有預設的test庫,這些是應該改進的。
而確實在MySQL 5.7中已經做了相應的修復,或者說是改進吧。
5.7 預設就刪除了匿名使用者,mysql.user預設的情況如下。
mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| rpl_user      | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.04 sec)
所以我在MySQL 5.6中刪除了匿名使用者。
mysql> delete from mysql.user where user='';
Query OK, 2 rows affected (0.03 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
沒想到這個操作完成後,原本提示密碼錯誤的連線問題就引刃而解了。

我修改了指令碼,反反覆覆模擬了多次,能夠復現這類問題,也就暫時宣告了這個問題的一個基本解決。
如果回過頭來看這個問題,可能會有更多的收穫,比如從安全性方面的這些考慮,可能有些問題暫時不會
成為問題,但是會是潛在問題,有些問題雖然暫時不會有明顯的影響,但是在一些特定的場景下,
可能表現形式會更加複雜,而解法其實就很簡單了。
新寫的指令碼放在了github上,地址是:

因為剛寫好,所以很多註釋,細節還沒有改進,稍後繼續補充吧。





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2144422/,如需轉載,請註明出處,否則將追究法律責任。

相關文章