MySQL8.0.12 安裝及配置、讀寫分離,主從復制


一.安裝

1.從網上下載MySQL8.0.12版本,下載地址:https://dev.mysql.com/downloads/mysql/

 

2. 下載完成后解壓

        我解壓的路徑是:D:\Java\mysql-8.0.12-winx64

3. 配置文件

        首先在解壓的路徑下查看是否含有my.ini的文件,如果沒有則新建一個,內容如下:

[mysqld]
# 設置3306端口
port=8307
# 設置mysql的安裝目錄
basedir=D:\Program Files\MySQL
# 設置mysql數據庫的數據的存放目錄
datadir=D:\Program Files\MySQL\Data
# 允許最大連接數
max_connections=200
# 允許連接失敗的次數。
max_connect_errors=10
# 服務端使用的字符集默認為UTF8
character-set-server=utf8
# 創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB
# 默認使用“mysql_native_password”插件認證
#mysql_native_password
default_authentication_plugin=mysql_native_password
[mysql]
# 設置mysql客戶端默認字符集
default-character-set=utf8
[client]
# 設置mysql客戶端連接服務端時默認使用的端口
port=8307
default-character-set=utf8

4. 數據庫配置

       通過管理員權限進入cmd(如果不是管理員權限就會出現問題),進入MySQL安裝目錄的bin目錄下

接着輸入mysqld --initialize --console,就會出現以下畫面,其中標紅的為數據庫root用戶的初始密碼,一定要牢記,后面登錄需要用到,當然要是不小心關掉了或者沒記住,刪掉初始化的 data目錄,再執行一遍初始化命令又會重新生成。

再然后輸入mysqld --install安裝mysql服務,輸入net start mysql啟動服務,備注:mysqld --remove是卸載MySQL服務,net stop mysql是停止服務。

5. 進入數據庫的配置

輸入mysql -u root -p后會讓你輸入密碼,密碼為前面讓你記住的密碼,輸入正確后就會出現如下界面,表示進入了MySQL命令模式。

新用戶需要修改密碼先,輸入alter user user() identified by "新密碼";

use mysql;

接着更改密碼,輸入ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';  出現如下界面表示更改成功。

到此,MySQL8.0.12數據庫就安裝完成了。

可選配置:使用root遠程登錄輸入update user set host ='%' where user ='root';

保存flush privileges;

二.數據庫相關配置

查看默認數據庫:show databases;

選擇mysql數據庫:use mysql

查看默認MySQL用戶:select host, user, authentication_string, plugin from user;

創建新用戶: CREATE USER '用戶名'@'host名稱' IDENTIFIED WITH mysql_native_password BY '密碼';

給新用戶授權:GRANT ALL PRIVILEGES ON *.* TO '用戶名'@'host名稱';

刷新權限: FLUSH PRIVILEGES;

 

三.問題詳解

1. MySQL8.0.12不能連接Navicat

原因:MySQL8.0與MySQL5.0所采用的加密方式規則不一樣,所以導致 Navicat打不開。可通過select host, user, authentication_string, plugin from user;查看密碼的規則。

如上圖,plugin這一列就是對應用戶的加密規則,可以看到我的root用戶的加密規則是:mysql_native_password,這是因為我已經設置過了,默認的是:caching_sha2_password,所以我們只需要將默認的caching_sha2_password改為mysql_native_password即可。

解決方案:輸入ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';即可修改root用戶的加密規則以及密碼。

 

2. 授權出錯,顯示You are not allowed to create a user with GRANT

原因:在網上有很多教程說當出現The user specified as a definer ('root'@'%') does not exist時表示root用戶權限不足,只需要執行GRANT ALL ON *.* TO 'root'@'%';就可以了,但是往往又會出現You are not allowed to create a user with GRANT的錯誤提示。這是因為GRANT ALL ON *.* TO 'root'@'%';這條語句中@'%'中的百分號其實是root用戶對應host的名稱,很多人並沒有注意到他的root用戶對應的其實是localhost,直接就執行了上面的語句,所以才會報錯。

解決方案:只要將GRANT ALL ON *.* TO 'root'@'%';中的%改為對應的host名稱即可,最后還要刷新一下權限FLUSH PRIVILEGES; 

特別說明:網上說%表示通配所有的host,但是操作時並不成功,不明白是為什么,我猜想可能與MySQL8.0版本有關系。

 

4、配置新數據庫的主從復制

4.1、修改主庫配置文件

注意!注意!注意!:配置文件一定要保存成ASNI存儲方式,不然會報錯

在主從的服務器上分別找到以下路徑的my.ini文件

