自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

手把手教你實現(xiàn)MySQL雙機數(shù)據(jù)同步

數(shù)據(jù)庫 MySQL 數(shù)據(jù)庫運維
假設(shè)目前有兩臺 MySQL 數(shù)據(jù)庫服務(wù)器,如何實現(xiàn)這兩臺機器的數(shù)據(jù)同步問題?很多朋友一開始接觸MySQL雙機同步需求的時候可能會感到不知道從哪里入手,事實上這是MySQL本身就支持的功能之一。本文提供有關(guān)MySQL主從同步的初步思路,供大家參考。

編者按:很多朋友一開始接觸MySQL雙機同步需求的時候可能會感到不知道從哪里入手,事實上這是MySQL本身就支持的功能之一。本文提供有關(guān)MySQL主從同步的初步思路,供大家參考。

一.需求問題

假設(shè)目前有兩臺 MySQL 數(shù)據(jù)庫服務(wù)器,如何實現(xiàn)這兩臺機器的數(shù)據(jù)同步問題?即在一臺機器上修改數(shù)據(jù)庫后,另一臺機器會同步更新所修改的信息。

二.解決方案

查資料發(fā)現(xiàn) MySQL 支持單向,異步復(fù)制,復(fù)制過程中一個服務(wù)器充當(dāng)主服務(wù)器,而另一個或多個其他服務(wù)器充當(dāng)從服務(wù)器。

原理是這樣的:

主服務(wù)器將更新寫入二進(jìn)制日志文件,并維護(hù)文件的一個索引來跟蹤日志循環(huán)。這些日志可以記錄發(fā)送到從服務(wù)器的更新。當(dāng)一個從服務(wù)器連接主服務(wù)器時,它通知主服務(wù)器從服務(wù)器在日志中讀取的最后一次成功更新的位置。從服務(wù)器接受從那時起發(fā)生的任何更新,然后封鎖并等待主服務(wù)器通知新的更新。

2.1 測試環(huán)境

  1. Master : 192.168.7.67 (CentOS 5.5  x86_64 )   MySQL Version  :  5.0.77  
  2. Slave: 192.168.56.103 (CentOS 5.3 i386)  MySQL  Version : 5.0.45 

備注:

Master 和 slave 端的 MySQL 版本最好要一樣的,或者 Master 端的版本高于 Slave 端

2.2 配置過程

2.2.1 Master 端設(shè)置

開啟 MySQL 服務(wù)并新建一個測試數(shù)據(jù)庫 abc:

  1. root@camlit ~: /etc/init.d/mysqld start   
  2. jian.ma@camlit  ~: mysql -u root -p   
  3. Enter password: xxxx  
  4. Welcome to the MySQL monitor.  Commands end with ; or \g.   
  5. Your MySQL connection id is 3   
  6. Server version: 5.0.77 Source distribution   
  7.  
  8. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.   
  9.  
  10. mysql> create database abc;   
  11. Query OK, 1 row affected (0.31 sec)  
  12.  
  13. ###創(chuàng)建一個用來同步的用戶,指定只能在 192.168.56.103 登錄  
  14. ###REPLICATION SLAVE: Enable replication slaves to read binary log events from the master  
  15.  
  16. mysql> grant replication slave on *.* to 'test1'@'192.168.56.103' identified by 'test1';   
  17. Query OK, 0 rows affected (0.16 sec)  

修改配置文件:

  1. root@camlit ~: vi /etc/my.cnf 

備注:在修改配置文件之前做好該文件的備份工作。

  1. [mysqld]   
  2. datadir=/var/lib/mysql   
  3. socket=/var/lib/mysql/mysql.sock   
  4. user=mysql   
  5. old_passwords=1   
  6.  
  7. ##增加下面內(nèi)容  
  8. server_id=1###1 表示 master, 2 表示 slave   binlog-do-db=abc ###需要同步的數(shù)據(jù)庫,如果有多個數(shù)據(jù)庫,每個數(shù)據(jù)庫一行  binlog-ignore-db=mysql###不需要同步的數(shù)據(jù)庫 log-bin=mysql-bin   
  9.    
  10. [mysqld_safe]   
  11. log-error=/var/log/mysqld.log   
  12. pid-file=/var/run/mysqld/mysqld.pid  

