史上最詳細MySQL5.5復制配置步驟,與以前版本的有所不同

jopen 12年前發布 | 2K 次閱讀 Oraculum Windows 7

史上最詳細MySQL5.5復制配置步驟,與以前版本的有所不同

操作系統:CentOS 5.8

MySQL版本:5.5.x

原來狀況:數據庫在一臺機器上,已經有一些生產數據

目標:主主復制。兩臺數據庫服務器設置成主主復制方式,即對任何一臺的更改都會自動同步到另外一臺。

第一臺:ip地址為 xxx.xxx.xxx.156  主機名 s156

第二臺:ip地址為 xxx.xxx.xxx.170  主機名 s170

注:本文中的ip地址均采用 xxx. 形式,運用時根據實際情況修改。

本文鏈接:http://codingstandards.iteye.com/blog/1535994 轉載請注明出處

 

操作步驟一:停止應用運行

在修改mysql配置之前,應該停止與數據庫有關的進程(程序),比如:

1. tomcat或其他Web應用容器

使用 service tomcat stop 停止

或者進入 tomcat/bin 執行 ./shutdown.sh)

2. crontab 里面設置的某些與數據庫有關的定時任務。

比如:那些檢測tomcat是否啟動的定時任務。

可以先用 crontab -e 打開,把相應項注釋掉(在前面加#號)。

3. 其他與數據庫有關的進程。

 

 

操作步驟二:檢查主機名

什么情況下需要修改主機名?

如果發現shell命令行提示符是

[root@localhost ~]#

或者用hostname命令得到主機名是localhost

[root@localhost ~]# hostname
localhost

 

為什么需要確認主機名是否正確?

1. 因為有些時候,安裝系統的人比較懶,沒有在安裝時設置主機名;

2. mysql運行時生成日志文件需要用到主機名,尤其是配置成復制(replication)后;

3. 如果在配置了復制之后再進行修改主機名,會造成mysql執行錯誤,這是我曾經碰到過的情況。

 

如果不需要修改主機名,跳到下一個步驟。

 

注意:需要對兩臺服務器檢查和修改。

 

修改主機名的步驟:

1. 停止與主機名有關系的程序或服務,比如mysql(它生成的日志文件名中包含主機名)

service mysql stop

2. 使用hostname命令修改主機名(假定新主機名為newname)

hostname newname

比如:hostname s156

3. 在/etc/hosts文件中配置主機名的解析(假定ip地址記為ip,主機名newname,域名為yourdomain.com)

127.0.0.1               localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6

ip   newname.yourdomain.com newname

比如:xxx.156 s156.hndy16.com s156

4. 在/etc/sysconfig/network中修改HOSTNAME=newname

比如:HOSTNAME=s156

5. 最好重啟機器,如果不允許的話,重新登錄也行

重啟使用 reboot 命令

重新登錄使用 exit 命令

6. 看一下命令行提示符和hostname是否正確

[root@s156 ~]# hostname
s156

7. 重新啟動第一步中停止的程序或服務,比如mysql

service mysql start

 

操作步驟三: 創建復制賬號

需要在兩臺數據庫上創建,假定用戶名和密碼都是rep。

 

先登錄mysql

mysql -pxxx

創建用戶賬號,只賦予slave權限
grant replication slave on *.* to 'rep'@'xxx.170' identified by 'rep';

清空所有表和塊寫入語句
flush tables with read lock;

 

 

操作步驟四:手工復制數據庫

如果兩臺服務器都是新裝的,可以跳過這一步。

 

如果原來單機上有數據,那么需要將數據復制到另外一臺上面,讓它們在開始復制之前的狀態相同。

 

有兩種方式:

1. 復制文件法:將數據庫的數據文件直接復制到另外一臺;

2. 使用 mysqldump 工具導出數據,然后導入到另外一臺。

注意:不是所有的數據需要復制,比如 mysql 數據庫、information_schema 數據庫 和 performance_schema 數據庫。

如果 test數據庫中沒有什么重要數據,也不必復制。

 

我經常采用第2種方式:

mysqldump -pxxx --default-character-set=gbk dbname >dbname.sql

tar zcf dbname.tar.gz dbname

 

通過sftp傳到另外一臺上面

sftp other_hostname

put dbname.tar.gz

quit

 

或者從另外一臺機器上sftp

sftp source_hostname

get dbname.tar.gz

quit

 

將數據解壓

tar zxf dbname.tar.gz

導入到數據庫中

mysql -pxxx --default-character-set=gbk <dbname.sql

 

操作步驟五:停止mysql服務

操作命令是

service mysql stop

 

此步的目的是避免數據庫中的數據在我們修改配置文件時被修改。

當然如果所有與數據庫有關的應用程序和定時任務都已經停止,那么應該不會出現這種情況。

但是,不怕一萬,就怕萬一。

 

操作步驟六:修改mysql配置文件

配置文件 /etc/my.cnf

這是其中一臺的配置,另外一臺稍作修改就可以了。

s156上 /etc/my.cnf 寫道
[client]
default-character-set=gbk

[mysqld]
#default-character-set=gbk
character-set-server=gbk
# server
server-id=156
log-bin=mysql-bin
binlog-ignore-db=mysql
# replication
#master-host=xxx.170
#master-port=3306
#master-user=rep
#master-password=rep
#master-connect-retry=60
# auto_incr
auto_increment_offset=1
auto_increment_increment=2
 

 

另外一臺機器上的配置

s170上 /etc/my.cnf 寫道
[client]
default-character-set=gbk

[mysqld]
#default-character-set=gbk
character-set-server=gbk
# server
server-id=170
log-bin=mysql-bin
binlog-ignore-db=mysql
# replication
#master-host=xxx.156
#master-port=3306
#master-user=rep
#master-password=rep
#master-connect-retry=60
# auto_incr
auto_increment_offset=2
auto_increment_increment=2
 

要點1:默認字符集都應該一樣,比如gbk:

[client] 的配置名稱為 default-character-set

[mysqld] 的配置名稱為 character-set-server  (注:與以前版本的mysql不同,5.5版不認識 default-character-set)

 

要點2:server-id 要互不相同才行,可以是任意的正整數

為了更容易清楚是那一臺服務器,可以設置為 ip地址的最后那個數字。

 

要點3:log-bin 和 binlog-ignore-db 配置

以前版本的mysql,binlog-ignore-db 項也可以配置成 set-variable=binlog-ignore-db=mysql,但5.5版不行了。

 

要點4:不能配置 master-host 等項

上面的幾個配置文件中 master-host, master-port, master-user, master-password 等項都注釋掉了,因為5.5版不支持這種配置方式了,

要改用 change master to 語句(在后面的步驟中會使用)

 

要點5:自動遞增的設置

在使用mysql做數據庫時,經常會使用 auto_increment 整數類型的字段作為主鍵,這種主鍵由mysql服務器生成,每次自動遞增1。

如果是在主主復制方式下,就會產生沖突,即有可能兩臺服務器產生同一主鍵值。

所以 mysql 提供了 auto_increment_offset 和 auto_increment_increment 配置項,

其中 auto_increment_increment 是每次遞增的數值,應該大于等于復制集群中服務器的數量,比如在主主復制中可以設置為2;

auto_increment_offset 是基數,可以從1開始到auto_increment_increment,每臺服務器應該不同,比如一臺設置為1,另外一臺設置2。

注意:如果是應用程序模擬生成自動遞增,可能需要修改應用程序。

 

操作步驟七:啟動mysql服務

service mysql start

 

如果不能啟動,那么就要查看 /var/lib/mysql/*.err 文件的內容去分析啟動失敗的原因,修改一下配置文件再重新啟動。

 

 

操作步驟八:更改 master 設置

由于5.5版不再支持配置文件中直接設置 master-host 等數據,只能使用 change-master-to 命令,如下所示:

CHANGE MASTER TO
MASTER_HOST='master_host_name',
MASTER_USER='replication_user_name',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='recorded_log_file_name',
MASTER_LOG_POS=recorded_log_position;

 

 

注意:兩臺服務器上都要執行

 

實際例子:

在s156上

change master to master_host='xxx.170', master_port=3306, master_user='rep', master_password='rep';

在s170上

change master to master_host='xxx.156', master_port=3306, master_user='rep', master_password='rep';

 

之后啟動從服務器線程

start slave 或者  slave start

 

 

執行示例:

mysql> change master to master_host='xxx.156', master_port=3306, master_user='rep', master_password='rep';
Query OK, 0 rows affected (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

 

 

操作步驟九:確認并驗證配置

使用 show slave status\G 查看從服務器狀態。

使用 SHOW VARIABLES LIKE 'auto_inc%'; 查看自動遞增設置。

在一臺上創建測試表、插入和更新數據,到另外一臺上是否被復制。

 

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.170
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 107
               Relay_Log_File: s156-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000001
             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: 107
              Relay_Log_Space: 408
              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: 170
1 row in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| auto_increment_increment | 2     |
| auto_increment_offset    | 1     |
+--------------------------+-------+
2 rows in set (0.00 sec)

 

mysql> use test
Database changed
mysql> create table test1 (id integer not null primary key);    
Query OK, 0 rows affected (0.00 sec)

 

在另外一臺看看是否復制過來了

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test1          |
+----------------+
1 rows in set (0.00 sec)

 

更多的確認測試可自行進行,比如:insert/update/delete等操作。

 

操作步驟十:恢復應用運行

與操作步驟一對應,要把應用程序和定時任務恢復過來。

 

比如:

1. tomcat等應用服務器。

2. crontab中的與數據庫有關的定時任務。

3. 其他與數據庫有關的程序。

轉自:http://codingstandards.iteye.com/blog/1535994

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!