主數據庫配置的mysqld節點下加入

[mysqld]
log-bin=mysql-bin #從庫會基於此log-bin來做復制
binlog-do-db=mytest #用於讀寫分離的具體數據庫,這里我創建了mytest作測試
binlog_ignore_db=mysql #不用於讀寫分離的具體數據庫
binlog_ignore_db=information_schema #和binlog-do-db一樣,可以設置多個
#選擇row模式 
binlog-format=ROW
server-id=1

 

從數據庫配置配置的mysqld節點下加入

[mysqld]
log-bin=mysql-bin #從庫會基於此log-bin來做復制
replicate-do-db=mytest #用於讀寫分離的具體數據庫,這里我創建了mytest作測試
#選擇row模式 
binlog-format=ROW
server-id=2

5、配置主數據庫

開啟主數據庫服務,創建用來測試讀寫分離的數據庫
對用戶授權使其用於復制主庫數據

注意:下面的語句要用root來執行

CREATE USER 'slave123'@'192.168.103.%' IDENTIFIED BY '123456';#創建用戶
GRANT REPLICATION SLAVE ON *.* TO 'slave123'@'192.168.103.%';#授權
flush privileges; 

用戶名:slave123
密碼:123456

然后查詢主數據庫狀態,並記錄下File和Position字段的值

mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000002 |      155 | mytest       | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.02 sec)

 

6、配置從數據庫

開啟從數據庫服務,手動創建測試讀寫分離的庫,這邊不會幫你自動創建,同時也創建和主庫一樣的用戶,我這里還是先停止從庫

stop slave;

設置它的master

change master to
master_host='192.168.103.207',
master_port=3307,
master_user='slave123',
master_password='123456',
master_log_file='mysql-bin.000002',
master_log_pos=155;

注:這里的 master_log_filemaster_log_pos就是配置主數據庫查詢到的FilePosition

啟動從庫

start slave;

檢查是否啟動成功

show slave status;

如果Slave_IO_State字段顯示 Waiting for master to send event說明成功,當然你也可以在主庫表中插入一條數據,看看從庫是否有同步,到這里,已經配置好主從同步了。

7、配置Mysql-Proxy

 下載 mysql-proxy-0.8.5-windows-x86-32bit 解壓到任意位置,它是綠色免安裝版的,創建配置文件 mysql-proxy.conf,內容如下

[mysql-proxy]
admin-username=root
admin-password=root
admin-lua-script=C:/mysql-proxy-0.8.5-windows-x86-32bit/lib/mysql-proxy/lua/admin.lua
proxy-backend-addresses=192.168.103.207:3307
proxy-read-only-backend-addresses=192.168.103.208:3307
proxy-lua-script=C:/mysql-proxy-0.8.5-windows-x86-32bit/share/doc/mysql-proxy/rw-splitting.lua
log-file=C:/mysql-proxy-0.8.5-windows-x86-32bit/log/mysql-proxy.log
log-level=debug
daemon=true
keepalive=true

admin-username:用於中間件連接的用戶,這里我還是用root偷懶
admin-password:同上用戶密碼
admin-lua-script:根據存放的文件位置自行調整
proxy-backend-addresses:主庫服務器+端口
proxy-read-only-backend-addresses:從庫服務器+端口,多個從庫用,隔開
proxy-lua-script:根據存放的文件位置自行調整
log-file:日志文件存放位置,如果你指定了一個路徑,請確保手動創建了對應的文件夾,否則會報錯
log-level:日志級別
daemon:以守護進程方式運行
keepalive:長連接

將上面創建的文件復制到mysql-proxy-0.8.5-windows-x86-32bit的bin目錄中
創建install.bat文件,內容如下

"C:\mysql-proxy-0.8.5-windows-x86-32bit\bin\mysql-proxy.exe" -P 192.168.103.203:6217 --defaults-file="C:\mysql-proxy-0.8.5-windows-x86-32bit\bin\mysql-proxy.conf"

也放在mysql-proxy-0.8.5-windows-x86-32bitbin目錄中,雙擊運行
接下來,用你的客戶端工具連接 192.168.103.203:6217(6217這個端口隨便設置,跟上面的bat里面一致就行),測試是否可以能正常連接,如果能連接,但是不能顯示讀寫分離的數據庫,那一般是權限設置問題

8、配置Atlas

下載Atlas會有兩個版本,其中有個分表的版本,但是這個需要其他的依賴,我這邊不需要分表這種需求,所以安裝普通的版本

     Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm

     Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm

首先進入Linux的Home目錄下,下載非分表的安裝包

rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 

安裝好了,它會默認在”/usr/local/mysql-proxy”下給你生成4個文件夾,以及需要配置的文件,如下:

[root@localhost home]# ll /usr/local/mysql-proxy/
total 16
drwxr-xr-x. 2 root root 4096 Dec 28 10:47 bin
drwxr-xr-x. 2 root root 4096 Dec 28 10:47 conf
drwxr-xr-x. 3 root root 4096 Dec 28 10:47 lib
drwxr-xr-x. 2 root root 4096 Dec 17  2014 log
bin目錄下放的都是可執行文件

1. “encrypt”是用來生成MySQL密碼加密的,在配置的時候會用到

2. “mysql-proxy”是MySQL自己的讀寫分離代理

3. “mysql-proxyd”是360弄出來的,后面有個“d”,服務的啟動、重啟、停止。都是用他來執行的

 

conf目錄下放的是配置文件

1. “test.cnf”只有一個文件,用來配置代理的,可以使用vim來編輯

 

lib目錄下放的是一些包,以及Atlas的依賴

log目錄下放的是日志,如報錯等錯誤信息的記錄

進入bin目錄,使用encrypt來對數據庫的密碼進行加密,我的MySQL數據的用戶名是buck,密碼是hello,我需要對密碼進行加密

[root@localhost bin]# ./encrypt 123456
/iZxz+0GRoA=

配置Atlas,使用vim進行編輯

[root@localhost conf]# cd /usr/local/mysql-proxy/conf/
[root@localhost conf]# vim test.cnf

進入后,可以在Atlas進行配置,360寫的中文注釋都很詳細,根據注釋來配置信息,其中比較重要,需要說明的配置如下:

這是用來登錄到Atlas的管理員的賬號與密碼,與之對應的是“#Atlas監聽的管理接口IP和端口”,也就是說需要設置管理員登錄的端口,才能進入管理員界面,默認端口是2345,也可以指定IP登錄,指定IP后,其他的IP無法訪問管理員的命令界面。方便測試,我這里沒有指定IP和端口登錄。

#管理接口的用戶名
admin-username = user

#管理接口的密碼
admin-password = pwd
 

這是用來配置主數據的地址與從數據庫的地址,這里配置的主數據庫是135,從數據庫是134

#Atlas后端連接的MySQL主庫的IP和端口,可設置多項,用逗號分隔
proxy-backend-addresses = 192.168.1.50:3306

#Atlas后端連接的MySQL從庫的IP和端口,@后面的數字代表權重,用來作負載均衡,若省略則默認為1,可設置多項,用逗號分隔
proxy-read-only-backend-addresses = 192.168.1.41:3306@1
 

這個是用來配置MySQL的賬戶與密碼的,我的MySQL的用戶是buck,密碼是hello,剛剛使用Atlas提供的工具生成了對應的加密密碼

#用戶名與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,下行的user1和user2為示例,將其替換為你的MySQL的用戶名和加密密碼!
pwds = buck:/iZxz+0GRoA=
 

這是設置工作接口與管理接口的,如果ip設置的”0.0.0.0”就是說任意IP都可以訪問這個接口,當然也可以指定IP和端口,方便測試我這邊沒有指定,工作接口的用戶名密碼與MySQL的賬戶對應的,管理員的用戶密碼與上面配置的管理員的用戶密碼對應。

#Atlas監聽的工作接口IP和端口
proxy-address = 0.0.0.0:1234

#Atlas監聽的管理接口IP和端口
admin-address = 0.0.0.0:2345

啟動Atlas

[root@localhost bin]# pwd
/usr/local/mysql-proxy/bin

[root@localhost bin]# ./mysql-proxyd test start

OK: MySQL-Proxy of test is started

測試一下Atlas服務器的MySQL狀態,要確認它是關閉狀態,並且使用mysql命令,進不去數據庫,前提是Atlas服務器也需要裝mysql,直接運行  yum -y install mysql 就可以了。我們這里只需要mysql這個命令好使,就可以了。

[root@localhost bin]# /etc/init.d/mysqld status
mysqld is stopped
[root@localhost bin]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

確認系統中自帶的MySQL進不去了,使用如下命令,進入Atlas的管理模式“mysql -h127.0.0.1 -P2345 -uuser -ppwd ”,能進去說明Atlas正常運行着呢,因為它會把自己當成一個MySQL數據庫,所以在不需要數據庫環境的情況下,也可以進入到MySQL數據庫模式。

[root@localhost bin]# mysql -h127.0.0.1 -P2345 -uuser -ppwd
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.99-agent-admin

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

