IP規劃:
mysql主:192.168.0.100
mysql從:192.168.0.200
my.cnf配置
主mysql中的[mysqld]項裡除了要配置相關參數以外還要配置必要的三項,現將一個最簡單的示例:
[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
basedir=/usr
datadir=/var/lib/mysql
tmpdir=/tmp
log-bin=master-bin
log-bin-index=master-bin.index
server-id=1
備機相應的配置如下:
[mysqld]
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
basedir=/usr
datadir=/var/lib/mysql
tmpdir=/tmp
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
注:relay項配置的是中繼日志和中繼索引文件,如果二進制日志文件和中繼日志文件名不指定,則默認使用主機名。推薦進行自定義。
重啟mysql使上面的配置生效。
在主mysql上新建一個用於復制權限的用戶:
mysql> grant replication slave on *.* to 'repl'@'%' identified by 'mysqls';
上面新建的為用戶名repl,密碼為mysqls的用戶。當然出於安全考慮,可以修改句中的%號為指定主機。
Query OK, 0 rows affected (0.00 sec)
當出現上面的提示時,表示已新建用戶成功。
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000004 | 224 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
在備mysql上指定復制主機的相關信息,並指定要復制的二進制文件和log號
mysql> change master to master_host='192.168.0.100',master_user='repl',master_password='mysqls',master_log_file='master-bin.000004',master_log_pos=224;
master_host這一項的值建議使用主機名,因為如果遇到IP地址變更的,主機名一般不會變更,所以還是生效的。但IP變了,這裡還是用的IP ,就會導致主機無法找到對應的主設備。
啟用slave狀態
mysql> start slave;
使用show slave status查看是否配置成功:
mysql> show slave status;
結果太多,我這裡就不再復制,但主機看下面的兩處,如果看到值是yes,表示已經成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
驗證數據的同步:
主mysql上進行建庫,建表,並插入測試數據:
mysql> create database repl;
mysql> create table my(id int(3),name char(10));
mysql> insert into first_tb values (001,'test');
以上操作在主機上每操作一步,都可以在備機上看到也有相應的庫、表、值的增加。
干脆來個狠的,在主mysql上利用批處理,加入1000條數據:
測試數據
#!/bin/bash
for (( i=0;i<1000;i++))
do
m=`tr -dc A-Z-a-z</dev/urandom |head -c 5`
mysql -uroot -ptest repl -e"insert into my values ($i,'"$m"')"
done
在備機上:
對應上面的主機的操作,都可以查看到相應的數據。
mysql> show databases;
mysql> use repl;
mysql> show tables;
mysql> select * from my;
上面的操作都是在主機和備機都是在一個全新安裝的環境下進行的測試。而在生產環境中要使用時,先要將雙方要同步的數據庫同容進行同步。而如果主數據還有應用在使用時,還要刷新數據庫並銷定數據庫。
mysql>flush tables with read lock;
先利用mysqldump導出所有的數據,並導入到備機。
完成後,再在主mysql上解鎖
mysql>unlock tables;
當然如果數據量很大的情況下,利用mysqldump處理是很慢的,這裡建議使用復制物理文件進行數據同步。
同步操作和上面的相同。
上面的mysql操作同步是對所有庫的完全同步,也包括mysql、information_schema這兩個庫的數據。如果要指定同步的數據庫和忽略的數據庫還要用到四個參數:
binlog-do-db=repl
binlog_ignore_db=mysql
binlog_ignore_db=information_schema
replicate-do-db=repl
replicate-wild-ignore-table=mysql
replicate-wild-ignore-table=information_schema
當然上面的四個參數使用的時候是有講究的,使用不當還是有風險的。回頭再專門做一個總結吧!