How to re-sync the Mysql DB if Master and slave have different database incase of Mysql replication?

前端 未结 14 916
小蘑菇
小蘑菇 2020-11-29 14:20

Mysql Server1 is running as MASTER.
Mysql Server2 is running as SLAVE.

Now DB replication is happeni

相关标签:
14条回答
  • 2020-11-29 15:10

    Rebuilding the slave using LVM

    Here is the method we use to rebuild MySQL slaves using Linux LVM. This guarantees a consistent snapshot while requiring very minimal downtime on your master.

    Set innodb max dirty pages percent to zero on the master MySQL server. This will force MySQL to write all the pages to the disk which will significantly speed up the restart.

    set global innodb_max_dirty_pages_pct = 0;
    

    To monitor the number of dirty pages run the command

    mysqladmin ext -i10 | grep dirty
    

    Once the number stop decreasing you have reach the point to continue. Next reset the master to clear the old bin logs / relay logs:

    RESET MASTER;
    

    Execute lvdisplay to get LV Path

    lvdisplay
    

    Output will look like this

    --- Logical volume ---
    LV Path                /dev/vg_mysql/lv_data
    LV Name                lv_data
    VG Name                vg_mysql
    

    Shutdown the master database with command

    service mysql stop
    

    Next take a snaphot, mysql_snapshot will be the new logical volume name. If binlogs are place on the OS drive those need to be snapshot as well.

    lvcreate --size 10G --snapshot --name mysql_snapshot /dev/vg_mysql/lv_data
    

    Start master again with command

    service mysql start
    

    Restore dirty pages setting to the default

    set global innodb_max_dirty_pages_pct = 75;
    

    Run lvdisplay again to make sure the snapshot is there and visible

    lvdisplay
    

    Output:

    --- Logical volume ---
    LV Path                /dev/vg_mysql/mysql_snapshot
    LV Name                mysql_snapshot
    VG Name                vg_mysql
    

    Mount the snapshot

    mkdir /mnt/mysql_snapshot
    mount /dev/vg_mysql/mysql_snapshot /mnt/mysql_snapshot
    

    If you have an existing MySQL slave running you need to stop it

    service mysql stop
    

    Next you need to clear MySQL data folder

    cd /var/lib/mysql
    rm -fr *
    

    Back to master. Now rsync the snapshot to the MySQL slave

    rsync --progress -harz /mnt/mysql_snapshot/ targethostname:/var/lib/mysql/
    

    Once rsync has completed you may unmount and remove the snapshot

    umount /mnt/mysql_snapshot
    lvremove -f /dev/vg_mysql/mysql_snapshot
    

    Create replication user on the master if the old replication user doesn't exist or password is unknown

    GRANT REPLICATION SLAVE on *.* to 'replication'@'[SLAVE IP]' identified by 'YourPass';
    

    Verify that /var/lib/mysql data files are owned by the mysql user, if so you can omit the following command:

    chown -R mysql:mysql /var/lib/mysql
    

    Next record the binlog position

    ls -laF | grep mysql-bin
    

    You will see something like

    ..
    -rw-rw----     1 mysql mysql  1073750329 Aug 28 03:33 mysql-bin.000017
    -rw-rw----     1 mysql mysql  1073741932 Aug 28 08:32 mysql-bin.000018
    -rw-rw----     1 mysql mysql   963333441 Aug 28 15:37 mysql-bin.000019
    -rw-rw----     1 mysql mysql    65657162 Aug 28 16:44 mysql-bin.000020
    

    Here the master log file is the highest file number in sequence and bin log position is the file size. Record these values:

    master_log_file=mysql-bin.000020
    master_log_post=65657162
    

    Next start the slave MySQL

    service mysql start
    

    Execute change master command on the slave by executing the following:

    CHANGE MASTER TO 
    master_host="10.0.0.12", 
    master_user="replication", 
    master_password="YourPass", 
    master_log_file="mysql-bin.000020", 
    master_log_pos=65657162; 
    

    Finally start the slave

    SLAVE START;
    

    Check slave status:

    SHOW SLAVE STATUS;
    

    Make sure Slave IO is running and there are no connection errors. Good luck!

    BR, Juha Vehnia

    I recently wrote this on my blog which is found here... There are few more details there but the story is the same.

    http://www.juhavehnia.com/2015/05/rebuilding-mysql-slave-using-linux-lvm.html

    0 讨论(0)
  • 2020-11-29 15:11

    Here is what I typically do when a mysql slave gets out of sync. I have looked at mk-table-sync but thought the Risks section was scary looking.

    On Master:

    SHOW MASTER STATUS
    

    The outputted columns (File, Position) will be of use to us in a bit.

    On Slave:

    STOP SLAVE
    

    Then dump the master db and import it to the slave db.

    Then run the following:

    CHANGE MASTER TO
      MASTER_LOG_FILE='[File]',
      MASTER_LOG_POS=[Position];
    START SLAVE;
    

    Where [File] and [Position] are the values outputted from the "SHOW MASTER STATUS" ran above.

    Hope this helps!

    0 讨论(0)
提交回复
热议问题