mysql資料庫實現主從複製

恩恩先生發表於2024-03-27

mysql資料庫實現主從複製

預備工作

使用docker-desktop建立兩臺mysql容器命名為mysql-master,mysql-slave。記得填寫環境變數 MYSQL_ROOT_PASSWORD root,否則容器無法啟動。

  1. 檢視兩臺機器的ip 使用inspect:

    master "IPAddress": "172.17.0.2",
    slave "IPAddress": "172.17.0.3",
    
  2. 使用navicat連線主、從庫,並建立資料庫test.

主機配置

  1. 更改主機使用者密碼策略
    這一步非常重要,如果是mysql 8.0 版本需要更改建立使用者的預設密碼策略,否則會連線不上,即使中途更改策略也會出現需要莫名其妙的問題,實際上就是因為這個問題這兩個容器已經建立刪除不下3次。

  2. 在 /etc/my.cnf 將註釋放開

    default_authentication_plugin=mysql_native_password
    
  3. 重啟mysql

  4. 建立從庫連線時候的使用者名稱和密碼並賦予複製許可權:

    # mysql -u root -p 進入mysql客戶端
    CREATE USER 'slave'@'172.17.0.3' IDENTIFIED BY 'slave';
    GRANT REPLICATION SLAVE ON *.* TO 'slave'@'172.17.0.3';
    FLUSH PRIVILEGES;
    
  5. 檢視使用者名稱密碼

    mysql> SELECT User, Host FROM mysql.user;
    +------------------+------------+
    | User             | Host       |
    +------------------+------------+
    | root             | %          |
    | slave            | 172.17.0.3 |
    | mysql.infoschema | localhost  |
    | mysql.session    | localhost  |
    | mysql.sys        | localhost  |
    | root             | localhost  |
    +------------------+------------+
    

主庫配置

  1. 在配置檔案 /etc/my.cnf 新增如下幾行
    log-bin=mysql-bin
    server-id=104
    binlog-do-db=test
    
  2. 重啟mysql
  3. 檢視狀態,這裡的資料很重要建議先複製儲存
    mysql> show master status \G
    *************************** 1. row ***************************
                File: mysql-bin.000001
            Position: 158
        Binlog_Do_DB: test
    Binlog_Ignore_DB: 
    Executed_Gtid_Set: 
    1 row in set, 1 warning (0.00 sec)
    

從庫配置

  1. 在配置檔案 /etc/my.cnf 新增
    server-id=106
    
  2. 重啟mysql
  3. 登陸終端複製並執行
    CHANGE MASTER TO 
    MASTER_HOST='172.17.0.2',
    MASTER_USER='slave',
    MASTER_PASSWORD='slave',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=4,
    master_port=3306;
    
    # MASTER_HOST 是主機的地址,因為容器連線到預設網橋,可以直接通訊
    # MASTER_USER 是在主機中建立的使用者名稱
    # MASTER_PASSWORD 密碼
    # MASTER_LOG_FILE 是上述的 File: mysql-bin.000001 的內容
    # MASTER_LOG_POS 偏移量4 表示預設從頭開始讀取
    # master_port 資料庫埠,預設可以通訊
    
  4. 生效
    start slave;
    
  5. 檢視
    show slave status\G;
    *************************** 1. row ***************************
                Slave_IO_State: Connecting to source
                    Master_Host: 172.17.0.2
                    Master_User: slave
                    Master_Port: 3306
                    Connect_Retry: 60
                Master_Log_File: mysql-bin.000007
            Read_Master_Log_Pos: 4
                Relay_Log_File: 04a0f7d261a6-relay-bin.000001
                    Relay_Log_Pos: 4
            Relay_Master_Log_File: mysql-bin.000007
                Slave_IO_Running: Connecting
                Slave_SQL_Running: Yes
    
    

如果報錯:

Replica I/O for channel '': Error connecting to source 'slave@172.17.0.2:3306'. This was attempt 5/10, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061

大機率是沒有放開 default_authentication_plugin=mysql_native_password 解決方法只能將容器刪了重新建,網上和GPT給出的方法都是沒有用的。

相關文章