mysql是常用的數據庫,而爲了保證數據的不丟失,mysql的主從成爲很多企業的選擇,裏面牽涉到的原理簡介如下:slave服務器通過Slave_IO_Running進程同步master數據庫的bin-log日誌,此日誌記錄了主mysql的sql操作,同步過來後slave服務器通過自己的Slave_sql——runing進程執行同步,這樣做的好處是實現了讀寫分離。下面是具體搭建過程。
我用的是centos6.4,mysql爲了簡單用yum裝好了。
1關閉防火牆,或者允許3306端口通過
2修改master服務器的my.cnf文件,我的主mysql的ip地址爲192.168.112.122
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
server-id=2
log-bin=master-log
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
修改後重啓mysql,service mysqld restart
3登錄主mysql
mysql -uroot -p123
grant replication slave on *.* to [email protected] identified by '123456';
flush privileges;
show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-log.000002 | 1408 | mysql | zabbix |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
4對slave數據庫進行配置
vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
server-id=2
log-bin=master-log
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
保存後重啓mysql數據庫
5登錄從數據庫
mysql -uroot -p12345678
stop slave;
change master to master_user='zhanghe', master_host='192.168.112.122', master_password='123456', master_port=3306, master_log_file='master-log.000002', master_log_pos=1408;
start slave;
show slave status\G;
如果 Slave_IO_Running: Yes Slave_SQL_Running: Yes則爲配置成功
5.1如果Slave_IO_Running: No,我認爲應該從三方面查看,1網絡是否通,特別是虛擬機時必須是橋接模式2my.cnf配置有誤3權限問題
5.2 如果Slave_SQL_Running:No
1.程序可能在slave上進行了寫操作
2.也可能是slave機器重起後,事務回滾造成的.
解決辦法:1.首先停掉Slave服務:slave stop
2.到主服務器上查看主機狀態:
3.到slave服務器上執行手動同步:
mysql> change master to
> master_host='master_ip',
> master_user='user',
> master_password='pwd',
> master_port=3307,
> master_log_file='mysql-bin.000020',
> master_log_pos=135617781;
1 row in set (0.00 sec)
4 start slave;show slave status\G;
6在主數據庫插入數據,看從數據庫是否有數據