MySQL之數據備份與還原

 

一 mysqldump指令實現數據備份、mysql指令實現數據還原

  常常有朋友問我,DBA究竟是作什麼的,百科上說:數據庫管理員(Database Administrator,簡稱DBA),是從事管理和維護數據庫管理系統(DBMS)的相關工做人員的統稱,屬於運維工程師的一個分支,主要負責業務數據庫從設計、測試到部署交付的全生命週期管理。DBA的核心目標是保證數據庫管理系統的穩定性、安全性、完整性和高性能。 html

  百科出來的內容老是那麼的專業,讓人看完以後的感受是很解釋的很好,可是我沒有看懂或者似懂非懂的模糊感。。哈哈,其實我認爲,DBA主要作三件事情:1.保證公司的數據不丟失不損壞 2.提升數據庫管理系統的工做性能node

  對於如今的公司來說,數據變得尤其重要,能夠說最重要,你的網站能夠沒法訪問,服務器能夠宕機,可是數據絕對不能丟,因此咱們本節內容就衝着若是保護好數據而來的。本篇博客的內容並非很深刻,畢竟不是專業的DBA,只是做爲超哥的講課內容,讓你們學一些數據備份的基本操做,入門級別我們只講一下mysqldump指令,至於若是作主從複製,雙機熱備,數據庫高可用,數據庫集羣,你們能夠去看我其餘的博客,博客寫完了,目前還在整理,整理好以後我就發出來供你們批評指正,共同窗習~,由於畢竟我們學的是開發,本篇內容就看成是拓展本身的知識領域吧,對你來說都是頗有好處的~你們加油吧mysql

  那麼咱們就來學一下mysqldump指令。linux

    1.首先咱們先建立一個名爲crm2的庫

    mysql> create database crm2;
    mysql> show create database crm2;
  2.切換到crm2庫下
    mysql> use crm2;
  3.建立兩張表,student表和class表
    mysql> create table tb1(id int primary key,name char(8) not null,age int,class_id int not null);
    Query OK, 0 rows affected (0.63 sec)

    mysql> create table class(id int primary key,cname char(20) not null);
    Query OK, 0 rows affected (0.34 sec)

  4.給兩張表插入一些數據

    mysql> insert into class values(1,'一班'),(2,'二班');
    mysql> insert into student values(1,'Jaden',18,1),(2,'太白',45,1),(3,'彥濤',30,2);

  5.查看一下兩個表的數據
    mysql> select * from student;
    +----+--------+------+----------+
    | id | name | age | class_id |
    +----+--------+------+----------+
    | 1 | Jaden | 18 | 1 |
    | 2 | 太白 | 45 | 1 |
    | 3 | 彥濤 | 30 | 2 |
    +----+--------+------+----------+
    3 rows in set (0.00 sec)

    mysql> select * from class;
    +----+--------+
    | id | cname |
    +----+--------+
    | 1 | 一班 |
    | 2 | 二班 |
    +----+--------+
    2 rows in set (0.00 sec)

    好,前期工做準備完畢,下面咱們來經過mysqldump指令進行備份,在cmd窗口下執行下面的指令,注意不是進入mysql裏面輸入的,是在外面面。sql

    C:\WINDOWS\system32>mysqldump -h 127.0.0.1 -u root -p666 crm2 > f:\數據庫備份練習\crm2.sql     Warning: Using a password on the command line interface can be insecure. (這個提示是由於我把密碼顯示出來了,本身在本身電腦上測試的時候,這個警告能夠忽略)shell

    而後咱們就會發如今這個'f:\數據庫備份練習'路徑下面就有了crm2.sql文件     而後咱們經過nodepad++(隨便一個文本編輯器均可以),打開看看裏面的內容:數據庫

    -- MySQL dump 10.13 Distrib 5.6.42, for Win64 (x86_64)     --     -- Host: 127.0.0.1 Database: crm2vim


    -- Server version 5.6.42windows

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /;     /!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /;     /!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /;     /!40101 SET NAMES utf8 /;     /!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE /;     /!40103 SET TIME_ZONE='+00:00' /;     /!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 /;     /!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 /;     /!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' /;     /!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;安全

    --     -- Table structure for table class     --

    DROP TABLE IF EXISTS class; --若是以前存在class表,就將以前的class表刪除     /*!40101 SET @saved_cs_client = @@character_set_client /;     /!40101 SET character_set_client = utf8 /;     CREATE TABLE class ( --建立表     id int(11) NOT NULL,     cname char(20) NOT NULL,     PRIMARY KEY (id)     ) ENGINE=InnoDB DEFAULT CHARSET=utf8;     /!40101 SET character_set_client = @saved_cs_client */;

    --     -- Dumping data for table class     --

    LOCK TABLES class WRITE; --鎖表     /*!40000 ALTER TABLE `class` DISABLE KEYS /;     INSERT INTO class VALUES (1,'一班'),(2,'二班'); --插入數據     /!40000 ALTER TABLE class ENABLE KEYS */;     UNLOCK TABLES; --解鎖     ......     等等大體內容(若是你插入的數據有中文,這裏顯示的確實亂碼的同窗,往回看看個人關於修改mysql字符集編碼的博客,將編碼改成統一的,而後從新操做一遍就能夠了)

    上面的這個指令的意思就是將crm2這個庫,備份到這個'f:\數據庫備份練習'路徑下,而且命名爲crm2.sql文件。

  執行備份語句的時候,其中能夠加上不少的參數,用來添加一些備份的時候的特殊要求的,其中有一個-B參數,執行備份語句時,若是加上了-B參數,那麼未來再執行數據還原的時候,就不須要本身到數據庫裏面去先建立一個crm2這個庫了,而且執行數據還原語句的時候就不須要指定crm2這個庫了,若是沒有加-B參數,就須要自行到數據庫中先建立一個crm2這個庫,而且執行語句是要指定將數據恢復到這個crm2庫裏面,看對比:   首先上面咱們執行的語句中沒有加上-B參數,那麼恢復數據的時候,怎麼恢復呢,看下面的語句

      1.鏈接到數據庫中,並建立crm2這個庫
      mysql -u root -p666
      mysql> create database crm2;
    2.退出mysql或者從新啓動一個cmd窗口,而後執行
      mysql -uroot -p 庫名 < mysqldump出來的那個sql文件的路徑
    例如:mysql -uroot -p crm2< f:\數據庫備份練習\crm2.sql
    3.這樣就恢復好了,咱們鏈接上數據庫並查看裏面的內容:
      mysql -u root -p666
      use crm2;
      mysql> show tables;
      +----------------+
      | Tables_in_crm2 |
      +----------------+
      | class |
      | student |
      +----------------+
      2 rows in set (0.00 sec)

      mysql> select * from student;
      +----+--------+------+----------+
      | id | name | age | class_id |
      +----+--------+------+----------+
      | 1 | Jaden | 18 | 1 |
      | 2 | 太白 | 45 | 1 |
      | 3 | 彥濤 | 30 | 2 |
      +----+--------+------+----------+
      3 rows in set (0.00 sec)

      mysql> desc student;
      +----------+---------+------+-----+---------+-------+
      | Field | Type | Null | Key | Default | Extra |
      +----------+---------+------+-----+---------+-------+
      | id | int(11) | NO | PRI | NULL | |
      | name | char(8) | NO | | NULL | |
      | age | int(11) | YES | | NULL | |
      | class_id | int(11) | NO | | NULL | |
      +----------+---------+------+-----+---------+-------+
      4 rows in set (0.02 sec)

    就這麼簡單咱們就將數據庫恢復了,表中的數據和表結構都恢復了。

    執行mysqldump的時候加上了-B參數,那麼恢復數據的時候,就不須要指定是恢復那個庫裏面的數據了,也不須要提早到數據庫中建立一個crm2庫了,由於-B參數導出的文件中自帶建立數據庫和鏈接數據庫的功能:(使用-B參數備份出來的內容自帶create database 庫名和use 庫名的功能)

      1.mysqldump -uroot -p -B crm2> f:\數據庫備份練習\crm2.sql

    2.在cmd窗口下執行:mysql -uroot -p < f:\數據庫備份練習\crm2.sql
    3.查看一下是否恢復了:
      mysql> show databases;
      +--------------------+
      | Database |
      +--------------------+
      | information_schema |
      | crm2 |
      | d1 |
      | mysql |
      | performance_schema |
      | test |
      +--------------------+
      mysql> use crm2;
      Database changed
      mysql> show tables;
      +----------------+
      | Tables_in_crm2 |
      +----------------+
      | class |
      | student |
      +----------------+
      2 rows in set (0.00 sec)
      mysql> select * from class;
      +----+--------+
      | id | cname |
      +----+--------+
      | 1 | 一班 |
      | 2 | 二班 |
      +----+--------+
      2 rows in set (0.00 sec)

      mysql> desc student;
      +----------+---------+------+-----+---------+-------+
      | Field | Type | Null | Key | Default | Extra |
      +----------+---------+------+-----+---------+-------+
      | id | int(11) | NO | PRI | NULL | |
      | name | char(8) | NO | | NULL | |
      | age | int(11) | YES | | NULL | |
      | class_id | int(11) | NO | | NULL | |
      +----------+---------+------+-----+---------+-------+
      4 rows in set (0.02 sec)

    上面咱們就完成了一個簡單數據庫備份和恢復的過程(在linux下面還能夠在導出的時候壓縮文件內容,減少空間佔用mysqldump -uroot -p -B crm2|gzip> f:\數據庫備份練習\crm2.sql.gz,windows好像是沒有自帶的zip壓縮指令,你們有興趣的能夠去查一下,做爲了解吧)

    原理:其實很簡單,就是把數據從mysql庫裏面以邏輯的sql語句的形式直接輸出或者生成備份文件的過程。

    上面咱們說完了單庫備份,下面來看看多個庫怎麼備份呀       C:\WINDOWS\system32>mysqldump -uroot -p -B crm2 mysql> f:\數據庫備份練習\crm2mysql.sql       Enter password: ***     就是多個庫名用空格分開,這樣備份出來的sql文件仍是一個,也就是這兩個庫都備份到一個文件裏面了。通常做備份的時候的文件名字都是庫名.sql,多個庫通常就是庫名庫名庫名.sql。

    那若是咱們將不少的庫都是一塊兒備份的,可是咱們只想恢復其中一個庫怎麼辦,這樣搞是否是就不太合適了(由於一個文件算是一個備份,在進行恢復的時候,一下就將文件裏面的全部的庫都還原了,效率低不說,還麻煩),那就須要分庫備份了,也就是將每一個庫分開來進行備份,本身備份本身的,一個一個來

    其實就是執行多個單庫備份的語句       mysqldump -uroot -p -B crm2> f:\數據庫備份練習\crm2.sql       mysqldump -uroot -p -B mysql> f:\數據庫備份練習\crm2.sql       ...     可是若是庫比較多(企業的數據庫裏通常都會有多個庫),這麼寫就比較麻煩了,因此須要獲取全部數據庫的庫名,而後根據庫名來循環執行上面的單庫備份的語句,並將庫名做爲變量放到語句裏面進行循環。須要寫腳本(就是一堆系統指令組成的程序)來作這件事情了,具體怎麼作,我們就不說啦,目前知道一下就能夠了(寫一個.sh文件,而後sh+文件來執行這個文件,文件裏面寫個for循環就好了,等你學會寫shell腳本就會了)

    備份表:       上面咱們說的是如何備份庫,如今咱們來看看若是備份其中的某個表:       語法:mysqldump -u 用戶名 -p 庫名 表名> (路徑)備份的文件名         mysqldump -uroot -p crm2 student> f:\數據庫備份練習\crm2_table_student.sql

    單純進行表備份的時候,就不用寫-B參數了,由於庫crm2後面就是student表了,也就是說你的crm2庫還在呢

    備份多個表:       語法:mysqldump -u 用戶名 -p 庫名 表名1 表名2> (路徑)備份的文件名

    和多個庫一塊兒備份有一個一樣的問題,就是若是我只須要恢復某一張表怎麼辦,上面的多表備份是否是也不太合適啊,因此又要進行分表備份     又是一樣的套路,獲取全部的表名,寫一個循環腳本,執行單表備份的指令。     分庫分表備份有些缺點:文件多,很碎,數據量很是大的時候,效率低       1.作一個完整的全備,再作一個分庫分表的備份       2.腳本批量恢復多個sql文件。     

  備份數據庫表結構:     利用mysqldump -d參數只備份表的結果,例如:備份crm2庫的全部表的結構:

    C:\WINDOWS\system32>mysqldump -uroot -p -B -d crm2> f:\數據庫備份練習\crm2stru.sql     Enter password: ***

  備份出來的文件打開一看,就沒有了插入數據的部分

  mysqldump的關鍵參數說明:       1.-B指定多個庫,增長建庫語句和use 語句       2.--compact 去掉註釋,適合調試輸出,生產上不用       3.-A或者--all-databases         例如:C:\WINDOWS\system32>mysqldump -uroot -p -B -A> f:\數據庫備份練習\all.sql         Enter password: ***

      4.-F刷新binlog日誌(binlog具體是什麼,後面我們再解釋)       5.--master-data 增長binlog日誌文件名及對應的爲支點。       6.-x,--lock-all-tables 將全部的表鎖住,通常mysql引擎都是鎖表,所有都不能使用了,全部不太友好

      7.--add-locks這個選項會在INSERT語句中捆上一個LOCK TABLE和UNLOCK TABLE語句。這就防止在這些記錄被再次導入數據庫時其餘用戶對錶進行的操做(mysql默認是加上的)       8.-l,--lock-tables Lock all tables for read       9.-d 只備份表結構       10.-t 只備份數據       11. --single-transaction 開啓事務,適合innodb事務數據庫備份         InnoDB表在備份時,一般啓用選項--single-transaction來保證備份的一致性,實際上他的工做原理時設定本次會話的隔離界別爲:REPEATABLE READ,以確保本次會話(dump)時,不會看到其餘會話已經提交了數據。

        MyISAM全庫備份指令推薦:(gzip是壓縮文件爲zip類型的)         mysqldump -uroot -p666 -A -B --master-data=2 -x|gzip>f:\數據庫備份練習\all.sql.gz         InnoDB全庫備份指令推薦:         mysqldump -uroot -p666 -A -B --master-data=2 --single-transaction|gzip>f:\數據庫備份練習\all.sql.gz

    數據恢復:

  1、經過source命令恢復數據庫     進入mysql數據庫控制檯,mysql -uroot -p666登錄後     mysql>use 數據庫;     而後使用source命令,後面參數爲腳本文件(如這裏用到的是.sql文件,若是你備份的是.txt文件,那這裏寫.txt文件)

    mysql>source crm2.sql #這個文件是系統路徑下的,默認是登錄mysql前的系統路徑,在mysql中查看系統路徑的方法是經過system+系統命令來搞的     mysql>system ls   2、利用mysql命名恢復(標準)     mysql -root -p666 -e "use crm2;drop table student;show tables;" 必須是雙引號     mysql -uroot -p666 crm2<f:\數據庫備份練習\crm2.sql     mysql -uroot -p666 -e "use crm2;show tables;"

    注:若是sql文件裏面沒有use db這樣的字樣時,在導入時就要指定數據庫名了。

    mysql -uroot -p666 crm2<.sql文件

    建議備份數據庫時都指定上-B參數,效果好

    說明:mysql不光能夠恢復mysqldump的備份,只要文件中是sql語句,均可以經過mysql命令執行到數據庫中

    mysql 帶-e參數實現非交互式對話,就是不須要到mysql裏面去,在外面執行裏面的指令的方法,例如:mysql -uroot -p666 -e "use crm2;show tables;",可是語句必須是雙引號包裹。

    批量恢復庫:找到全部的數據庫名,而後經過庫名去循環恢復          關於binlog,等我整理好在給你們吧~~~

 

 