可以訪問“help”表,來看MySQL管理員模式都能做些什么。可以使用SQL語句來訪問

mysql> select * from help;
+----------------------------+---------------------------------------------------------+
| command                    | description                                             |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help         | shows this help                                         |
| SELECT * FROM backends     | lists the backends and their state                      |
| SET OFFLINE $backend_id    | offline backend server, $backend_id is backend_ndx's id |
| SET ONLINE $backend_id     | online backend server, ...                              |
| ADD MASTER $backend        | example: "add master 127.0.0.1:3306", ...               |
| ADD SLAVE $backend         | example: "add slave 127.0.0.1:3306", ...                |
| REMOVE BACKEND $backend_id | example: "remove backend 1", ...                        |
| SELECT * FROM clients      | lists the clients                                       |
| ADD CLIENT $client         | example: "add client 192.168.1.2", ...                  |
| REMOVE CLIENT $client      | example: "remove client 192.168.1.2", ...               |
| SELECT * FROM pwds         | lists the pwds                                          |
| ADD PWD $pwd               | example: "add pwd user:raw_password", ...               |
| ADD ENPWD $pwd             | example: "add enpwd user:encrypted_password", ...       |
| REMOVE PWD $pwd            | example: "remove pwd user", ...                         |
| SAVE CONFIG                | save the backends to config file                        |
| SELECT VERSION             | display the version of Atlas                            |
+----------------------------+---------------------------------------------------------+
16 rows in set (0.00 sec)

mysql>

也可以使用工作接口來訪問,使用命令“mysql -h127.0.0.1 -P1234 -ubuck -phello”

[root@localhost bin]# mysql -h127.0.0.1 -P1234 -ubuck -phello
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.81-log

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

你可以讓數據庫某一台down掉,來測試監控的可用性。從這里可以看出我們的監控是好使的,啦啦啦啦!!

如果工作接口可以進入了,就可以在Windows平台下,使用Navicat來連接數據庫,填寫對應的host,Port,用戶名,密碼就可以

9、讀寫分離測試

這里測試讀寫分離需要使用到Jmeter了,它是Java寫第一套開源的壓力測試工具,因為這個比較方便。他有專門測試MySQL的模塊,需要使用MySQL的JDBC驅動jar包,配置很簡單,東西很好很強大很好用。

Jmeter下載地址:http://jmeter.apache.org/download_jmeter.cgi

MySQL的JDBC  :http://dev.mysql.com/downloads/connector/j/

 

下載下來后,分別都解壓開來,打開Jmeter ( 在bin路面下的jmeter.bat ) ,在測試計划中,導致JDBC的jar包

 

配置JDBC的驅動

分別做查詢與插入語句

配置好了以后,就先運行查詢操作,然后分別監控主數據庫與從數據庫所在機器的流量,來確定是否讀寫,使用“sar -n DEV 1 10000”命令來監控讀寫

先來測試寫,目前數據庫里面一條信息都沒有,開啟配置好了的Jmeter,進行寫入數據測試

主數據庫 ( 192.168.1.50 )

從數據庫 ( 192.168.1.41 )

可以看到測試插入數據的操作時,主數據庫的網卡流量很大,從數據庫的流量很小,是應為主數據是主要負責寫入的,而從數據庫主要是負責同步的。

 

查看數據庫,發現已經插入了6W多條數據了。

進行讀取數據的測試,只需要執行查詢就好,執行“select *from sbtest;”來查詢數據表

主數據庫 ( 192.168.1.50 )

從數據庫 ( 192.168.1.41 )

可以看到135(50)數據庫的流量非常大,134(41)沒有什么流量,這下就可以確定了數據是從數據庫讀取的。已經實現了讀寫分離。

 

10、MySql開啟日志監控

SHOW VARIABLES LIKE "general_log%"; 
SET GLOBAL general_log = 'ON';
show variables like 'datadir'

然后使用 BareTailProfessional 進行監控日志查看

10.1、刪除日志文件

清空該表,具體操作如下:

SET GLOBAL general_log = 'OFF';
RENAME TABLE mysql.general_log TO mysql.general_log2;
DELETE FROM mysql.general_log2;

注意:當DELETE FROM mysql.general_log2執行刪除表數據時,發現操作系統的數據文件還是存在的,需要手動刪除該數據文件,再繼續下面數據操作步驟

OPTIMIZE TABLE general_log2;
RENAME TABLE mysql.general_log2 TO mysql.general_log;
SET GLOBAL general_log = 'ON';

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM