Restore MySQL Database from mysqlbackup
Restore MySQL Database from mysqlbackup
In todays world, One of the most common activity is to perform database restore using old backup or performing PIT recovery for database.
In this blog , We will show you how to perform restore and recovery of the MySQL database using backup taken via mysqlbackup.
In order to restore Mysql database from MySQL backup , We will follow below steps:
1) Shut down MySQL Database Server/Service
Check the status of the mysql service using command : systemctl status mysql
Shut down mysql service using command : systemctl stop mysql
2) Delete all existing file of MySQL Server
Delete all files inside the server's
data directory. Also delete all files inside the directories specified by the
--innodb_data_home_dir, --innodb_log_group_home_dir, and
--innodb_undo_directory options for restore, if the directories are different
from the data directory.
mysqlbackup
--defaults-file=/etc/mysql/mysql.conf.d/mysqld.cnf
--datadir=/var/lib/mysql \
--backup-image=/dbbackup/testdb/2020-06-26/my_full_2020-06-26-0400.mbi
--backup-dir=/dbbackup/testdb/restore_tmp copy-back-and-apply-log
Below are the logs for Full DB Backup restore:
3) Restore Incremental backup:
mysqlbackup --defaults-file=/etc/mysql/mysql.conf.d/mysqld.cnf --datadir=/var/lib/mysql
\
--backup-image=/dbbackup/testdb/2020-06-26/my_inc_2020-06-26-1430.mbi --backup-dir=/dbbackup/testdb/restore_tmp/inc_2020-06-26-1430 --incremental \
root@mysqlhost01:/var/lib/mysql# cat backup_variables.txt|grep binlog_position
binlog_position=binlog.000264:776776395
root@mysqlhost01:/var/lib/MySQL#
--backup-image=/dbbackup/testdb/2020-06-26/my_inc_2020-06-26-1430.mbi --backup-dir=/dbbackup/testdb/restore_tmp/inc_2020-06-26-1430 --incremental \
copy-back-and-apply-log
Below are the logs for Incremental DB Backup Restore:
5) When finished ,note the binary log position to which you have restored the server.The information is available from the backup_variables.txt file in the restored data directory of the server:
binlog_position=binlog.000264:776776395
root@mysqlhost01:/var/lib/MySQL#
6) In order to perform PIT recovery ,We will restore closest Incremental backup to a directory so that we can read the binlog file to perform PIT recovery.
Extract
last incremental backup in sequence for PIT recovery:
mysqlbackup
--backup-dir=/dbbackup/testdb/restore_tmp/inc_2020-06-26-1830
--backup-image=/dbbackup/testdb/2020-06-26/my_inc_2020-06-26-1830.mbi
image-to-backup-dir
7) Next step is to find the binlog_position in binlog which is close to the PIT recovery time.
Suppose,We want to Perform point in time recovery till 26 June 2020 16:32:56.
With binlog file which have the data/changes near to the target recovery time , Save output of the binlog to text file:
mysqlbinlog binlog.000264 > binlog_000264.sql
Cross-Check the time for last restore lsn(lsn from Step 5):
root@mysqlhost01:/dbbackup/testdb/restore_tmp/inc_2020-06-26-1830/datadir# cat binlog_000264.sql|grep 776776395
#200626 14:41:36 server id 3727631716 end_log_pos 776776395 Xid = 34691643
# at 776776395
root@mysqlhost01:/dbbackup/testdb/restore_tmp/inc_2020-06-26-1830/datadir#
Search for the log position around time 26 June 2020 16:32:56:
root@mysqlhost01:/dbbackup/testdb/restore_tmp/inc_2020-06-26-1830/datadir# cat binlog_000264.sql|grep "200626 16:32:56"
#200626 16:32:56 server id 3727631716 end_log_pos 842673253 GTID last_committed=824360 sequence_number=824361 rbr_only=yes original_committed_timestamp=1593160376336117 immediate_commit_timestamp=1593160376311145 transaction_length=730
#200626 16:32:56 server id 3727631716 end_log_pos 842673349 Query thread_id=15 exec_time=0 error_code=0
#200626 16:32:56 server id 3727631716 end_log_pos 842673454 Table_map: `mysql_innodb_cluster_metadata`.`routers` mapped to number 91
#200626 16:32:56 server id 3727631716 end_log_pos 842673874 Update_rows: table id 91 flags: STMT_END_F
#200626 16:32:56 server id 3727631716 end_log_pos 842673901 Xid = 35397625
#200626 16:32:56 server id 3727631716 end_log_pos 842673983 GTID last_committed=824361 sequence_number=824362 rbr_only=yes original_committed_timestamp=1593160376625073 immediate_commit_timestamp=1593160376600657 transaction_length=730
#200626 16:32:56 server id 3727631716 end_log_pos 842674079 Query thread_id=15 exec_time=0 error_code=0
#200626 16:32:56 server id 3727631716 end_log_pos 842674184 Table_map: `mysql_innodb_cluster_metadata`.`routers` mapped to number 91
#200626 16:32:56 server id 3727631716 end_log_pos 842674604 Update_rows: table id 91 flags: STMT_END_F
#200626 16:32:56 server id 3727631716 end_log_pos 842674631 Xid = 35397651
root@mysqlhost01:/dbbackup/testdb/restore_tmp/inc_2020-06-26-1830/datadir#
Change permission of the newly restored directory:
root@mysqlhost01:/var/lib# chown -R mysql:mysql /var/lib/mysql
Make Sure gtid_mode=ON and enforce_gtid_consistency=ON added in the my.cnf.
NOTE : If restoring to same server change backup-auto.cnf to auto.cnf and backup-mysqld-auto.cnf to mysqld-auto.cnf
Start mysql: systemctl start MySQL
8) Recover database to point in time:
mysqlbinlog --start-position="776776395" --stop-position="842674631" binlog.000264 | mysql -uroot -p
Suppose,We want to Perform point in time recovery till 26 June 2020 16:32:56.
With binlog file which have the data/changes near to the target recovery time , Save output of the binlog to text file:
mysqlbinlog binlog.000264 > binlog_000264.sql
Cross-Check the time for last restore lsn(lsn from Step 5):
root@mysqlhost01:/dbbackup/testdb/restore_tmp/inc_2020-06-26-1830/datadir# cat binlog_000264.sql|grep 776776395
#200626 14:41:36 server id 3727631716 end_log_pos 776776395 Xid = 34691643
# at 776776395
root@mysqlhost01:/dbbackup/testdb/restore_tmp/inc_2020-06-26-1830/datadir#
Search for the log position around time 26 June 2020 16:32:56:
root@mysqlhost01:/dbbackup/testdb/restore_tmp/inc_2020-06-26-1830/datadir# cat binlog_000264.sql|grep "200626 16:32:56"
#200626 16:32:56 server id 3727631716 end_log_pos 842673253 GTID last_committed=824360 sequence_number=824361 rbr_only=yes original_committed_timestamp=1593160376336117 immediate_commit_timestamp=1593160376311145 transaction_length=730
#200626 16:32:56 server id 3727631716 end_log_pos 842673349 Query thread_id=15 exec_time=0 error_code=0
#200626 16:32:56 server id 3727631716 end_log_pos 842673454 Table_map: `mysql_innodb_cluster_metadata`.`routers` mapped to number 91
#200626 16:32:56 server id 3727631716 end_log_pos 842673874 Update_rows: table id 91 flags: STMT_END_F
#200626 16:32:56 server id 3727631716 end_log_pos 842673901 Xid = 35397625
#200626 16:32:56 server id 3727631716 end_log_pos 842673983 GTID last_committed=824361 sequence_number=824362 rbr_only=yes original_committed_timestamp=1593160376625073 immediate_commit_timestamp=1593160376600657 transaction_length=730
#200626 16:32:56 server id 3727631716 end_log_pos 842674079 Query thread_id=15 exec_time=0 error_code=0
#200626 16:32:56 server id 3727631716 end_log_pos 842674184 Table_map: `mysql_innodb_cluster_metadata`.`routers` mapped to number 91
#200626 16:32:56 server id 3727631716 end_log_pos 842674604 Update_rows: table id 91 flags: STMT_END_F
#200626 16:32:56 server id 3727631716 end_log_pos 842674631 Xid = 35397651
root@mysqlhost01:/dbbackup/testdb/restore_tmp/inc_2020-06-26-1830/datadir#
Change permission of the newly restored directory:
root@mysqlhost01:/var/lib# chown -R mysql:mysql /var/lib/mysql
Make Sure gtid_mode=ON and enforce_gtid_consistency=ON added in the my.cnf.
NOTE : If restoring to same server change backup-auto.cnf to auto.cnf and backup-mysqld-auto.cnf to mysqld-auto.cnf
Start mysql: systemctl start MySQL
8) Recover database to point in time:
mysqlbinlog --start-position="776776395" --stop-position="842674631" binlog.000264 | mysql -uroot -p
you can learn more about MySql and InnoDB from below books:
=========================================================================
You can also , Visit our Blogs for related topic on Backup & Restore:
Comments
Post a Comment
Please do not enter any spam link in comment Section suggestions are Always Appreciated. Thanks.. !