#下面的這些內容是我以前整理的,你們不要看了,我會改版的,等新版出來以後在發出來給你們,下面的太晦澀難懂了~~~

 

二 MySQL數據備份

  #1. 物理備份: 直接複製數據庫文件,適用於大型數據庫環境。但不能恢復到異構系統中如Windows。
#2. 邏輯備份: 備份的是建表、建庫、插入等操做所執行SQL語句,適用於中小型數據庫,效率相對較低。
#3. 導出表: 將表導入到文本文件中。

 

1、使用mysqldump實現邏輯備份

  #語法:
# mysqldump -h 服務器 -u用戶名 -p密碼 數據庫名 > 備份文件.sql

#示例:
#單庫備份
mysqldump -uroot -p123 db1 > db1.sql
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql

#多庫備份
mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql

#備份全部庫
mysqldump -uroot -p123 --all-databases > all.sql

 

  • 備份實例

  mysqldump -u用戶名 -p密碼 數據庫名 > 導出的文件名

C:\Users\jack> mysqldump -uroot -pmysql sva_rec > e:\sva_rec.sql

導出一個表,包括表結構和數據

mysqldump -u用戶名 -p 密碼 數據庫名 表名> 導出的文件名

C:\Users\jack> mysqldump -uroot -pmysql sva_rec date_rec_drv> e:\date_rec_drv.sql

