文章出處

2015年9月17日 23:00:36 update
想要好好了解mysql復制,還是去看看《高性能MySQL》(第三版)好了,上面說的比較詳細。

===========
在本地用virtualbox安裝了兩臺centos6.7服務器,配置了主從復制。兩個服務器都配置了第二塊網卡(host-only),master的ip為192.168.56.102
slave的ip為192.168.56.103

安裝

centos-6.7-minimal.iso

配置eth0網卡

默認不能上網!因為沒開啟eth0

vi /etc/sysconfig/network-scripts/ifcfg-eth0

ONBOOT=yes #修改!
MM_Controlled=no #修改!
BOOTPROTO=dhcp #不修改,就用它!
##其他沒有列出的行,用默認值,不要動!

/etc/init.d/network restart

添加網卡

cd /etc/sysconfig/network-scripts
cp ifcfg-eth0 ifcfg-eth1

vi /etc/udev/rules.d/70-persistent-net.rule #查看eth1的mac地址并復制
vi ifcfg-eth1
#修改掉mac地址
#刪除UUID  沒有這個UUID一樣可以玩!因為我并沒有找到好用的尋找到uuid的方法

關selinux

我就沒見這東西好用過!

vi /etc/selinux/config

SELINUX=disabled #!修改!

reboot #退出vim后,重啟才能生效

mysql安裝和簡單配置

yum install mysql mysql-devel mysql-server
chkconfig --add mysqld
chkconfig mysqld on  #開機自動啟動
service mysqld start

mysql_secure_installation  #安全安裝:設定root密碼,移除匿名用戶,禁用遠程登陸,刪除測試數據和訪問權限,重新加載用戶權限表

master配置

cp /etc/my.cnf /etc/my.cnf.bak  #備份
vi /etc/my.cnf

#編輯文件內容為:
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-bin=mysql-bin  #新增。表示使用二進制日志。前面的datadir則指定了binlog的存放目錄
server-id=102  #新增。用本機ip最后一段,比如192.168.56.102那么使用102


/etc/init.d/mysqld restart #重啟mysql
mysql -uroot -ppipe36#    #登陸mysql
mysql>grant replication slave, replication client on *.* to 'repl'@'192.168.56.103' identified by 'zjmos123567'
# 設定允許slave服務器使用的master帳號,允許其遠程登陸(指定了slave的ip地址),同時設定了用戶名和密碼

接下來,從數據庫中導出數據,然后傳送給slave服務器,并在slave服務器中導入sql文件。
為了確保沒有數據庫插入或者修改操作,要設定lock:

mysqldump -uroot -ppipe36# --lock-all-tables testDB > testDB.sql  #導出testDB數據庫到testDB.sql文件
mysql -u root -p

mysql>show master status; #查看狀態!重要! File字段和Position字段給slave用的!

slave配置

my.cnf中加入server-id

#[mysqld]下添加兩行
log-bin=mysql-bin #非必須
server-id=103  #一般取本及機ip最后一段

重啟mysql

service mysqld restart

導入master的sql文件

注意 master導出的文件可能只是一個數據庫的(本例),因此可能sql文件中頭部缺少兩句:

create database xxx if not exists;
use xxx;

那么需要slave登陸mysql后手動輸入這兩句,以指定數據庫名。

mysql -u root -p
source testDB.sql
change master to master_host='192.168.56.102',master_user='repl',master_password='zjmos123567',master_log_file='mysql-bin.000009',master_log_pos=901;

此處,master_user用戶是master上創建的用戶,master_password和前面master中的配置的要保持一致;master_log_file的值要和master中查詢到的master status結果中的File保持一致,master_log_pos則和Position字段保持一致。

mysql> start slave; #開啟slave
mysql> show slave status\G  #查看slave是否正常工作,主要看`Slave_IO_Running`和`Slave_SQL_Running`

還是不行?

無語了。slave的Slave_IO_Running項一直顯示NO

發現是防火墻iptable在作怪。master和slave都關掉好了:

service iptables stop
chkconfig iptables off

然后重啟動mysql服務,終于好了。

===

常見錯誤和solution

Error duplicate entry ....

因為同步出錯了。
在slave上執行:

stop slave;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;

然而,counter設置為1也還是很不靠譜的。

有時候因為mysql發生了回滾操作,因此要避開的insert失敗(錯誤代碼1062)項,有非常多。
這時候不妨在my.cnf(windows下是my.ini)中進行配置:

slave-skip-errors = 1062

然后重啟mysql服務,再看看mysql主從復制的結果。等復制好了,再把上面這條skip的配置項去掉。畢竟一直skip感覺很不安全啊。。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()