重啟服務(wù):

  1. root@camlit ~: /etc/init.d/mysqld restart  

2.2.2  Slave 端設(shè)置

和 master 端一樣創(chuàng)建一個相同的數(shù)據(jù)庫: abc

  1. Enter password:   
  2. Welcome to the MySQL monitor.  Commands end with ; or \g.   
  3. Your MySQL connection id is 5   
  4. Server version: 5.0.45-log Source distribution   
  5.    
  6. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.   
  7.    
  8. mysql> create database abc;   
  9. Query OK, 1 row affected (0.31 sec) 

修改配置文件:

  1. root@test2 ~: vi /etc/my.cnf 

 

  1. [mysqld]   
  2. datadir=/var/lib/mysql   
  3. socket=/var/lib/mysql/mysql.sock   
  4. user=mysql   
  5. old_passwords=1   
  6.    
  7. ###增加下面內(nèi)容  
  8. server_id=2   log-bin=mysql-bin   master-host=192.168.7.67   master-user=test1   master-password=test1   master-port=3306   master-connect-retry=10  ###連接次數(shù)  replicate-do-db=abc   ###接受的數(shù)據(jù)庫名  replicate-ignore-db=mysql  ###不要接受的數(shù)據(jù)庫  
  9.    
  10. [mysqld_safe]   
  11. log-error=/var/log/mysqld.log   
  12. pid-file=/var/run/mysqld/mysqld.pid  

重啟服務(wù):

  1. root@test2~: /etc/init.d/mysqld restart  

備注:

配置成功 后會在 mysql 目錄(/var/lib/mysql/)下生成 master.info 文件,如果要更改 slave 設(shè)置,要先將該文件刪除才會起作用。

進(jìn)入 mysql,輸入下面命令:

  1. root@test2~: mysql -u root -p  
  2. Enter password:   
  3. Welcome to the MySQL monitor.  Commands end with ; or \g.   
  4. Your MySQL connection id is 4   
  5. Server version: 5.0.45-log Source distribution   
  6.    
  7. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.   
  8.    
  9. mysql> slave start;   
  10. Query OK, 0 rows affected, 1 warning (0.00 sec)   
  11. ###查看同步情況  
  12. mysql > show slave status;  或 show master status;  

2.3 結(jié)果測試

在 Master 端進(jìn)行數(shù)據(jù)庫 abc 的一些操作,如下所示:

  1. jian.ma@camlit ~: mysql  -u root -p   
  2. Enter password:   
  3. Welcome to the MySQL monitor.  Commands end with ; or \g.   
  4. Your MySQL connection id is 3   
  5. Server version: 5.0.77-log Source distribution   
  6.    
  7. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.   
  8.    
  9. mysql> use abc;   
  10. Database changed   
  11. mysql> create table test1 (IP VARCHAR(20),USER VARCHAR(100), MAIL   
  12. VARCHAR(100));   
  13. Query OK, 0 rows affected (1.20 sec)   
  14. mysql> insert into test1(IP,USER,MAIL) values('192.168.7.66''test''test@test.com.cn');   
  15. Query OK, 1 row affected (0.06 sec)  