導出一個數據庫結構

C:\Users\jack> mysqldump -uroot -pmysql -d sva_rec > e:\sva_rec.sql

導出一個表,只有表結構

mysqldump -u用戶名 -p 密碼 -d數據庫名 表名> 導出的文件名

C:\Users\jack> mysqldump -uroot -pmysql -d sva_rec date_rec_drv> e:\date_rec_drv.sql

 

2、恢復邏輯備份

  #方法一:
[root@localhost backup]# mysql -uroot -p123 < /backup/all.sql

#方法二:
mysql> use db1;
mysql> SET SQL_LOG_BIN=0;
mysql> source /root/db1.sql

#注:若是備份/恢復單個庫時,能夠修改sql文件
DROP database if exists school;
create database school;
use school;

 

3、備份/恢復案例

  #數據庫備份/恢復實驗一:數據庫損壞
備份:
1. # mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql
2. # mysql -uroot -p123 -e 'flush logs' //截斷併產生新的binlog
3. 插入數據 //模擬服務器正常運行
4. mysql> set sql_log_bin=0; //模擬服務器損壞
mysql> drop database db;

恢復:
1. # mysqlbinlog 最後一個binlog > /backup/last_bin.log
2. mysql> set sql_log_bin=0;
mysql> source /backup/2014-02-13_all.sql //恢復最近一次徹底備份
mysql> source /backup/last_bin.log //恢復最後個binlog文件


