實驗環境:
master 操作系統:redhat 5.8 64位
IP:10.15.63.86
mysql版本:5.0.77
slave 操作系統:redhat 5.8 64位
IP:10.15.63.115
mysql版本:5.0.77
目錄
一、介紹mysql主從複製好處
二、介紹mysql主從複製原理
三、配置主服務器
四、配置從服務器
五、測試主從服務效果
六、模擬主服務數據丟,利用二進制日誌進行恢復
一、介紹mysql主從複製好處
1、從服務器利用主服務器的二進制日誌,進行備份
2、可以利用mysql主從複製,實現mysql讀寫分離
二、介紹mysql主從複製原理
mysql主從複製
整體上來說,複製有3個步驟:
(1) master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events);
(2) slave將master的binary log events拷貝到它的中繼日誌(relay log);
(3) slave重做中繼日誌中的事件,將改變反映它自己的數據。
拓撲圖:
該過程的第一部分就是master記錄二進制日誌。在每個事務更新數據完成之前,master在二日誌記錄這些改變。MySQL將事務串行的寫入二進制日誌,即使事務中的語句都是交叉執行的。在事件寫入二進制日誌完成後,master通知存儲引擎提交事務。
下一步就是slave將master的binary log拷貝到它自己的中繼日誌。首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然後開始binlog dump process。Binlog dump process從master的二進制日誌中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件。I/O線程將這些事件寫入中繼日誌。
SQL slave thread(SQL從線程)處理該過程的最後一步。SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌通常會位於OS的緩存中,所以中繼日誌的開銷很小。
此外,在master中也有一個工作線程:和其它MySQL的連接一樣,slave在master中打開一個連接也會使得master開始一個線程。複製過程有一個很重要的限制——複製在slave上是串行化的,也就是說master上的並行更新操作不能在slave上並行操作。
三、配置主服務器
說明:爲了方便採用yum安裝,這裏是配置本地iso作爲yum
- 1、安裝mysql
- yum -y install mysql*
- 2、複製主配置文件
- cp /usr/share/mysql/my-huge.cnf /etc/my.cnf
- 3、修改配置文件/etc/my.cnf
- server-id = 1
- log-bin=mysql-bin
- 4、啓動mysql服務並設置root密碼
- service mysqld start
- mysqladmin -uroot password linuxsed
- 5、進入mysql添加用戶
- mysql -uroot -plinuxsed
- mysql> grant replication slave,replication client on *.* to repluser@'10.15.63.115' identified by '123456';
- Query OK, 0 rows affected (0.02 sec)
- mysql> flush privileges;
- Query OK, 0 rows affected (0.00 sec)
- 6、查看主服務器的二進制日誌當前位置
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000003 | 469 | | |
- +------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
四、配置從服務器
- 1、安裝mysql
- yum -y install mysql*
- 2、複製主配置文件
- cp /usr/share/mysql/my-huge.cnf /etc/my.cnf
- 3、修改配置文件/etc/my.cnf
- server-id = 2 #修改ID和主的不一樣
- read_only = 1 #禁止從服務器寫入
- skip-slave-start = 1 #讓從服務器的mysql服務在啓動時候不要自動啓動從服務線程
- relay-log = mysql-relay #開啓中繼日誌
- 4、啓動mysql服務並設置root密碼
- service mysqld start
- mysqladmin -uroot password linuxsed
- 5、進入mysql設置從服務器同步的相關信息
- mysql> change master to master_host='10.15.63.86',
- -> master_user='repluser',
- -> master_password='123456',
- -> master_log_file='mysql-bin.000003',
- -> master_log_pos=469;
- Query OK, 0 rows affected (0.02 sec)
- mysql> flush privileges;
- Query OK, 0 rows affected (0.00 sec)
- 6、啓動從服務器的線程
- mysql> start slave;
- Query OK, 0 rows affected (0.00 sec)
- 7、查看剛纔從服務器同步的狀態
- mysql> show slave status\G;
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 10.15.63.86
- Master_User: repluser
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000003
- Read_Master_Log_Pos: 469
- Relay_Log_File: mysql-relay.000003
- Relay_Log_Pos: 235
- Relay_Master_Log_File: mysql-bin.000003
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
五、測試主從服務效果
- 1、在主服務器上建立數據庫,建立表並插入字段
- mysql> create database linuxawk;
- Query OK, 1 row affected (0.04 sec)
- mysql> use linuxawk;
- Database changed
- mysql> create table linux(name varchar(10));
- Query OK, 0 rows affected (0.05 sec)
- mysql> insert into linux values ('sed'),('awk');
- Query OK, 2 rows affected (0.03 sec)
- Records: 2 Duplicates: 0 Warnings: 0
- 2、在從服務器查看剛纔建立的數據庫,表和字段
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | linuxawk |
- | mysql |
- | test |
- +--------------------+
- 4 rows in set (0.00 sec)
- mysql> use linuxawk;
- Database changed
- mysql> select *from linux;
- +------+
- | name |
- +------+
- | sed |
- | awk |
- +------+
- 2 rows in set (0.00 sec)
注意:mysql服務每啓動一次二進制日誌就會滾動一次,如果從服務的I/O線程是NO,可以在從服務器上進行stop slave,然後start slave,才同步。
六、模擬主服務數據丟,利用二進制日誌進行恢復
mysql二進制日誌可以利用mysqlbinlog命令進行查看
簡單例子:
mysqlbinlog mysql-bin.000007
--start-postion= 開始位置
--stop-postion= 結束位置
mysqlbinlog --start-position='107' --stop-position='1447' mysql-bin.000007
mysqlbinlog mysql-bin.000007
--start-datetime= 開始時間
--stop--datetime= 結束時
mysqlbinlog --start-datetime='2012-07-19 20:40:53' --stop-datetime='2012-07-19 20:54:06' mysql-bin.000009
下面以主服務器二進制爲例子
- 1、刪除linuxawk數據庫
- mysql> drop database linuxawk;
- Query OK, 1 row affected (0.05 sec)
- 2、查看二進制日誌
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000003 | 771 | | |
- +------------------+----------+--------------+------------------+
- 3、進入二進制日誌存放路徑 yum默認/var/lib/mysql
- cd /var/lib/mysql
- mysqlbinlog mysql-bin.000003
- 然後指定具體開始和結束位置進行查看
- mysqlbinlog --start-position='470' --stop-position='771' mysql-bin.000003
- 4、利用二進制日誌進行恢復
- mysqlbinlog --start-position='470' --stop-position='771' mysql-bin.000003 |mysql -uroot -plinuxsed
- 注意:請不要把刪除的位置也指定了
- 5、進入數據庫查看是否有數據
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | linuxawk |
- | mysql |
- | test |
- +--------------------+
- 4 rows in set (0.07 sec)
- mysql> use linuxawk;
- Database changed
- mysql> select *from linux;
- +------+
- | name |
- +------+
- | sed |
- | awk |
- +------+
- 2 rows in set (0.00 sec)
- 查看此時已經有數據了
補充:二進制日誌小知識點
1、開啓mysql二進制日誌
通過修改/etc/my.cnf修改以下兩行
log-bin=mysql-bin #定義二進制日誌名字
log-bin-index=log-bin.index #定義記錄所有二進制的名字
然後重啓mysqld服務
2、二進制日誌作用:
1、記錄了數據庫結構或者數據發生改變的日誌,但是select不會被記錄。
2、做即時點恢復,意思是指定可以利用二進制日誌進行數據的恢復,還原。
3、二進制日誌記錄的操作
記錄的操作如:
DML insert,replace,delete,update
DDL create
4、用命令查看二進制日誌是否開啓
mysql> show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
5、用命令查看正在打開二進制日誌
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 1551 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
6、用命令查看所有二進制日誌文件和大小
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 15168 |
| mysql-bin.000002 | 637054 |
| mysql-bin.000003 | 1551 |
+------------------+-----------+
3 rows in set (0.00 sec)
7、滾動二進制日誌的命令
mysql> flush logs;
Query OK, 0 rows affected (0.05 sec)
8、移除二進制日誌的命令
purge binary logs to 'log_file';
例子:
mysql> purge binary logs to 'mysql-bin.000004';
Query OK, 0 rows affected (0.04 sec)
更多的知識點請參考:http://dev.mysql.com/doc/refman/5.1/zh/