在 Slave 端查看是否能夠更新:

  1. root@test2 ~: mysql -u root -p   
  2. Enter password:   
  3. Welcome to the MySQL monitor.  Commands end with ; or \g.   
  4. Your MySQL connection id is 6   
  5. Server version: 5.0.45-log Source distribution   
  6.    
  7. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.   
  8.    
  9. mysql> show databases;   
  10. +--------------------+   
  11. Database   |   
  12. +--------------------+   
  13. | information_schema |   
  14. | foo|   
  15. | mysql  |   
  16. | test   |   
  17. |abc  |   
  18. +--------------------+   
  19. 5rows in set (0.00 sec)   
  20. mysql> use abc;   
  21. Reading table information for completion of table and column names   
  22. You can turn off this feature to get a quicker startup with -A   
  23. Database changed   
  24. mysql> show tables;   
  25. +---------------+   
  26. | Tables_in_abc |   
  27. +---------------+   
  28. | test1 |   
  29. +---------------+   
  30. 1 row in set (0.03 sec)   
  31.  mysql> select * from test1;   
  32. +--------------+------+------------------+   
  33. | IP   | USER | MAIL |   
  34. +--------------+------+------------------+   
  35. | 192.168.7.66 | test | test@test.com.cn |   
  36. +--------------+------+------------------+   
  37. 1 row in set (0.00 sec)  

從上面的結(jié)果可以看到 Master 端的數(shù)據(jù)可以同步到 Slave 端里面。說明此時主從數(shù)據(jù)庫的同步問題已經(jīng)成功解決。

#p#

三.補充資料

關(guān)于如何連接到遠(yuǎn)程 MySQL 問題,可以采取下面的步驟:

首先先登錄到遠(yuǎn)程機器:

  1. jian.ma@camlit ~: ssh root@192.168.56.103   
  2. password: xxx  
  3. root@test2 ~:  

編輯配置文件:

  1. root@test2 ~: vi /etc/my.cnf  

增加下面一行內(nèi)容:

  1. [mysqld]   
  2. datadir=/var/lib/mysql   
  3. socket=/var/lib/mysql/mysql.sock   
  4. user=mysql   
  5. old_passwords=1   
  6. bind-address=192.168.56.103###此 IP 地址為 MySQL 本機的 IP 地址  
  7. [mysqld_safe]   
  8. log-error=/var/log/mysqld.log   
  9. pid-file=/var/run/mysqld/mysqld.pi 

重啟服務(wù):

  1. root@test2 ~: /etc/init.d/mysqld restart  

創(chuàng)建測試數(shù)據(jù)庫:

  1. root@test2 ~: mysql -u root -p  
  2. Enter password:   
  3. Welcome to the MySQL monitor.  Commands end with ; or \g.   
  4. Your MySQL connection id is 2   
  5. Server version: 5.0.45 Source distribution   
  6.    
  7. Type 'help;' or '\h' for help. Type '\c' to clear the buffer.   
  8.    
  9. mysql> create database foo ;  
  10. Query OK, 1 row affected (0.00 sec)   
  11. ###增加用戶 test123 從任何主機登錄到 MySQL  
  12. mysql> grant all privileges on *.* to 'test123'@'%' identified by 'test123' with grant  option;   
  13. Query OK, 0 rows affected (0.00 sec)   
  14. ###增加用戶 test1 從 192.168.7.67 主機登錄到 MySQL  
  15. mysql> grant all privileges on foo.* to 'test1'@'192.168.7.67' identified by 'test1' with grant   option;   
  16. Query OK, 0 rows affected (0.00 sec)  

如果有防火墻的設(shè)置的話,可以如下設(shè)置:

  1. root@test2 ~: iptables -A INPUT -i eth0 -s 192.168.7.67 -p tcp --dport 3306 -j ACCEPT   
  2. root@test2~: /etc/init.d/iptales save  

最后在客戶端就可以輸入下面命令來遠(yuǎn)程進(jìn)入 MySQL 數(shù)據(jù)庫:

  1. jian.ma@camlit ~: mysql -u test1 -h 192.168.56.103 -p   
  2. Enter password:   
  3. Welcome to the MySQL monitor.  Commands end with ; or \g.   
  4. Your MySQL connection id is 13   
  5. Server version: 5.0.45 Source distribution   
  6. Type 'help;' or '\h' for help. Type '\c' to clear the buffer. 

