一.安裝
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_file和master_log_pos就是配置主數據庫查詢到的File和Position
啟動從庫
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-32bit的bin目錄中,雙擊運行
接下來,用你的客戶端工具連接 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';