mysql 5.5 配置異步複製

部分參考來自網絡。

一、異步複製基本原理:

從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,到此結束。

下次研究一下半同步複製。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章