mysql之主從複製
使用mysql主從複製的好處有:
1、採用主從服務器這種架構,穩定性得以提升。如果主服務器發生故障,我們可以使用從服務器來提供服務。
2、在主從服務器上分開處理用戶的請求,可以提升數據處理效率。
3、將主服務器上的數據複製到從服務器上,保護數據免受意外的損失。
環境描述:
新企業要搭建架構爲主從複製的mysql數據庫。
主服務器(mysql-master):IP地址:192.168.1.10,mysql已安裝,沒有用戶數據。
從服務器(mysql-slave):IP地址:192.168.1.11,mysql已安裝,沒有用戶數據。
主從服務器均可正常提供服務。
主從複製配置如下:
在主服務器上192.168.1.10操作:
1)、確保/etc/my.cnf中有如下參數,沒有的話需手工添加,並重啓mysql服務。
[mysqld]
log-bin=mysql-bin 啓動二進制文件
server-id=1 服務器ID
2)、登錄mysql,在mysql中添加一個backup的賬號,並授權給從服務器。
[root@localhost ~]# mysql -uroot –p123456 登錄mysql
mysql> grant replication slave on *.* to 'backup'@'192.168.1.11' identified by 'backup'; 創建backup用戶,並授權給192.168.1.11使用。
3)、查詢主數據庫狀態,並記下FILE及Position的值,這個在後面配置從服務器的時候要用到。
在從服務器上192.168.1.11操作:
1)、確保/etc/my.cnf中有log-bin=mysql-bin和server-id=1參數,並把server-id=1修改爲server-id=10。修改之後如下所示:
[mysqld]
log-bin=mysql-bin 啓動二進制文件
server-id=10 服務器ID
另附從庫的模板:
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer = 384M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
skip-name-resolve
master-connect-retry=30
wait_timeout = 1728000
interactive-timeout = 1728000
expire_logs_days = 7
slave-skip-errors=1062
2)、重啓mysql服務。
[root@localhost ~]# mysqladmin -p123456 shutdown
[root@localhost ~]# mysqld_safe --user=mysql &
3)、登錄mysql,執行如下語句
[root@localhost ~]# mysql -uroot –p123456
mysql> change master to master_host='192.168.1.10',master_user='backup',master_password='backup',master_log_file='mysql-bin.000003',master_log_pos=401;
4)、啓動slave同步。
mysql> start slave;
5)、檢查主從同步,如果您看到Slave_IO_Running和Slave_SQL_Running均爲Yes,則主從複製連接正常。Slave_IO_Running: Yes(網絡連接狀態)Slave_SQL_Running: Yes(表結構正常)
mysql> show slave status\G
驗證配置是否正常,mysql主從能否正常複製。
在主數據庫上新建一個庫,並且在庫中寫一個表和一些數據。
[root@localhost ~]# mysql -uroot –p123456
mysql> create database mysqltest;
mysql> use mysqltest;
mysql> create table user(id int(5),name char(10));
mysql> insert into user values (00001,'zhangsan');
在從數據庫中驗證一下,是否正常複製到數據。
[root@localhost ~]# mysql -uroot –p123456
mysql> show databases;
mysql> select * from mysqltest.user;
從上圖中的結果,我們可以看到mysql主從複製已經在起作用了,我們在主數據庫中寫入的數據已經複製到我們的從數據庫中了。
四 Error:
1.Slave_SQL_Running: NO(第一種解決方法)
mysql>stop slave;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql>start slave;
2.Slave_SQL_Running: NO(表結構不正常)(第二種解決方法)
Failed to open the relay log './mysqld-relay-bin.000001' (relay_log_pos 4)
報如上錯誤,就是Slave裏面的二進制表沒有和Master的二進制表同步。
解決方法:
登入Master數據庫:
mysql>show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 | 866 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
記住file(master-bin.000003)和Position(866)
mysql> flush tables with read lock;(先鎖住主庫表)
[root@mysql1 ~]# mysqldump -u root -p --all-database > mysql.sql(導出數據庫文件)
[root@mysql1 ~]#scp mysql.sql 192.168.1.222:/root/(把數據庫文件傳到Slave數據庫)
[root@mysql2 mysql]# mysql -u root -p --all-database < mysql.sql(導入數據庫文件)
登入Slave數據庫:
mysql> stop slave;(停止Slave的複製功能)
mysql> reset slave;(重置slave)
Query OK, 0 rows affected (0.00 sec)
mysql> change master to master_host='192.168.1.221',master_user='lsh',master_password='123456',master_log_file='master-bin.000003',master_log_pos=866;
Query OK, 0 rows affected (0.05 sec)
mysql>start slave;(開啓Slave的複製功能)
mysql>show slave status\G(查看狀態,IO和SQL都爲YES)
登入Master數據庫
mysql>unlock tables;(解除表鎖定)
mysql>create database etongbao;
登入Master數據庫
mysql>show databases;
查看複製情況,如果有表示複製成功。
2 start slave後, Slave_IO_Running和Slave_SQL_Running的狀態都爲No,並且日誌中報類似“Slave I/O thread: Failed reading log event, reconnecting to retry, log 'tc-nsop-test00-bin.000177' position 1019586208”的錯誤
答:這是由於主庫對從庫的同步帳號授權不正確造成的,更改並確認授權正確之後,重新start slave,就可以正常同步。
3 如果錯誤日誌中出現如下提示“Warning: You should set server-id to a non-0 value if master_host is set; we force server id to 2, but this MySQL server will not act as a slave.”,並且 Slave_IO_Running和Slave_SQL_Running的狀態都爲No
答:檢查主庫的my.cnf,這樣的錯誤是由於沒有設置主庫的server id或者server id不合法造成的。更改主庫server id並重啓主庫後,start slave,同步可以恢復正常。
4 如果Slave_SQL_Running狀態爲No,並且錯誤日誌中有類似“Error 'Lock wait timeout exceeded; try restarting transaction' on query. Default database: ……”這樣的錯誤
答:這是由於同步某個行的時候恰好遇到有其他SQL進程對該行進行了鎖定,並且鎖定時間較長導致同步進程等待超時。直接start slave即可。
5 同時啓動多臺從庫的同步進程對主庫有什麼影響
答:通常情況會導致主庫的io和網卡流量增加。MySQL的Binlog Dump進程是沒有限速的,因此會全速進行binlog讀取和數據分發,給主庫帶來較大的負擔。在實際操作中,儘量依次啓動從庫,並在啓動後觀察主庫io,確保Binlog Dump進程讀取完binlog後,再啓動下一臺。
使用mysql主從複製的好處有:
1、採用主從服務器這種架構,穩定性得以提升。如果主服務器發生故障,我們可以使用從服務器來提供服務。
2、在主從服務器上分開處理用戶的請求,可以提升數據處理效率。
3、將主服務器上的數據複製到從服務器上,保護數據免受意外的損失。
環境描述:
新企業要搭建架構爲主從複製的mysql數據庫。
主服務器(mysql-master):IP地址:192.168.1.10,mysql已安裝,沒有用戶數據。
從服務器(mysql-slave):IP地址:192.168.1.11,mysql已安裝,沒有用戶數據。
主從服務器均可正常提供服務。
主從複製配置如下:
在主服務器上192.168.1.10操作:
1)、確保/etc/my.cnf中有如下參數,沒有的話需手工添加,並重啓mysql服務。
[mysqld]
log-bin=mysql-bin 啓動二進制文件
server-id=1 服務器ID
2)、登錄mysql,在mysql中添加一個backup的賬號,並授權給從服務器。
[root@localhost ~]# mysql -uroot –p123456 登錄mysql
mysql> grant replication slave on *.* to 'backup'@'192.168.1.11' identified by 'backup'; 創建backup用戶,並授權給192.168.1.11使用。
3)、查詢主數據庫狀態,並記下FILE及Position的值,這個在後面配置從服務器的時候要用到。
mysql> show master status;
在從服務器上192.168.1.11操作:
1)、確保/etc/my.cnf中有log-bin=mysql-bin和server-id=1參數,並把server-id=1修改爲server-id=10。修改之後如下所示:
[mysqld]
log-bin=mysql-bin 啓動二進制文件
server-id=10 服務器ID
另附從庫的模板:
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer = 384M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
skip-name-resolve
master-connect-retry=30
wait_timeout = 1728000
interactive-timeout = 1728000
expire_logs_days = 7
slave-skip-errors=1062
2)、重啓mysql服務。
[root@localhost ~]# mysqladmin -p123456 shutdown
[root@localhost ~]# mysqld_safe --user=mysql &
3)、登錄mysql,執行如下語句
[root@localhost ~]# mysql -uroot –p123456
mysql> change master to master_host='192.168.1.10',master_user='backup',master_password='backup',master_log_file='mysql-bin.000003',master_log_pos=401;
4)、啓動slave同步。
mysql> start slave;
5)、檢查主從同步,如果您看到Slave_IO_Running和Slave_SQL_Running均爲Yes,則主從複製連接正常。Slave_IO_Running: Yes(網絡連接狀態)Slave_SQL_Running: Yes(表結構正常)
mysql> show slave status\G
驗證配置是否正常,mysql主從能否正常複製。
在主數據庫上新建一個庫,並且在庫中寫一個表和一些數據。
[root@localhost ~]# mysql -uroot –p123456
mysql> create database mysqltest;
mysql> use mysqltest;
mysql> create table user(id int(5),name char(10));
mysql> insert into user values (00001,'zhangsan');
在從數據庫中驗證一下,是否正常複製到數據。
[root@localhost ~]# mysql -uroot –p123456
mysql> show databases;
mysql> select * from mysqltest.user;
從上圖中的結果,我們可以看到mysql主從複製已經在起作用了,我們在主數據庫中寫入的數據已經複製到我們的從數據庫中了。
四 Error:
1.Slave_SQL_Running: NO(第一種解決方法)
mysql>stop slave;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
mysql>start slave;
2.Slave_SQL_Running: NO(表結構不正常)(第二種解決方法)
Failed to open the relay log './mysqld-relay-bin.000001' (relay_log_pos 4)
報如上錯誤,就是Slave裏面的二進制表沒有和Master的二進制表同步。
解決方法:
登入Master數據庫:
mysql>show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 | 866 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
記住file(master-bin.000003)和Position(866)
mysql> flush tables with read lock;(先鎖住主庫表)
[root@mysql1 ~]# mysqldump -u root -p --all-database > mysql.sql(導出數據庫文件)
[root@mysql1 ~]#scp mysql.sql 192.168.1.222:/root/(把數據庫文件傳到Slave數據庫)
[root@mysql2 mysql]# mysql -u root -p --all-database < mysql.sql(導入數據庫文件)
登入Slave數據庫:
mysql> stop slave;(停止Slave的複製功能)
mysql> reset slave;(重置slave)
Query OK, 0 rows affected (0.00 sec)
mysql> change master to master_host='192.168.1.221',master_user='lsh',master_password='123456',master_log_file='master-bin.000003',master_log_pos=866;
Query OK, 0 rows affected (0.05 sec)
mysql>start slave;(開啓Slave的複製功能)
mysql>show slave status\G(查看狀態,IO和SQL都爲YES)
登入Master數據庫
mysql>unlock tables;(解除表鎖定)
mysql>create database etongbao;
登入Master數據庫
mysql>show databases;
查看複製情況,如果有表示複製成功。
2 start slave後, Slave_IO_Running和Slave_SQL_Running的狀態都爲No,並且日誌中報類似“Slave I/O thread: Failed reading log event, reconnecting to retry, log 'tc-nsop-test00-bin.000177' position 1019586208”的錯誤
答:這是由於主庫對從庫的同步帳號授權不正確造成的,更改並確認授權正確之後,重新start slave,就可以正常同步。
3 如果錯誤日誌中出現如下提示“Warning: You should set server-id to a non-0 value if master_host is set; we force server id to 2, but this MySQL server will not act as a slave.”,並且 Slave_IO_Running和Slave_SQL_Running的狀態都爲No
答:檢查主庫的my.cnf,這樣的錯誤是由於沒有設置主庫的server id或者server id不合法造成的。更改主庫server id並重啓主庫後,start slave,同步可以恢復正常。
4 如果Slave_SQL_Running狀態爲No,並且錯誤日誌中有類似“Error 'Lock wait timeout exceeded; try restarting transaction' on query. Default database: ……”這樣的錯誤
答:這是由於同步某個行的時候恰好遇到有其他SQL進程對該行進行了鎖定,並且鎖定時間較長導致同步進程等待超時。直接start slave即可。
5 同時啓動多臺從庫的同步進程對主庫有什麼影響
答:通常情況會導致主庫的io和網卡流量增加。MySQL的Binlog Dump進程是沒有限速的,因此會全速進行binlog讀取和數據分發,給主庫帶來較大的負擔。在實際操作中,儘量依次啓動從庫,並在啓動後觀察主庫io,確保Binlog Dump進程讀取完binlog後,再啓動下一臺。