#數據庫備份/恢復實驗二:若是有誤刪除
備份:
1. mysqldump -uroot -p123 --all-databases > /backup/`date +%F`_all.sql
2. mysql -uroot -p123 -e 'flush logs' //截斷併產生新的binlog
3. 插入數據 //模擬服務器正常運行
4. drop table db1.t1 //模擬誤刪除
5. 插入數據 //模擬服務器正常運行

恢復:
1. # mysqlbinlog 最後一個binlog --stop-position=260 > /tmp/1.sql
# mysqlbinlog 最後一個binlog --start-position=900 > /tmp/2.sql
2. mysql> set sql_log_bin=0;
mysql> source /backup/2014-02-13_all.sql //恢復最近一次徹底備份
mysql> source /tmp/1.log //恢復最後個binlog文件
mysql> source /tmp/2.log //恢復最後個binlog文件

注意事項:
1. 徹底恢復到一個乾淨的環境(例如新的數據庫或刪除原有的數據庫)
2. 恢復期間全部SQL語句不該該記錄到binlog中

 

4、實現自動化備份

  備份計劃:
1. 什麼時間 2:00
2. 對哪些數據庫備份
3. 備份文件放的位置

備份腳本:
[root@localhost~]# vim /mysql_back.sql
#!/bin/bash
back_dir=/backup
back_file=`date +%F`_all.sql
user=root
pass=123

