這裏講的是Master-Slave的主從複製方式(單向複製),如果需要Master-Master模式,反過來再配置一遍就可以了。
Server的OS是CentOS6.3。
主從複製(Master-Slave Replication)配置步驟:
1. 在Master和Slave上都安裝Mysql server
兩個mysql server的配置文件/etc/my.cnf內容改爲如下,不同之處是server-id不一樣,一個是1,一個是2。
其中binlog-do-db是需要複製數據的database名字,可以配置多個(寫在多行)。
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#add for performance tuning
max_connections = 1500
expire_logs_days =2
max_connect_errors =100
binlog_format=mixed
log-bin=mysql_bin
server-id=1
binlog-do-db=dbname
binlog-do-db=dbname2
binlog-ignore-db=test
binlog-ignore-db=mysql
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
2. 爲兩個Mysql建立相同的database和table,添加用戶和權限。
create database dbname;
grant all privileges on dbname.* to `user`@`%` identified by 'pass';
grant all privileges on dbname.* to `user`@`localhost` identified by 'pass';
flush privileges;
如果是已存在的Master數據庫,table以及數據已經存在,則需要進行數據遷移,有兩種方式遷移。
2.1 用mysqldump進行數據遷移
[master-mysql]
mysqldump -uuser -ppass -A -R dbname > masterbackup.sql
[slave-mysql]
mysql -uuser -ppass dbname < masterbackup.sql
2.2 複製數據文件進行數據遷移
例如centos默認mysql的數據目錄是/var/lib/mysql
則只需要將master mysql上面的數據目錄打包,覆蓋slave mysql的數據目錄,重啓slave,就完成了數據遷移。
3. 建立數據複製
[master-mysql]
grant replication slave on *.* to `repluser`@`slave_ip` identified by 'pass' ;
運行以上命令,建立一個專門用於複製數據的用戶。
show master status;
運行以上mysql命令,得到master mysql當前的數據文件和數據bin-log位置。
得到的結果應該如下:
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 127 | | |
+------------------+----------+--------------+------------------+
[slave-mysql]
change master to master_host='master_ip',master_user='repluser',master_password='pass', master_log_file='mysql-bin.000001',master_log_pos=127;
start slave;
運行以上命令將slave連接到master上,啓動slave數據複製。
show slave status\G;
運行以上命令查看slave狀態,結果如果出現:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
則表示沒有問題,數據複製已經生效。
4. 常見問題與解決方法
4.1 如果配置都沒有問題,但是運行start slave出錯,那麼執行以下步驟:
重啓master數據庫,重新分配複製用戶權限。重新運行第3步的操作。在slave數據庫上執行:
stop slave; reset slave; start slave;
4.2 如果執行show slave status\G; 發現結果中有error,說明覆制遇到了問題,若認爲問題可以忽略,則執行:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=100; START SLAVE;
這樣可以忽略100個錯誤,視當前遇到的錯誤個數決定。
4.3 如果調用mysql的應用程序出現下面的錯誤:
Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or
READ UNCOMMITTED
則說明覆制使用的事務等級有問題,不符合應用程序的需求,解決方法是:
在配置文件/etc/my.cnf中配置 BINLOG_FORMAT=MIXED