mysql之主從複製

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的值,這個在後面配置從服務器的時候要用到。

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後,再啓動下一臺。


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