mysql的数据备份及恢复
一、mysql數據庫備份的前因后果
1、備份的概念:
將數據收集并保存至另外的多個副本,其目的是將數據還原恢復至備份數據時那個狀態。
2、備份數據的原因
1)做災難恢復使用,要將數據副本做到異地多份備份;
2)數據庫數據改動時使用備份;
3)需要對當前服務器做相關測試時使用備份,備份與測試都是最好在服務器訪問量最少時進行
3、備份的事先注意事項
1)可以容忍丟失多長時間的數據;
2)恢復數據能在多長時間內完成;
3)是否需要持續提供服務;
4)需要恢復哪些內容,整個服務器的數據庫,單個數據庫,一個或多個表。
二、數據的備份類型
1、根據是否需要數據庫離線可分為
1)冷備:cold backup ?備份需要關閉mysql服務或讀寫請求均不允許;
2)溫備:warm backup ?備份的同時,mysql服務在線,只允許讀不允許寫,在線交易要終止:
3)熱備:hot backup
備份的同時,mysql服務在線,支持讀寫請求,業務不受影響,但服務器的性能會有所下降。
2、根據要備份的數據范圍可分為
1)完全備份:full backup
備份當前狀態的整個數據庫的數據;
2)增量備份:increment backup
備份基于上次的完全備份或增量備份以來所改變的數據;
3)差異備份:different backup
備份基于上次的完全備份改變了的數據。
3、根據備份數據是否為文件可分為
1)物理備份:直接備份數據庫文件
2)邏輯備份:備份表中的數據和庫代碼
三、備份的對象及備份工具
1、備份對象
1)數據
2)配置文件
3)代碼、存儲過程、存儲函數、觸發器等
4)OS相關的配置文件
5)復制相關的配置
6)二進制日志
2、引擎所支持的備份
MyISAM引擎只支持溫備,而InnoDB還支持熱備。
3、備份工具
1)mysqldump,mysql客戶端的經典備份工具 ? ,為邏輯備份工具,備份和恢復比較慢;
2)mylvmdumper,mysqldump升級版
多線程的邏輯備份工具,備份和恢復速度稍快于mysqldump;
3)lvm-snapshot,基于快照卷的備份工具 ?,接近于熱備的物理備份工具,備份和恢復的速度較快;
4)select ,mysql內置的備份工具 ?,邏輯備份工具,速度快于mysqldump;
select into outfile;
load data infile;
5)xtrabackup,由percana提供的免費開源備份工具
為物理備份工具,速度快。
6)mysql hotcopy:幾乎冷備的工具,一般不采用,速度慢。
四、數據從備份到恢復的完整流程
1)停止mysql服務;
2)記錄服務和配置文件權限;
3)復制備份文件與數據目錄;
4)按需調整配置;
5)按需改變文件權限;
6)嘗試啟動服務;
7)裝載邏輯備份;
8)檢查和重放二進制日志;
9)確定數據還原正常完成;
10)以完全權限重啟服務器。
五、使用mysqldump進行數據備份及恢復
1:為測試的數據庫及二進制創建備份目錄;
[root@node1 ~]#?mkdir -pv {/mydata/data,/backup,/var/binlog}
mkdir: created directory `/mydata/data'
mkdir: created directory `/backup'
mkdir: created directory `/var/binlog'
2:啟動mysqld服務,創建測試數據庫,并創建測試數據
[root@node1 ~]# service mysqld restart
Shutting down MySQL.... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?[ ?OK ?]
Starting MySQL.. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ ?OK ?]
[root@node1 ~]#mysql
mysql> create database students;
Query OK, 1 row affected (0.00 sec)
mysql> use students
Database changed
mysql> create table TLtb (Id tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M',Courses char(30) not null);
Query OK, 0 rows affected (0.28 sec)
mysql> insert into TLtb (Name,Age,Gender,Courses) values ('Xu zu',20,'M','Xiao Wuxianggong'),('Qiao Feng',28,'M','Xianglong Shibazhang'),('Duan Fu',23,'M','Liumai Shenjian');
Query OK, 3 rows affected (0.01 sec)
Records: 3 ?Duplicates: 0 ?Warnings: 0
mysql> select * from TLtb;
+----+-----------+------+--------+----------------------+
| Id | Name ? ? ?| Age ?| Gender | Courses ? ? ? ? ? ? ?|
+----+-----------+------+--------+----------------------+
| ?1 | Xu zu ? ? | ? 20 | M ? ? ?| Xiao Wuxianggong ? ? |
| ?2 | Qiao Feng | ? 28 | M ? ? ?| Xianglong Shibazhang |
| ?3 | Duan Fu ? | ? 23 | M ? ? ?| Liumai Shenjian ? ? ?|
+----+-----------+------+--------+----------------------+
3 rows in set (0.01 sec)
3:使用mysqldump對測試數據庫進行備份,并且滾動二進制日志,記錄日志位置;
[root@node1 ~]#?mysqldump --lock-all-tables ?--flush-logs --master-data=2 --databases students > /backup/students_`date +%F`.sq
[root@node1 ~]# cp /var/binlog/mysql-bin.
mysql-bin.000001 ?mysql-bin.000002 ?mysql-bin.000003 ?mysql-bin.000004 ?mysql-bin.000005 ?mysql-bin.000006 ?mysql-bin.index
4:備份二進制日志文件;
[root@node1 ~]# cp /var/binlog/mysql-bin.00000* /backup/
[root@node1 ~]# ls /backup/
mysql-bin.000001 ?mysql-bin.000003 ?mysql-bin.000005 ?students_2013-09-30.sql
mysql-bin.000002 ?mysql-bin.000004 ?mysql-bin.000006 ?students_.sql
5:新增數據庫數據進行增量備份,查看當前日志位置;
mysql> create table CDtb (Id tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M',Courses char(30) not null);
Query OK, 0 rows affected (0.14 sec)
mysql> insert into CDtb (Name,Age,Gender,Courses) values ('Yideng Dashi',80,'M','Yiyangzhi'),('Hong Qigong',66,'M','Dagou Bangfa'),('Huang Yaoshi',60,'M','Tanzhi Shengong');
Query OK, 3 rows affected (0.05 sec)
Records: 3 ?Duplicates: 0 ?Warnings: 0
mysql> select * from CDtb;
+----+--------------+------+--------+-----------------+
| Id | Name ? ? ? ? | Age ?| Gender | Courses ? ? ? ? |
+----+--------------+------+--------+-----------------+
| ?1 | Yideng Dashi | ? 80 | M ? ? ?| Yiyangzhi ? ? ? |
| ?2 | Hong Qigong ?| ? 66 | M ? ? ?| Dagou Bangfa ? ?|
| ?3 | Huang Yaoshi | ? 60 | M ? ? ?| Tanzhi Shengong |
+----+--------------+------+--------+-----------------+
3 rows in set (0.01 sec)
mysql>?show master status;
+------------------+----------+--------------+------------------+
| File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | ? ? ?716 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?|
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
[root@node1 ~]# less /backup/students_2013-09-30.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=107;
[root@node1 ~]#?mysqlbinlog --start-position=107 /var/binlog/mysql-bin.000006 > /backup/students_incremental.sql
6:模擬數據庫數據損壞;
mysql> insert into CDtb (Name,Age,Gender,Courses) values ('Ou Yangfeng',75,'M','Hamagong');
Query OK, 1 row affected (0.05 sec)
mysql> drop database students;
Query OK, 2 rows affected, 2 warnings (0.13 sec)
mysql>?show master status;
+------------------+----------+--------------+------------------+
| File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | ? ? 1082 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?|
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
7:恢復備份數據:完全備份+增量備份+二進制日志文件;
bac
[root@node1 ~]#?mysqlbinlog ?/var/binlog/mysql-bin.000006
......
# at 993
#130930 22:51:40 server id 1 ?end_log_pos 1082 ?Query ? thread_id=2 exec_time=0 error_code=1146
SET TIMESTAMP=1380552700/*!*/;
drop database students
[root@node1 ~]#?mysqlbinlog --start-position=716 --stop-position=993 /var/binlog/mysql-bin.000006 > /backup/students_993.sql
[root@node1 ~]#mysqlbinlog /var/binlog/mysql-bin.000006
......
# at 993
#130930 22:51:40 server id 1 ?end_log_pos 1082 ?Query ? thread_id=2 exec_time=0 error_code=1146
SET TIMESTAMP=1380552700/*!*/;
drop database students
[root@node1 ~]#?mysqlbinlog --start-position=716 --stop-position=993 /var/binlog/mysql-bin.000006 > /backup/students_993.sql
mysql> set global sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> source /backup/students_2013-09-30.sql
mysql> source /backup/students_incremental.sql
mysql>?source /backup/students_993.sql
8:檢測備份的數據是否已經正常恢復。
mysql> set global sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)
mysql> use students;
Database changed
mysql> show tables;
+--------------------+
| Tables_in_students |
+--------------------+
| CDtb ? ? ? ? ? ? ? |
| TLtb ? ? ? ? ? ? ? |
+--------------------+
2 rows in set (0.00 sec)
mysql> select * from TLtb;
+----+-----------+------+--------+----------------------+
| Id | Name ? ? ?| Age ?| Gender | Courses ? ? ? ? ? ? ?|
+----+-----------+------+--------+----------------------+
| ?1 | Xu zu ? ? | ? 20 | M ? ? ?| Xiao Wuxianggong ? ? |
| ?2 | Qiao Feng | ? 28 | M ? ? ?| Xianglong Shibazhang |
| ?3 | Duan Fu ? | ? 23 | M ? ? ?| Liumai Shenjian ? ? ?|
+----+-----------+------+--------+----------------------+
3 rows in set (0.00 sec)
mysql> select * from CDtb;
+----+--------------+------+--------+-----------------+
| Id | Name ? ? ? ? | Age ?| Gender | Courses ? ? ? ? |
+----+--------------+------+--------+-----------------+
| ?1 | Yideng Dashi | ? 80 | M ? ? ?| Yiyangzhi ? ? ? |
| ?2 | Hong Qigong ?| ? 66 | M ? ? ?| Dagou Bangfa ? ?|
| ?3 | Huang Yaoshi | ? 60 | M ? ? ?| Tanzhi Shengong |
| ?4 | Ou Yangfeng ?| ? 75 | M ? ? ?| Hamagong ? ? ? ?|
+----+--------------+------+--------+-----------------+
4 rows in set (0.00 sec)
六、使用lvm-snapshot進行數據備份及恢復
1、創建LVM邏輯卷并開機自動掛載,并創建mysql數據與二進制日志存放目錄;
y
[root@localhost ~]#?pvcreate /dev/sdb{1,2}
? Physical volume "/dev/sdb1" successfully created
? Physical volume "/dev/sdb2" successfully created
[root@localhost ~]#?vgcreate vg1 /dev/sdb{1,2}
? Volume group "vg1" successfully created
[root@localhost ~]#?lvcreate -L +10G -n lv1 vg1
? Logical volume "lv1" created
[root@localhost ~]#?mke2fs -t ext4 /dev/vg1/lv1
[root@localhost ~]#?vim /etc/fstab
/dev/vg1/lv1 ? ? ? ? ? ?/Mydata ? ? ? ? ? ? ? ? ext4 ? ?defaults ? ? ? ?0 0
[root@localhost ~]# mount -a
[root@localhost ~]#?mkdir /Mydata/{data,,binlog} ? ?/backup1
[root@localhost ~]# chown -R mysql:mysql /Mydata/*
2、新建mysql數據庫并新增數據;
mysql> create database schooldb;
Query OK, 1 row affected (0.01 sec)
mysql> use schooldb
Database changed
mysql> create table studentstb (Id tinyint unsigned not null primary key auto_increment,Name char(20) not null unique key,Age tinyint unsigned,Gender char(1) default 'M',Courses char(30) not null);
Query OK, 0 rows affected (0.38 sec)
mysql> insert into studentstb (Name,Age,Gender,Courses) values ('Zhang San',19,'M','Shujujiegou'),('Li Ling',18,'F','Daxueyingyu'),('Wang Wu',20,'M','Dianluyuanli');
Query OK, 3 rows affected (0.09 sec)
Records: 3 ?Duplicates: 0 ?Warnings: 0
mysql> select * from studentstb;
+----+-----------+------+--------+--------------+
| Id | Name ? ? ?| Age ?| Gender | Courses ? ? ?|
+----+-----------+------+--------+--------------+
| ?1 | Zhang San | ? 19 | M ? ? ?| Shujujiegou ?|
| ?2 | Li Ling ? | ? 18 | F ? ? ?| Daxueyingyu ?|
| ?3 | Wang Wu ? | ? 20 | M ? ? ?| Dianluyuanli |
+----+-----------+------+--------+--------------+
3 rows in set (0.03 sec)
3、登錄mysql,對所有表加鎖,并滾動日志,查看當前日志所在位置;
mysql>?flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
mysql>?flush logs;
Query OK, 0 rows affected (0.04 sec)
mysql>?show master status;
+------------------+----------+--------------+------------------+
| File ? ? ? ? ? ? | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000015 | ? ? ?107 | ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ?|
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)
4、另外啟動一個終端,為邏輯卷創建快照卷,做完快照釋放施加的鎖請求;
[root@localhost ~]#?lvcreate -L 1G -s -p r -n lv1-snap /dev/vg1/lv1
? Logical volume "lv1-snap" created
mysql>?unlock tables;
Query OK, 0 rows affected (0.00 sec)
5、掛載快照卷,并備份數據,備份完成卸載快照卷并刪除;
[root@localhost ~]# cp -rp /mnt/* /backup1
[root@localhost ~]# umount /mnt/
[root@localhost ~]#?lvremove /dev/vg1/lv1-snap
Do you really want to remove active logical volume lv1-snap? [y/n]: y
? Logical volume "lv1-snap" successfully removed
6、停止mysql服務,模擬數據庫數據損壞,進行數據恢復;
[root@localhost ~]# service mysqld stop
Shutting down MySQL... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ ?OK ?]
[root@localhost ~]# rm -rf /Mydata/*
[root@localhost ~]# cp -rp /backup1/* /Mydata/
[root@localhost ~]# service mysqld start
Starting MySQL.. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ ?OK ?]
7、檢測數據恢復是否正常恢復完成。
mysql> show databases;
+--------------------+
| Database ? ? ? ? ? |
+--------------------+
| information_schema |
| hellodb ? ? ? ? ? ?|
| mysql ? ? ? ? ? ? ?|
| performance_schema |
| schooldb ? ? ? ? ? |
| test ? ? ? ? ? ? ? |
| xiaozheng ? ? ? ? ?|
+--------------------+
7 rows in set (0.01 sec)
mysql> use schooldb
Database changed
mysql> show tables;
+--------------------+
| Tables_in_schooldb |
+--------------------+
| studentstb ? ? ? ? |
+--------------------+
1 row in set (0.00 sec)
mysql> select * from studentstb;
+----+-----------+------+--------+--------------+
| Id | Name ? ? ?| Age ?| Gender | Courses ? ? ?|
+----+-----------+------+--------+--------------+
| ?1 | Zhang San | ? 19 | M ? ? ?| Shujujiegou ?|
| ?2 | Li Ling ? | ? 18 | F ? ? ?| Daxueyingyu ?|
| ?3 | Wang Wu ? | ? 20 | M ? ? ?| Dianluyuanli |
+----+-----------+------+--------+--------------+
3 rows in set (0.00 sec)
七、使用xtrabackup進行數據備份恢復
1、下載并安裝xtrabackup;
[root@localhost ~]# ls
anaconda-ks.cfg ?install.log ? ? ? ? percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm
hellodb.sql ? ? ?install.log.syslog
[root@localhost ~]#?yum -y install percona-xtrabackup-2.1.4-656.rhel6.x86_64.rpm
2、創建有備份權限的數據庫用戶;
mysql> create user 'xtrabackup'@'localhost' identified by 'mypass';
Query OK, 0 rows affected (0.09 sec)
mysql> revoke all privileges,grant option from 'xtrabackup'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> grant reload,lock tables,replication client,event on *.* to 'xtrabackup'@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
3、對數據庫進行完全備份;
[root@localhost ~]#?innobackupex --user=xtrabackup --password=mypass /backup2
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Ireland Ltd 2009-2012. ?All Rights Reserved.
........
innobackupex: Backup created in directory '/backup2/2013-09-08_21-06-19'
innobackupex: MySQL binlog position: filename 'mysql-bin.000017', position 598
130908 21:06:24 ?innobackupex: Connection to database server closed
130908 21:06:24 ?innobackupex: completed OK!
4、關閉mysql服務并模擬數據損壞,并準備一個完全備份(prepare);
[root@localhost ~]# service mysqld stop
Shutting down MySQL... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ ?OK ?]
[root@localhost ~]# rm -rf /mydata/data/*
[root@localhost backup2]# innobackupex --apply-log /backup2/2013-09-08_21-06-19/
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Ireland Ltd 2009-2012. ?All Rights Reserved.
........
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
130908 21:13:44 ?InnoDB: Starting shutdown...
130908 21:13:48 ?InnoDB: Shutdown completed; log sequence number 1626636
130908 21:13:48 ?innobackupex: completed OK!
5、從一個完全備份中恢復數據,并檢測數據庫數據是否正常恢復完成。
[root@localhost ~]#?innobackupex --copy-back /backup2/2013-09-08_21-06-19/
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Ireland Ltd 2009-2012. ?All Rights Reserved.
............
innobackupex: Copying '/backup2/2013-09-08_21-06-19/ib_logfile1' to '/mydata/data'
innobackupex: Finished copying back files.
130908 21:21:23 ?innobackupex: completed OK!
[root@localhost ~]#service mysqld start
[root@localhost ~]# innobackupex --copy-back /backup2/2013-09-08_21-06-19/
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Ireland Ltd 2009-2012. ?All Rights Reserved.
............
innobackupex: Copying '/backup2/2013-09-08_21-06-19/ib_logfile1' to '/mydata/data'
innobackupex: Finished copying back files.
130908 21:21:23 ?innobackupex: completed OK!
[root@localhost ~]# service mysqld start
Starting MySQL.. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [ ?OK ?]
mysql> use schooldb
Database changed
mysql> show tables;
+--------------------+
| Tables_in_schooldb |
+--------------------+
| studentstb ? ? ? ? |
+--------------------+
1 row in set (0.00 sec)
mysql> select * from studentstb;
+----+-----------+------+--------+--------------+
| Id | Name ? ? ?| Age ?| Gender | Courses ? ? ?|
+----+-----------+------+--------+--------------+
| ?1 | Zhang San | ? 19 | M ? ? ?| Shujujiegou ?|
| ?2 | Li Ling ? | ? 18 | F ? ? ?| Daxueyingyu ?|
| ?3 | Wang Wu ? | ? 20 | M ? ? ?| Dianluyuanli |
+----+-----------+------+--------+--------------+
3 rows in set (0.00 sec)
--------------------------------------------------------------------
6、在測試數據庫中新增數據,實現數據的增量備份;
7、進行第一次增量備份;
8、繼續于測試數據庫中新增數據,進行第二次增量備份;
9、關閉mysql服務并模擬數據庫數據損壞,進行兩次增量備份的恢復;
10、檢測增量備份的數據恢復是否正常完成。
mysql 熱備
在運維中需定期備份mysql,為崩潰后的恢復數據做準備。一般分為冷備和熱備,
冷備就是停掉mysql服務,直接cp文件,但是在生產環境中,很 少有機會這樣,一般都是在mysql提供服務的時候就進行備份,因此這牽扯到數據一致性的問題。
所以,在MyISAM存儲引擎下,我們的思路就是:鎖表 –>備份–>解鎖
# 進入mysql環境 鎖表
root@mysql : test >?flush tables with read lock;# 在系統環境下 備份
cp -R test /tmp/backup/test_back
# 進入mysql環境 解鎖
root@mysql : test >?unlock tables;
mysqlhotcopy 熱備工具
當然也可通過mysql自帶的工具 mysqlhotcopy 解決,事實上mysqlhotcopy是個perl程序,
提供MyISAM下的鎖表備份解鎖操做。因為是perl腳本,所以需要機器上有PERL-DBD 模塊,
不然會報錯: Can’t locate DBI.pm in @INC ,安裝過程很簡單,在這里: perl-DBI連接mysql
mysqlhotcopy也很簡單,參數可用 –help 查看
# 備份test庫為新的test_tmp庫,與test同級目錄?
mysqlhotcopy ?--user=root ?--password=root ? test ? test_tmp
?
# 備份test庫 到 /tmp/ 目錄下?
mysqlhotcopy ?--user=root ?--password=root ? test ? /tmp/
?
# --checkpoint dbinfo.checkpoint 這個是指定存放操作記錄的數據庫/表# --addtodest 增量備份,新的備份自動覆蓋掉原來的
mysqlhotcopy ?--user=root ?--password=root ?--checkpoint=dbinfo.checkpoint ?--addtodest ?test ?/tmp/
?
mysqlhotcopy的安裝方法如下:
yum -y install perl perl-DBI
wget?http://down1.chinaunix.net/distfiles/DBD-mysql-3.0002.tar.gz
tar zxvf ?DBD-mysql-3.0002.tar.gz
cd DBD-mysql-3.0002
perl Makefile.PL ?–mysql_config=/usr/local/mysql/bin/mysql_config
make
make test
make install
?
記錄到到數據庫的方法:
1、在數據庫段分配一個專門用于備份的用戶
mysql> grant select,reload,lock tables on *.* to 'hotcopyer'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2、在/etc/my.cnf或者登陸用戶的個人主文件.my.cnf里面添加
[mysqlhotcopy]
interactive-timeout
user=hotcopyer
password=123456
port=3306
?
重新加載mysql
3、可以把記錄寫到專門的表中。具體察看幫助。
mysql> create database hotcopy;
Query OK, 1 row affected (0.03 sec)
mysql> use hotcopy
Database changed
mysql> create table checkpoint(time_stamp timestamp not null,src varchar(32),dest varchar(60), msg varchar(255));
Query OK, 0 rows affected (0.01 sec)
同時記得給hotcopyer用戶權限。
mysql> grant insert on hotcopy.checkpoint to hotcopyer@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit;
4、備份數據(寫入數據庫{備份的結果},增量備份)
/usr/local/mysql/bin/mysqlhotcopy --user=root --password=mysql --checkpoint=hotcopy.checkpoint --addtodest radius /bak
?
5、查看
mysql> show databases;
+--------------------+
| Database ? ? ? ? ? |
+--------------------+
| information_schema |
| 1234la ? ? ? ? ? ? |
| conntrack ? ? ? ? ?|
| hotcopy ? ? ? ? ? ?|
| mysql ? ? ? ? ? ? ?|
| pinphp ? ? ? ? ? ? |
| radius ? ? ? ? ? ? |
| test ? ? ? ? ? ? ? |
| vod ? ? ? ? ? ? ? ?|
| web ? ? ? ? ? ? ? ?|
+--------------------+
10 rows in set (0.00 sec)
mysql> show tables;
+-------------------+
| Tables_in_hotcopy |
+-------------------+
| checkpoint ? ? ? ?|
+-------------------+
1 row in set (0.00 sec)
mysql> select * from checkpoint;
+---------------------+--------+---------------+-----------+
| time_stamp ? ? ? ? ?| src ? ?| dest ? ? ? ? ?| msg ? ? ? |
+---------------------+--------+---------------+-----------+
| 2012-08-25 21:50:26 | radius | /bak/radius ? | Succeeded |
+---------------------+--------+---------------+-----------+
1 row in set (0.00 sec)
mysql>
?
一、mysqldump備份結合binlog日志恢復
MySQL備份一般采取全庫備份加日志備份的方式,例如每天執行一次全備份,每小時執行一次二進制日志備份。這樣在MySQL故障后可以使用全備份和日志備份將數據恢復到最后一個二進制日志備份前的任意位置或時間
binlog日志恢復介紹
·首先要開啟binary log功能
通過編輯my.cnf中的log-bin選項可以開啟二進制日志;形式如下:
log-bin [=DIR/[filename]] ?(配置文件中只寫log_bin不寫后面的文件名和路徑時,默認存放在/usr/local/mysql/data目錄下,文件名為主機名-bin.000001…命名)
·下面用一個例子來說明binlog日志恢復數據的方法
查看二進制日志中的事件,默認顯示可找到的第一個二進制日志文件中的事件,包含了日志文件名、事件的開始位置、事件類型、結束位置、信息等內容。
?
語法格式:SHOW BINLOG EVENTS?[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
選項解析:
IN 'log_name' ? ? ?指定要查詢的binlog文件名(不指定就是第一個binlog文件)
FROM pos ? ? ? ? ? ? ? 指定從哪個pos起始點開始查起(不指定就是從整個文件首個pos點開始算)
offset ? ? ? ? ? 偏移量(不指定就是0),例如為3就會從第3行開始
row_count ? ? ? ? ?查詢總條數(不指定就是所有行)
?
顯示信息中的參數介紹:
Format_desc ?此事件為格式描述事件
Query ?為查詢事件
BEGIN ?為事務開始
Table_map ?為表映射事件
Write_rows ? ?為我們執行的insert事件
XidXid ? ?時間是自動提交事務的動作
Rotate ? ?為日志輪換事件,是我們執行flush logs開啟新日志文件引起的。
COMMIT ? ?為事務的提交
為了便于查看記錄了行變化信息的事件在當時具體執行了什么樣的SQL語句可以使用mysqlbinlog工具的-v(--verbose)選項,該選項會將行事件重構成被注釋掉的偽SQL語句,
如果想看到更詳細的信息可以將該選項給兩次如-vv,這樣可以包含一些數據類型和元信息的注釋內容。
執行以下命令,我們可以看到上圖中顯示的信息:
mysqlbinlog ?-v ?/usr/local/mysql/data/mysql-bin.000002
另外mysqlbinlog和可以通過--read-from-remote-server選項從遠程服務器讀取二進制日志文件,
這時需要一些而外的連接參數,如-h,-P,-p,-u等,這些參數僅在指定了--read-from-remote-server后有效。
從上圖中可以看出delete事件發生position是291,事件結束position是420
恢復流程:直接用bin-log日志將數據庫恢復到刪除位置291前,然后跳過故障點,再進行恢復。下面所有的操作,命令如下:
常見的選項有以下幾個:
--start-datetime
從二進制日志中讀取指定時間戳或者本地計算機時間之后的日志事件。
--stop-datetime
從二進制日志中讀取指定時間戳或者本地計算機時間之前的日志事件。
--start-position ? ? ? ?
從二進制日志中讀取指定position 事件位置作為開始。
--stop-position
從二進制日志中讀取指定position 事件位置作為事件截至。
刪除test數據庫,利用binlog恢復數據,完成后發現數據都恢復過來了。
注意:
(1)在實際生產環境中,如果遇到需要恢復數據庫的情況,不要讓用戶能訪問到數據庫,以避免新的數據插入進來,以及在主從的環境下,關閉主從。
(2)以上方法中僅僅利用了binlog來恢復數據,并沒有使用到mysqldump全庫備份來恢復數據庫,所以在恢復數據前要刪除數據庫。
2.利用腳本實現mysql的備份與恢復
(1)mysqldump介紹
mysqldump是mysql用于備份和數據轉移的一個工具。它主要產生一系列的SQL語句,可以封裝到文件,該文件包含有所有重建你的數據庫所需要的?SQL命令如CREATE DATABASE,CREATE TABLE,INSERT等等。可以用來實現輕量級的快速遷移或恢復數據庫。
mysqldump?是將數據表導成?SQL?腳本文件,在不同的?MySQL?版本之間升級時相對比較合適,這也是最常用的備份方法。
mysqldump一般在數據量很小的時候(幾個G)可以用于備份。當數據量比較大的情況下,就不建議用mysqldump工具進行備份了。
?
·數據庫的導出
導出對象說明:
mysqldump可以針對單個表、多個表、單個數據庫、多個數據庫、所有數據庫進行導出的操作
#?mysqldump [options] db_name [tbl_name ...]???//導出指定數據庫或單個表
#?mysqldump [options] --databases db_name ...???//導出多個數據庫
#mysqldump [options] --all-databases???????????//導出所有
?
·數據庫的導入
mysql ?-uroot ?-p ?[options] ?[db_name] ?[tbl_name] ?< ?/路徑/備份文件
?
生產環境中Mysql數據庫的備份是周期性重復的操作,所以通常是要編寫腳本實現,通過crond計劃任務周期性執行備份腳本。
本文轉自 chengxuyonghu 51CTO博客,原文鏈接:http://blog.51cto.com/6226001001/1911031,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的mysql的数据备份及恢复的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 分布式序列号_分布式序列号生成
- 下一篇: 单片机外文参考文献期刊_单片机-英文参考