if [ ! -d /backup ];then
mkdir -p /backup
fi

# 備份並截斷日誌
mysqldump -u${user} -p${pass} --events --all-databases > ${back_dir}/${back_file}
mysql -u${user} -p${pass} -e 'flush logs'

# 只保留最近一週的備份
cd $back_dir
find . -mtime +7 -exec rm -rf {} \;

手動測試:
[root@localhost ~]# chmod a+x /mysql_back.sql
[root@localhost ~]# chattr +i /mysql_back.sql
[root@localhost ~]# /mysql_back.sql

配置cron:
[root@localhost ~]# crontab -l
2 * * * /mysql_back.sql

 

5、表的導出和導入

  SELECT... INTO OUTFILE 導出文本文件
示例:
mysql> SELECT * FROM school.student1
INTO OUTFILE 'student1.txt'
FIELDS TERMINATED BY ',' //定義字段分隔符
OPTIONALLY ENCLOSED BY '」' //定義字符串使用什麼符號括起來
LINES TERMINATED BY '\n' ; //定義換行符


mysql 命令導出文本文件
示例:
# mysql -u root -p123 -e 'select * from student1.school' > /tmp/student1.txt
# mysql -u root -p123 --xml -e 'select * from student1.school' > /tmp/student1.xml
# mysql -u root -p123 --html -e 'select * from student1.school' > /tmp/student1.html

LOAD DATA INFILE 導入文本文件
mysql> DELETE FROM student1;
mysql> LOAD DATA INFILE '/tmp/student1.txt'
INTO TABLE school.student1
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '」'
LINES TERMINATED BY '\n';

 

 

  #可能會報錯
mysql> select * from db1.emp into outfile 'C:\\db1.emp.txt' fields terminated by ',' lines terminated by '\r\n';
ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable


#數據庫最關鍵的是數據,一旦數據庫權限泄露,那麼經過上述語句就能夠輕鬆將數據導出到文件中而後下載拿走,於是mysql對此做了限制,只能將文件導出到指定目錄
在配置文件中
[mysqld]
secure_file_priv='C:\\' #只能將數據導出到C:\\下

重啓mysql
從新執行上述語句

 

6、數據庫遷移

  務必保證在相同版本之間遷移
# mysqldump -h 源IP -uroot -p123 --databases db1 | mysql -h 目標IP -uroot -p456
相關文章
相關標籤/搜索