這兩天進行項目中經常出現大量的對資料庫的讀寫操作,資料庫壓力頗大,便想着配置一下mysql的主從資料庫,下面與大家分享整個配置步驟已及裡面遇到的坑。
Mysql主從實驗
首先介紹主從的概念
主 – 主機,負責對資料庫的讀寫操作,資料類型主要是innordb
從 – 從機,負責對資料庫的讀操作,資料庫類型主要是myisam
主從複制即是從機拷貝主機的資料,而使用者對資料庫的讀操作隻通過從機即可,因為myisam的的強大之處在于讀操作,一個主機可以配置多個從機。
操作步驟
1.MYSQL主從配置
1.1 部署環境
主(master_mysql): 192.168.1.200 OS:CentOS 7.2
從(slave_mysql): 192.168.1.201 OS:CentOS 7.2
1.2 安裝mysql
基本操作。。應該都會
好吧,還是貼一下
yum install mysql-server
要有兩個伺服器啊啊啊啊,兩個都要安裝啊啊啊啊……
1.3配置
1.3.1主配置
vim /etc/my.cnf
```
```
server-id=200 #設定主伺服器的ID
innodb_flush_log_at_trx_commit=2 #作業系統崩潰或者系統斷電的情況下,上一秒鐘所有事務資料才可能丢失
sync_binlog=1 #開啟binlog日志同步功能
log-bin=mysql-bin-200 #binlog日志檔案名
binlog-do-db=xxxx # 這個表示隻同步某個庫 (如果沒有此項,表示同步所有的庫)
1.3.2 配置完後,重新開機主庫的mysql
service mysqld restart
mysql -uroot -p ##登入mysql
mysql>grant replication slave on **.** to 'mark'@'192.168.1.201' identified by '123456'; ##授權給從資料庫伺服器192.168.1.201,使用者名mark,密碼123456
mysql>show master status ; ##檢視主庫的狀态
+------------------+----------+--------------+
| File | Position | Binlog_Do_DB |
+------------------+----------+--------------+
| mysql-bin.000009 | 1805 | fwwb |
+------------------+----------+--------------+
1.3.3 配置從庫伺服器
vim /etc/my.cnf
server-id=201
innodb_flush_log_at_trx_commit=2
sync_binlog=1
log-bin=mysql-bin-201
1.3.4 配置完後,重新開機從庫的mysql
service mysqld restart
mysql -uroot -p
mysql> change master to master_host='192.168.1.200', master_user='mark' ,master_password='123456', master_log_file='mysql-bin-200.000002' ,master_log_pos=1167;
mysql> start slave; ##開啟從庫 (stop slave:關閉從庫)
mysql> show slave status; ###Slave_IO_Running,Slave_SQL_Running 都為Yes的時候表示配置成功
1.4:驗證主從
可以在主庫上的表裡修改一個資料,看看從庫裡對應的地方有沒有更新
對于大佬來說,這篇文章到這就沒有意義了……
對我這種小白來說,這才是剛開始啊啊啊!!
2.配置中遇到的坑(水準不夠導緻的錯誤)
在配置完後,使用
show slave status;
指令檢視從資料庫狀态,果不其然的……報錯了;
Slave_IO_Running: No;
2.1 server_ids
仔細看了下錯誤資訊,顯示
master and slave have equal MySQL server ids;
字面上看,是serverids相同,改成不同的就好了。但是我在my.cnf裡設定的完全就是兩個id啊……
然後,百度了一下才發現,原來serverids跟配置檔案裡的server-id不一樣,好吧原來是my.cnf的配置沒起作用,然後我才想起來,主從資料庫的配置是要寫到
【mysqld】
标簽下的,好吧,改了配置檔案依舊報錯。于是使用指令檢視server_ids;
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.00 sec)
發現兩個伺服器server_id都是1,于是使用指令
mysql> set global server_id=2;
将其中一個改成2,就好了。
2.2 日志檔案
此時繼續報錯
Could not find first log file name in binary log index file
Master上檢視binlog的資訊:
mysql> show variables like 'log_bin%';
+---------------------------------+---------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------+
| log_bin | ON |
| log_bin_basename | /data/logs/mysql-bin |
| log_bin_index | /data/logs/mysql-bin.index |
| log_bin_trust_function_creators | ON |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+---------------------------------+
mysql>system more /data/logs/mysql-bin.index
/data/logs/mysql-bin.000008
對比發現從資料庫讀的是mysql-bin.000001,于是使用指令
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008',MASTER_LOG_POS=0;
此處注意master_log_pos可設定為0,這樣mysql會自動比對
然後重新啟動主從資料庫
再次檢視從庫狀态
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
此時slave_io_running和slave_sql_running 都是yes,在主資料庫更新一條資料,從庫同步更新完成,至此完成整個主從資料庫配置過程。
需要注意的是有些操作需要先關閉主從同步,文中并未明确指出,讀者操作時需依據自身情況調整指令的使用。