部分參考來自網絡。
一、異步複製基本原理:
從MySQL3.23.15以後,MySQL支持單向的異步複製。也就是說,1臺MySQL服務器充當Master(主庫),1臺或多臺MySQL服務器充當Slaves(從庫),數據從Master向Slaves進行異步複製。注意,這種複製是異步的,有別於MySQL的同步複製實現(這種實現稱做MySQL集羣,MySQL Cluster)。
當主庫有更新的時候,主庫會把更新操作的SQL寫入二進制日誌(Binlog),並維護一個二進制日誌文件的索引,以便於日誌文件輪迴(Rotate)。在從庫啓動異步複製的時候,從庫會開啓兩個I/O線程,其中一個線程連接主庫,要求主庫把二進制日誌的變化部分傳給從庫,並把傳回的日誌寫入本地磁盤。另一個線程則負責讀取本地寫入的二進制日誌,並在本地執行,以反映出這種變化。較老的版本在複製的時候只啓用一個I/O線程,實現這兩部分的功能。
有幾個關鍵性的地方需要注意:
- 主庫必須啓用Bin log,主庫和從庫必須有唯一的Server Id
- 從庫必須清楚瞭解從主庫的哪一個Bin log文件的哪一個偏移位置起開始複製
- 從庫可以從主庫只複製指定的數據庫,或者數據庫的某些數據表
- 主庫和從庫的數據庫名稱可以不一樣,不過還是推薦使用一樣的名稱
- 主庫和從庫的MySQL版本需保持一致
二、安裝:
1、下載相關壓縮包,從5.5開始mysql開始使用cmake編譯安裝。
2、下載cmake壓縮包,編譯安裝。
# tar zxvfcmake-2.8.12.2.tar.gz
# cdcmake-2.8.12.2
#.configure
# make&& make install
3、安裝mysql,開始時下載的是如下選項,用cmake編譯時出現異常:
CMake Error: The source directory “*” does not appear to contain CMakeList
重新下載源碼包:
4、創建相關安裝目錄
Mysql安裝目錄:
mkdir -p/usr/local/mysql/
數據存放目錄
mkdir -p/data/mysql/
5、創建用戶和用戶組與賦予數據存放目錄權限
groupadd mysql
useradd -g mysqlmysql
chownmysql.mysql -R /data/mysql/
6、編譯。使用編譯配置信息如下(注意utf8_general_ci不要寫錯。網上有些錯的):
cmake .-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1\-DMYSQL_TCP_PORT=3306 \
-DEXTRA_CHARSETS=all\-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DMYSQL_USER=mysql \-DWITH_DEBUG=0
7、安裝:make && make install
8、複製配置文件:
cp support-files/my-large.cnf /etc/my.cnf
cp support-files/mysql.server/etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
9、初始化數據庫:
cd /usr/local/mysql
bash scripts/mysql_install_db --user=mysql--basedir=/usr/local/mysql --datadir=/data/mysql/
注意上面命令的空格和拼寫。
10、啓動mysql服務:
/etc/init.d/mysqldstatus (查看狀態)
/etc/init.d/mysqldstart (啓動服務)
(設置root密碼)
/usr/local/mysql/bin/mysqladmin-u root password '123456'
11、 配置自啓動和環境變量:
echo"/usr/local/mysql/bin/mysqld_safe --user=mysql &">>/etc/rc.local
echo"export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
source/etc/profile
12、 問題:[root@localhost mysql]# service mysql start
Starting MySQL.. ERROR! The server quit without updating PID file(/var/lib/mysql/localhost.localdomain.pid).
類似問題,大部分的答案都是:
1. 註釋/etc/my.cnf裏的skip-federated註釋掉即#skip-federated;
2. my.cnf文件配置過高,重新定義其中的參數(根據服務器情況定義);
3. 殺掉mysql_safe和mysqld進程,然後再重啓;
4. 當前日誌文件過大,超出了my.cnf中定義的大小(默認爲64M),刪除日誌文件再重啓;
5. 其他情況,查看日誌文件(我的是localhost.localdomain.err,具體因人而異),然後具體分析;
我採用了第二條問題解決。
三、配置異步複製:
1、修改 slav 服務器的 server-id(master 服務器不變)
/etc/my.cnf
server-id = 10
2、授權(在 master 服務器上操作)
mysql> GRANTREPLICATION SLAVE ON *.*
-> TO'backup'@'192.168.0.102' IDENTIFIED BY 'backup';
Query OK, 0 rowsaffected (0.00 sec)
mysql> showmaster status; //主數據庫狀態,類似
+------------------+----------+--------------+------------------+
| File |Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
|mysql-bin.000003 | 401 | | |
+------------------+----------+--------------+------------------+
3、配置 slave 服務器
mysql> changemaster to
->master_host='192.168.0.101',
->master_user='backup',
->master_password='backup',
->master_log_file='mysql-bin.000003',
->master_log_pos=401;
Query OK, 0 rowsaffected (0.00 sec)
mysql> startslave;
Query OK, 0 rowsaffected (0.00 sec)
查看一下同步狀態:
mysql> showslave status\G
***************************1. row ***************************
Slave_IO_State:Waiting for master to send event
Master_Host:192.168.0.101
Master_User:replication
Master_Port:3306
Connect_Retry:60
Master_Log_File:mysql-bin.000003
Read_Master_Log_Pos:401
Relay_Log_File: XXX-relay-bin.000002
Relay_Log_Pos:253
Relay_Master_Log_File:mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos:401
Relay_Log_Space:411
Until_Condition:None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed:No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:0
Master_SSL_Verify_Server_Cert:No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno:0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id:1
1 row in set(0.00 sec)
注意:slave_IO進程及 slave_SQL 進程都必須正常運行
四、測試驗證:
主從複製測試:在master 數據庫服務器上創建庫和表,然後再插入記錄,再登
陸到 slave 服務器,看是否也建立相一致的庫和表以及記錄。
mysql> create database test_db;
Query OK, 1 row affected (0.00 sec)
mysql> use test_db;
Database changed
mysql> create table test_table(idint(5),name char(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test_table
-> values(01,aaa);
Query OK, 1 row affected (0.00 sec)
現在登錄 slave 數據庫服務器,看是否成功同步。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| test_db |
+--------------------+
4 rows in set (0.02 sec)
mysql> use test_db;
Database changed
mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| test_table |
+-------------------+
1 row in set (0.00 sec)
mysql> select * from test_table;
+------+--------+
| id | name |
+------+--------+
| 1 | aaa |
+------+--------+
1 row in set (0.00 sec)
OK,到此結束。
下次研究一下半同步複製。