mysqld.pl內(nèi)容如下:

  1. #!/usr/bin/perl 
  2.  
  3. #This script is used to check if the mysql replication is ok 
  4.  
  5. use strict; 
  6. use DBI; 
  7. use POSIX "strftime"
  8.  
  9. my $host           = "192.168.56.103"
  10. my $user           = "test1"
  11. my $passwd         = "test1"
  12. my $port           = "3306"
  13. my $max_behind     = "120"
  14. my $check_log      = "./mysql_check.log"
  15.  
  16.  
  17. #Open the log file  
  18. open (FH, ">> $check_log"or die $!; 
  19.  
  20. #Connect the mysql server  
  21. my $dbh = &MysqlConnect ($host, $port, $user, $passwd); 
  22.  
  23.  
  24. #Get slave sql status 
  25. my $slave_status = &MysqlQuery( $dbh, 'show slave status'); 
  26. print FH "Error: SQL Query Error:" . $dbh->errstr; 
  27.  
  28.  
  29. my $slave_IO              = $slave_status->{Slave_IO_Running}; 
  30. my $slave_SQL             = $slave_status->{Slave_SQL_Running}; 
  31. my $seconds_behind_master = $slave_status->{Seconds_Behind_Master}; 
  32. my $now_time              = POSIX::strftime ("[%Y-%m-%d %H:%M:%S]", localtime); 
  33.  
  34.  
  35. print "Check the Slave MySQL stauts....\n"
  36. print "_" x 50"\n"
  37. print "Time:\t\t\t$now_time\n"
  38. print "Slave IO Running:\t\t$slave_IO\n"
  39. print "Slave SQL Running::\t\t$slave_SQL\n"
  40. print "Behind Master Seconds:\t\t$seconds_behind_master\n"
  41.  
  42.  
  43. if ($seconds_behind_master > $max_behind){ 
  44.     print "Slave SQL Server is far behind master "
  45.  
  46.  
  47. #---Functions----# 
  48. sub MysqlConnect  { 
  49.  
  50.     my ($host, $port, $user, $passwd) = @_; 
  51.     my $dsn  = "DBI:mysql:host=$host;port=$port"
  52.     return DBI->connect($dsn, $user, $passwd, {RaiseError => 1}); 
  53.  
  54.  
  55. sub MysqlQuery { 
  56.  
  57.     my ($dbh , $query) = @_; 
  58.     my $sth = $dbh->prepare($query); 
  59.     my $res = $sth->execute; 
  60.     return undef unless $res; 
  61.     my $row = $sth->fetchrow_hashref; 
  62.     $sth->finish; 
  63.     return $row; 

【編輯推薦】

  1. FreeBSD 8上的Rsync同步簡易教程
  2. 生產(chǎn)環(huán)境下的MySQL數(shù)據(jù)庫主從同步總結(jié)
  3. MySQL數(shù)據(jù)庫同步的實例演示大分享
責(zé)任編輯:yangsai 來源: Linux運維趨勢讀者投遞
相關(guān)推薦

2023-04-26 12:46:43

DockerSpringKubernetes

2009-11-09 14:57:37

WCF上傳文件

2011-01-06 10:39:25

.NET程序打包

2021-07-01 09:31:50

MySQL SQL 語句數(shù)據(jù)庫

2020-04-14 10:20:12

MySQL數(shù)據(jù)庫死鎖

2024-10-16 11:40:47

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機

2021-09-30 18:27:38

數(shù)據(jù)倉庫ETL

2020-05-15 08:07:33

JWT登錄單點

2021-03-12 10:01:24

JavaScript 前端表單驗證

2021-01-19 09:06:21

MysqlDjango數(shù)據(jù)庫

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2022-12-07 08:42:35

2022-07-27 08:16:22

搜索引擎Lucene

2022-03-14 14:47:21

HarmonyOS操作系統(tǒng)鴻蒙

2020-11-27 07:38:43

MongoDB

2017-05-18 12:45:35

數(shù)據(jù)分析數(shù)據(jù)理解數(shù)據(jù)

2011-02-22 13:46:27

微軟SQL.NET
點贊
收藏

51CTO技術(shù)棧公眾號