linux環境下搭建MySQL資料庫的雙擊熱備

來源:互聯網
上載者:User

標籤:my.cnf   linux環境   情況   binlog   clust   The   最好   實現   測試的   

  • 準備伺服器
  • 由於Mysql不同版本之間的(二進位日誌)binlog格式可能會不太一樣,因此最好的搭配組合是主(Master)伺服器的Mysql版本和從(Slave)伺服器版本相同或者更低,主伺服器的版本肯定不能高於從伺服器版本。
    本次我用於測試的兩台伺服器版本都是Mysql-5.5.17。

    1. Mysql 建立主-從伺服器雙機熱備配置步驟

    2.1環境描述
    A伺服器(主伺服器Master):59.151.15.36
    B伺服器(從伺服器Slave):218.206.70.146
    主從伺服器的Mysql版本皆為5.5.17
    Linux環境下
    將主伺服器需要同步的資料庫內容進行備份一份,上傳到從伺服器上,保證始初時兩伺服器中資料庫內容一致。
    不過這裡說明下,由於我是利用Mysql在安裝後就有的資料庫test進行測試的,所以兩台伺服器裡面是沒有建立表的,只不分別在test裡面建立了同樣的一張空表tb_mobile;
    Sql語句如下:
    mysql> create table tb_mobile( mobile VARCHAR(20) comment‘手機號碼‘, time timestamp DEFAULT now() comment‘時間‘ );
    2.2 主伺服器Master配置
    2.2.1 建立同步處理的使用者
    進入mysql操作介面,在主伺服器上為從伺服器建立一個連線帳戶,該帳戶必須授予REPLICATION SLAVE許可權。因為從mysql版本3.2以後就可以通過REPLICATION對其進行雙機熱備的功能操作。
    操作指令如下:
    mysql> grant replication slave on . to ‘replicate‘@‘218.206.70.146‘ identified by ‘123456‘;
    mysql> flush privileges;
    建立好同步連線帳戶後,我們可以通過在從伺服器(Slave)上用replicat帳戶對主伺服器(Master)資料庫進行訪問下,看下是否能串連成功。
    在從伺服器(Slave)上輸入如下指令:
    [[email protected] ~]# mysql -h59.151.15.36 -ureplicate -p123456
    如果出現下面的結果,則表示能登入成功,說明可以對這兩台伺服器進行雙機熱備進行操作。

    2.2.2 修改mysql設定檔
    如果上面的準備工作做好,那邊我們就可以進行對mysql設定檔進行修改了,首先找到mysql配置所有在目錄,一般在安裝好mysql服務後,都會將設定檔複製一一份出來放到/ect目錄下面,並且設定檔命名為:my.cnf。即設定檔準確目錄為/etc/my.cnf
    (Linux下用rpm包安裝的MySQL是不會安裝/etc/my.cnf檔案的,
    至於為什麼沒有這個檔案而MySQL卻也能正常啟動和作用,在點有兩個說法,
    第一種說法,my.cnf只是MySQL啟動時的一個參數檔案,可以沒有它,這時MySQL會用內建的預設參數啟動,
    第二種說法,MySQL在啟動時自動使用/usr/share/mysql目錄下的my-medium.cnf檔案,這種說法僅限於rpm包安裝的MySQL,
    解決方案,只需要複製一個/usr/share/mysql目錄下的my-medium.cnf檔案到/etc目錄,並改名為my.cnf即可。)
    找到設定檔my.cnf開啟後,在[mysqld]下修改即可:
    [mysqld]
    server-id = 1        //唯一id
    log-bin=mysql-bin //其中這兩行是本來就有的,可以不用動,添加下面兩行即可.指定記錄檔
    binlog-do-db = test     //記錄日誌的資料庫
    binlog-ignore-db = mysql //不記錄日誌的資料庫
    2.2.3 重啟mysql服務
    修改完設定檔後,儲存後,重啟一下mysql服務,如果成功則沒問題。

    2.2.4 查看主伺服器狀態
    進入mysql服務後,可通過指令查看Master狀態,輸入如下指令:

    注意看裡面的參數,特別前面兩個File和Position,在從伺服器(Slave)配置主從關係會有用到的。
    註:這裡使用了鎖表,目的是為了產生環境中不讓進新的資料,好讓從伺服器定位同步位置,初次同步完成後,記得解鎖。

    2.3 從伺服器Slave配置
    2.3.1修改設定檔
    因為這裡面是以主-從方式實現mysql雙機熱備的,所以在從伺服器就不用在建立同步帳戶了,直接開啟設定檔my.cnf進行修改即可,道理還是同修改主伺服器上的一樣,只不過需要修改的參數不一樣而已。如下:
    [mysqld]
    server-id = 2
    log-bin=mysql-bin
    replicate-do-db = test
    replicate-ignore-db = mysql,information_schema,performance_schema
    2.3.2重啟mysql服務
    修改完設定檔後,儲存後,重啟一下mysql服務,如果成功則沒問題。

    2.3.3用change mster 語句指定同步位置
    這步是最關鍵的一步了,在進入mysql操作介面後,輸入如下指令:
    mysql>stop slave; //先停步slave服務線程,這個是很重要的,如果不這樣做會造成以下操作不成功。
    mysql>change master to

    master_host=‘59.151.15.36‘,master_user=‘replicate‘,master_password=‘123456‘,
    master_log_file=‘ mysql-bin.000016 ‘,master_log_pos=107;
    註:master_log_file, master_log_pos由主伺服器(Master)查出的狀態值中確定。也就是剛剛叫注意的。master_log_file對應File, master_log_pos對應Position。Mysql 5.x以上版本已經不支援在設定檔中指定主伺服器相關選項。
    遇到的問題,如果按上面步驟之後還出現如下情況:

    則要重新設定slave。指令如下
    mysql>stop slave;
    mysql>reset slave;
    之後停止slave線程重新開始。成功後,則可以開啟slave線程了。
    mysql>start slave;
    2.3.4查看從伺服器(Slave)狀態
    用如下指令進行查看
    mysql> show slave status\G;

    查看下面兩項值均為Yes,即表示設定從伺服器成功。
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    2.4 測試同步
    之前開始已經說過了在資料庫test只有一個表tb_mobile沒有資料,我們可以先查看下兩伺服器的資料庫是否有資料:
    Master:59.151.15.36

    Slave:218.206.70.146

    好了,現在可以在Master伺服器中插入資料看下是否能同步。
    Master:59.151.15.36

    Slave:218.206.70.146

    可以從上面兩個上看出,在Master伺服器上進行插入的資料在Slave伺服器可以查到,這就表示雙機熱備配置成功了。

    1. Mysql 建立主-主伺服器雙機熱備配置步驟
      伺服器還是用回現在這兩台伺服器
      3.1建立同步處理的使用者
      同時在主從伺服器建立一個連線帳戶,該帳戶必須授予REPLIATION SLAVE許可權。這裡因為伺服器A和伺服器B互為主從,所以都要分別建立一個同步處理的使用者。
      伺服器A:
      mysql> grant replication slave on . to ‘replicate‘@‘218.206.70.146‘ identified by ‘123456‘;
      mysql> flush privileges;
      伺服器B:
      mysql> grant replication slave on . to ‘replicate‘@‘59.151.15.36‘ identified by ‘123456‘;
      mysql> flush privileges;
      3.2修改設定檔my.cnf
      伺服器A
      [mysqld]
      server-id = 1
      log-bin=mysql-bin
      binlog-do-db = test
      binlog-ignore-db = mysql
      #主-主形式需要多添加的部分
      log-slave-updates
      sync_binlog = 1
      auto_increment_offset = 1
      auto_increment_increment = 2
      replicate-do-db = test
      replicate-ignore-db = mysql,information_schema
      伺服器B:
      [mysqld]
      server-id = 2
      log-bin=mysql-bin
      replicate-do-db = test
      replicate-ignore-db = mysql,information_schema,performance_schema

    #主-主形式需要多添加的部分
    binlog-do-db = test
    binlog-ignore-db = mysql
    log-slave-updates
    sync_binlog = 1
    auto_increment_offset = 2
    auto_increment_increment = 2
    3.3分別重啟A伺服器和B伺服器上的mysql服務
    重啟伺服器方式和上面的一樣,這裡就不做講解了。
    3.4分別查A伺服器和B伺服器作為主伺服器的狀態
    伺服器A:

    伺服器B:

    3.5分別在A伺服器和B伺服器上用change master to 指定同步位置
    伺服器A:
    mysql>change master to

    master_host=‘218.206.70.146‘,master_user=‘replicate‘,master_password=‘123456‘,
    master_log_file=‘ mysql-bin.000011 ‘,master_log_pos=497;
    伺服器B:
    mysql>change master to
    master_host=‘59.151.15.36‘,master_user=‘replicate‘,master_password=‘123456‘,
    master_log_file=‘ mysql-bin.000016 ‘,master_log_pos=107;
    3.6 分別在A和B伺服器上重啟從服務線程
    mysql>start slave;
    3.7 分別在A和B伺服器上查看從伺服器狀態
    mysql>show slave status\G;
    查看下面兩項值均為Yes,即表示設定從伺服器成功。
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    3.8 測試主-主同步例子
    測試伺服器A:
    在伺服器A上插入一條語句如所示:


    之後在伺服器B上查看是否同步如所示:


    測試伺服器B:
    在伺服器B上插入一條語句如所示:

    然後在從伺服器A上查看是否有同步資料如所示:



    最後從結果可以看出主-主形式的雙機熱備是能成功實現的。

    1. 配置參數說明
      Server-id
      ID值唯一的標識了複製群集中的主從伺服器,因此它們必須各不相同。Master_id必須為1到232-1之間的一個正整數值,slave_id值必須為2到232-1之間的一個正整數值。
      Log-bin
      表示開啟binlog,開啟該選項才可以通過I/O寫到Slave的relay-log,也是可以進行replication的前提。
      Binlog-do-db
      表示需要記錄二進位日誌的資料庫。如果有多個資料可以用逗號分隔,或者使用多個binlog-do-dg選項。
      Binglog-ingore-db
      表示不需要記錄二進位日誌的資料庫,如果有多個資料庫可用逗號分隔,或者使用多binglog-ignore-db選項。
      Replicate-do-db
      表示需要同步的資料庫,如果有多個資料可用逗號分隔,或者使用多個replicate-do-db選項。
      Replicate-ignore-db
      表示不需要同步的資料庫,如果有多個資料庫可用逗號分隔,或者使用多個replicate-ignore-db選項。
      Master-connect-retry
      master-connect-retry=n表示從伺服器與主伺服器的串連沒有成功,則等待n秒(s)後再進行管理方式(預設設定是60s)。如果從伺服器存在mater.info檔案,它將忽略些選項。
      Log-slave-updates
      配置從庫上的更新操作是否寫入二進位檔案,如果這台從庫,還要做其他從庫的主庫,那麼就需要打這個參數,以便從庫的從庫能夠進行日誌同步。
      Slave-skip-errors
      在複製過程,由於各種原因導致binglo中的sql出錯,預設情況下,從庫會停止複製,要使用者介入。可以設定slave-skip-errors來定義錯誤號碼,如果複製過程中遇到的錯誤是定義的錯誤號碼,便可以路過。如果從庫是用來做備份,設定這個參數會存在資料不一致,不要使用。如果是分擔主庫的查詢壓力,可以考慮。
      --slave-skip-errors=[err_code1,err_code2,...|all|ddl_exist_errors]
      Command-Line Format --slave-skip-errors=name
      Option-File Format slave-skip-errors
      System Variable Name slave_skip_errors
      Variable Scope Global
      Dynamic Variable No
      Permitted Values
      Type string
      Default OFF
      Valid Values OFF
      [list of error codes]
      all
      ddl_exist_errors

    MySQL 5.6 as well as MySQL Cluster NDB 7.3 support an additional shorthand value
    ddl_exist_errors, which is equivalent to the error code list 1007,1008,1050,1051,
    1054,1060,1061,1068,1094,1146.
    Examples:

    --slave-skip-errors=1062,1053
    --slave-skip-errors=all
    --slave-skip-errors=ddl_exist_errors
    Sync_binlog=1 Or N
    Sync_binlog的預設值是0,這種模式下,MySQL不會同步到磁碟中去。這樣的話,Mysql依賴作業系統來重新整理二進位日誌binary log,就像作業系統重新整理其他檔案的機制一樣。因此如果作業系統或機器(不僅僅是Mysql伺服器)崩潰,有可能binlog中最後的語句丟失了。要想防止這種情況,可以使用sync_binlog全域變數,使binlog在每N次binlog寫入後與硬碟同步。當sync_binlog變數設定為1是最安全的,因為在crash崩潰的情況下,你的二進位日誌binary log只有可能丟失最多一個語句或者一個事務。但是,這也是最慢的一種方式(除非磁碟有使用帶蓄電池後備電源的緩衝cache,使得同步到磁碟的操作非常快)。
    即使sync_binlog設定為1,出現崩潰時,也有可能表內容和binlog內容之間存在不一致性。如果使用InnoDB表,Mysql伺服器處理COMMIT語句,它將整個事務寫入binlog並將事務提交到InnoDB中。如果在兩次操作之間出現崩潰,重啟時,事務被InnoDB復原,但仍然存在binlog中。可以用-innodb-safe-binlog選項來增加InnoDB表內容和binlog之間的一致性。(注釋:在Mysql 5.1版本中不需要-innodb-safe-binlog;由於引入了XA事務支援,該選項作廢了),該選項可以提供更大程度的安全,使每個事務的binlog(sync_binlog=1)和(預設情況為真)InnoDB日誌與硬碟同步,該選項的效果是崩潰後重啟時,在滾回事務後,Mysql伺服器從binlog剪下復原的InnoDB事務。這樣可以確保binlog反饋InnoDB表的確切資料等,並使從伺服器保持與主伺服器保持同步(不接收復原的語句)。
    Auto_increment_offset和Auto_increment_increment
    Auto_increment_increment和auto_increment_offset用於主-主伺服器(master-to-master)複製,並可以用來控制AUTO_INCREMENT列的操作。兩個變數均可以設定為全域或局部變數,並且假定每個值都可以為1到65,535之間的整數值。將其中一個變數設定為0會使該變數為1。
    這兩個變數影響AUTO_INCREMENT列的方式:auto_increment_increment控制列中的值的增量值,auto_increment_offset確定AUTO_INCREMENT列值的起點。
    如果auto_increment_offset的值大於auto_increment_increment的值,則auto_increment_offset的值被忽略。例如:表內已有一些資料,就會用現在已有的最大自增值做為初始值。

    如何解決MySQL主從同步錯誤的SQL
    解決:
    stop slave;
    #表示跳過一步錯誤,後面的數字可變
    set global sql_slave_skip_counter =1;
    start slave;
    之後再用mysql> show slave status\G 查看:
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    ok,現在主從同步狀態正常了。

    linux環境下搭建MySQL資料庫的雙擊熱備

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.