MySQL備份和恢復之mysqldump和lvm2的使用

    邏輯備份:工具 mysqldump, mydumper, phpMyAdmin(備份的缺點:Schema和數據存儲一塊兒、會生成巨大的SQL語句、單個巨大的備份文件)連上MySQL後,將數據導出來。考慮到備份的數據可能會比較大,在比較在意硬盤空間狀況下可使用壓縮工具來先壓縮後存放。
php


    徹底備份並非指備份全部庫是指備份指定數據集當中的全部數據,一般也能夠是單個數據庫。徹底備份+增量備份時,先用mysqldump作一下徹底備份,過一個時間後,備份一下這個時間內的二進制日誌(每次備份都記錄一下位置二進制日誌內部的位置,後面就能夠了解其重要性了)。
    考慮可能會出現的硬盤自身故障,因此二進制日誌文件和數據文件不該該放置於同一個硬盤,一樣備份文件也不該該和數據文件一塊兒存放。html


    查看一下數據目錄
    MariaDB [hellodb]> select @@global.datadir;
    +------------------+
    | @@global.datadir |
    +------------------+
    | /mysql/data/     |
    +------------------+
    1 row in set (0.00 sec)
    查看一下當前有哪些二進制日誌
    MariaDB [hellodb]> show binary logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |     67307 |
    | mysql-bin.000002 |    977605 |
    | mysql-bin.000003 |       345 |
    | mysql-bin.000004 |     41213 |
    +------------------+-----------+
    4 rows in set (0.00 sec)
    在數據目錄下(/mysql/data)mysql-bin.index文件裏有存放了二進制日誌文件的索引
    [root@hostpc ~]# cat /mysql/data/mysql-bin.index
    ./mysql-bin.000001
    ./mysql-bin.000002
    ./mysql-bin.000003
    ./mysql-bin.000004
    [root@hostpc ~]# file /mysql/data/mysql-bin.000001  查看一下日誌文件類型
    /mysql/data/mysql-bin.000001: MySQL replication log
    mysqlbinlog能夠用來查看二進制日誌文件
    NAME
           mysqlbinlog - utility for processing binary log files
    
    SYNOPSIS
           mysqlbinlog [options] log_file ...
    
    DESCRIPTION
           The server′s binary log consists of files containing 「events」 that
           describe modifications to database contents. The server writes these
           files in binary format. To display their contents in text format,
           use the mysqlbinlog utility. You can also use mysqlbinlog to display
           the contents of relay log files written by a slave server in a
           replication setup because relay logs have the same format as binary
           logs. The binary log and relay log are discussed further in
           Section 5.2.4, 「The Binary Log」, and Section 16.2.2, 「Replication
           Relay and Status Files」.
    查看二進制日誌文件部份內容
    [root@hostpc ~]# mysqlbinlog /mysql/data/mysql-bin.000002 | less
    
    。。。。。。。。。
    BEGIN
    /*!*/;
    # at 364   事件開始的位置
    #150421 10:33:20 server id 1  end_log_pos 451   Query   thread_id=2     exec_time=0
         error_code=0
    use `mysql`/*!*/;
    SET TIMESTAMP=1429583600/*!*/;
    SET @@session.pseudo_thread_id=2/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    。。。。
    事件發生的日期和時間;(150421 10:33:20)
    事件發生在服務器的標識(server id)
    事件的結束位置:(end_log_pos 451)
    事件的類型:(Query)
    事件發生時所在的服務器執行此事件的線程的ID:(thread_id=2)
    語句的時間戳與將其寫入二進制文件中的時間差:(exec_time=0)
    錯誤代碼:(error_code=0)
    事件內容:(use `mysql`/*!*/;
    SET TIMESTAMP=1429583600/*!*/;
    SET @@session.pseudo_thread_id=2/*!*/;)                        
    
    GTID事件專屬:
    事件所屬的全局事務的GTID(爲MySQL上每個服務都定義了):(GTID 0-1-2)
    
    登陸MySQL後,能夠經過show binlog events in 'log_name'\G 來查看
    MariaDB [hellodb]> show binlog events in 'mysql-bin.000003'\G
    *************************** 1. row ***************************
       Log_name: mysql-bin.000003
            Pos: 4
     Event_type: Format_desc
      Server_id: 1
    End_log_pos: 248
           Info: Server ver: 10.0.13-MariaDB-log, Binlog ver: 4
           。。。。。。。。。mysql


   mysqlbinlog下經常使用的參數sql

    -h, --host=name     Get the binlog from server.
    -P, --port=#        Port number to use for connection or 0 for default to, in
                          order of preference, my.cnf, $MYSQL_TCP_PORT,
                          /etc/services, built-in default (3306).
    -u, --user=name     Connect to the remote server as username.
    --start-datetime=name     事件的起始時間
                        Start reading the binlog at first event having a datetime
                        equal or posterior to the argument; the argument must be
                        a date and time in the local time zone, in any format
                        accepted by the MySQL server for DATETIME and TIMESTAMP
                        types, for example: 2004-12-25 11:25:56 (you should
                        probably use quotes for your shell to set it properly).
    -j, --start-position=#     事件的起始位置 
                        Start reading the binlog at position N. Applies to the
                        first binlog passed on the command line.
    --stop-datetime=name       事件的結束時間
                        Stop reading the binlog at first event having a datetime
                        equal or posterior to the argument; the argument must be
                        a date and time in the local time zone, in any format
                        accepted by the MySQL server for DATETIME and TIMESTAMP
                        types, for example: 2004-12-25 11:25:56 (you should
                        probably use quotes for your shell to set it properly).
    --stop-position=#   事件的結束位置
                        Stop reading the binlog at position N. Applies to the
                        last binlog passed on the command line. 
       [root@hostpc ~]# mysqlbinlog --start-position=364 --stop-position=451 /mysql/data/mysql-bin.000002
    顯示了日誌文件從364到451的內容

    

    下面就來介紹MySQL備份工具mysqldump的使用,下面是mysqldump的部分手冊shell

       mysqldump - a database backup program

SYNOPSIS
       mysqldump [options] [db_name [tbl_name ...]]

DESCRIPTION
       The mysqldump client is a backup program originally written by Igor
       Romanenko. It can be used to dump a database or a collection of
       databases for backup or transfer to another SQL server (not
       necessarily a MySQL server). The dump typically contains SQL
       statements to create the table, populate it, or both. However,
       mysqldump can also be used to generate files in CSV, other delimited
       text, or XML format.

       If you are doing a backup on the server and your tables all are
       MyISAM tables, consider using the mysqlhotcopy instead because it
       can accomplish faster backups and faster restores. See
       mysqlhotcopy(1).

       There are three general ways to invoke mysqldump:

           shell> mysqldump [options] db_name [tbl_name ...]  這裏是備份指定庫中的單個或多個表
           shell> mysqldump [options] --databases db_name ...  這裏是備份指定的單個或多個庫
           shell> mysqldump [options] --all-databases   這是備份全部的庫
            -A, --all-databases  全部數據庫
            --all-databases, -A
           Dump all tables in all databases. This is the same as using the
           --databases option and naming all the databases on the command
           line.
            MyISAM, InnoDB: 溫備,在線業務只能讀,不能進行寫操做
                 -x, --lock-all-tables:鎖定全部表
                 --lock-all-tables, -x
                   Lock all tables across all databases. This is achieved by
                   acquiring a global read lock for the duration of the whole dump.
                   This option automatically turns off --single-transaction and
                   --lock-tables.
                 -l, --lock-tables:鎖定備份的表
                 --lock-tables, -l
                   For each dumped database, lock all tables to be dumped before
                   dumping them. The tables are locked with READ LOCAL to allow
                   concurrent inserts in the case of MyISAM tables. For
                   transactional tables such as InnoDB, --single-transaction is a
                   much better option than --lock-tables because it does not need
                   to lock the tables at all.
                   Because --lock-tables locks tables for each database separately,
                   this option does not guarantee that the tables in the dump file
                   are logically consistent between databases. Tables in different
                   databases may be dumped in completely different states.
            
            InnoDB:對InnoDB可執行熱備
                --single-transaction:啓動一個大的單一事務實現備份
            
            -B, --databases db_name1 db_name2 ...:備份指定的數據庫
            --databases, -B
           Dump several databases. Normally, mysqldump treats the first
           name argument on the command line as a database name and
           following names as table names. With this option, it treats all
           name arguments as database names.  CREATE DATABASE and USE
           statements are included in the output before each new database.
            
            -C, --compress:壓縮傳輸;須要消耗cpu資源的,經過資源使用狀況斷定是否使用此項
            --compress, -C
           Compress all information sent between the client and the server
           if both support compression.
           --master-data[=#]:#爲數值
                1:記錄CHANGE MASTER TO語句(有對應的二進制日誌文件和位置);此語句未被註釋;
                2:記錄爲註釋語句;

            --flush-logs, -F:鎖定表以後執行flush logs(實現日誌滾動)命令;
下面演示中,對hellodb庫進行操做,先作一次徹底備份,操做後對其進行一次增量備份
查看一下當前有哪些二進制日誌
MariaDB [hellodb]> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     67307 |
| mysql-bin.000002 |    977605 |
| mysql-bin.000003 |       345 |
| mysql-bin.000004 |     41213 |
+------------------+-----------+
4 rows in set (0.00 sec)

MariaDB [hellodb]> flush logs;  滾動一下日誌
Query OK, 0 rows affected (0.10 sec)

MariaDB [hellodb]> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     67307 |
| mysql-bin.000002 |    977605 |
| mysql-bin.000003 |       345 |
| mysql-bin.000004 |     41256 |
| mysql-bin.000005 |       365 |  這個是滾動後生成的日誌
+------------------+-----------+
5 rows in set (0.00 sec)
查看一下students表的結構
MariaDB [hellodb]> desc students;
+-----------+---------------------+------+-----+---------+----------------+
| Field     | Type                | Null | Key | Default | Extra          |
+-----------+---------------------+------+-----+---------+----------------+
| StuID     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| Name      | varchar(50)         | NO   |     | NULL    |                |
| Age       | tinyint(3) unsigned | NO   |     | NULL    |                |
| Gender    | enum('F','M')       | NO   |     | NULL    |                |
| ClassID   | tinyint(3) unsigned | YES  |     | NULL    |                |
| TeacherID | int(10) unsigned    | YES  |     | NULL    |                |
+-----------+---------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
查看建立此表的語句
MariaDB [hellodb]> show create table students\G
*************************** 1. row ***************************
       Table: students
Create Table: CREATE TABLE `students` (
  `StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Name` varchar(50) NOT NULL,
  `Age` tinyint(3) unsigned NOT NULL,
  `Gender` enum('F','M') NOT NULL,
  `ClassID` tinyint(3) unsigned DEFAULT NULL,
  `TeacherID` int(10) unsigned DEFAULT NULL,
  PRIMARY KEY (`StuID`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
查看StuID大於10小於15下students表的內容
MariaDB [hellodb]> select * from students where StuID>10 and StuID<15;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|    11 | Yuan Chengzhi |  23 | M      |       6 |      NULL |
|    12 | Wen Qingqing  |  19 | F      |       1 |      NULL |
|    13 | Tian Boguang  |  33 | M      |       2 |      NULL |
|    14 | Lu Wushuang   |  17 | F      |       3 |      NULL |
+-------+---------------+-----+--------+---------+-----------+
4 rows in set (0.00 sec)
在操做以前先對hellodb庫作一次徹底備份
[root@hostpc ~]# ls /mysql/
data  lost+found
把備份的文件都放到/mysql目錄下
[root@hostpc ~]# mysqldump -B --lock-all-tables --master-data=2 hellodb > /mysql/$(date +%F-%H-%M-%S)
[root@hostpc ~]# ls /mysql/
2015-04-24-14-52-30  data  lost+found   備份ok了
接下來就對hellodb庫進行操做了
1.建立一個表tree,結構爲type char(20),name char(30),high float
2.給定表一些數據
3.在students表的追加一條記錄。
MariaDB [hellodb]> create table tree (type char(20) not null,name char(30) not null,high float not null);
Query OK, 0 rows affected (0.19 sec)
MariaDB [hellodb]> insert into tree values ('zhenxing','songshu',7.82),('guoshu','lishu',3.68),('guoshu','pingguoshu','5.02');
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0
MariaDB [hellodb]> select * from students order by StuID desc limit 3;
+-------+-----------+-----+--------+---------+-----------+
| StuID | Name      | Age | Gender | ClassID | TeacherID |
+-------+-----------+-----+--------+---------+-----------+
|    28 | fangshiyu |  29 | F      |    NULL |      NULL |
|    27 | liuqing   |  40 | F      |    NULL |      NULL |
|    26 | yuanming  |  50 | F      |    NULL |      NULL |
+-------+-----------+-----+--------+---------+-----------+
3 rows in set (0.00 sec)

MariaDB [hellodb]> desc students;
+-----------+---------------------+------+-----+---------+----------------+
| Field     | Type                | Null | Key | Default | Extra          |
+-----------+---------------------+------+-----+---------+----------------+
| StuID     | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| Name      | varchar(50)         | NO   |     | NULL    |                |
| Age       | tinyint(3) unsigned | NO   |     | NULL    |                |
| Gender    | enum('F','M')       | NO   |     | NULL    |                |
| ClassID   | tinyint(3) unsigned | YES  |     | NULL    |                |
| TeacherID | int(10) unsigned    | YES  |     | NULL    |                |
+-----------+---------------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)

MariaDB [hellodb]> insert into students (StuID,Name,Age,Gender) values (29,'linger',25,'F');
Query OK, 1 row affected (0.04 sec)

MariaDB [hellodb]> select * from students order by StuID desc limit 3;
+-------+-----------+-----+--------+---------+-----------+
| StuID | Name      | Age | Gender | ClassID | TeacherID |
+-------+-----------+-----+--------+---------+-----------+
|    29 | linger    |  25 | F      |    NULL |      NULL |
|    28 | fangshiyu |  29 | F      |    NULL |      NULL |
|    27 | liuqing   |  40 | F      |    NULL |      NULL |
+-------+-----------+-----+--------+---------+-----------+
3 rows in set (0.00 sec)
對hellodb庫作一次增量備份
[root@hostpc ~]# ls /mysql/
2015-04-24-14-52-30  data  lost+found 
MariaDB [hellodb]> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     67307 |
| mysql-bin.000002 |    977605 |
| mysql-bin.000003 |       345 |
| mysql-bin.000004 |     41256 |
| mysql-bin.000005 |       994 |
+------------------+-----------+
5 rows in set (0.00 sec) 
從上一次徹底備份後開始到如今作增量備份
[root@hostpc ~]# mysqlbinlog --start-datetime='2015-04-24-14-52-30' /mysql/data/mysql-bin.000005 > /mysql/$(date +%F-%H-%M-%S)
[root@hostpc ~]# ls /mysql/
2015-04-24-14-52-30  2015-04-24-15-54-27  data  lost+found   備份ok
再次進行操做
1.刪除students表的StuID=27的那組數據
2.追加一組數據到tree表中
MariaDB [hellodb]> select * from students order by StuID desc limit 4;
+-------+-----------+-----+--------+---------+-----------+
| StuID | Name      | Age | Gender | ClassID | TeacherID |
+-------+-----------+-----+--------+---------+-----------+
|    29 | linger    |  25 | F      |    NULL |      NULL |
|    28 | fangshiyu |  29 | F      |    NULL |      NULL |
|    27 | liuqing   |  40 | F      |    NULL |      NULL |
|    26 | yuanming  |  50 | F      |    NULL |      NULL |
+-------+-----------+-----+--------+---------+-----------+
4 rows in set (0.00 sec)

MariaDB [hellodb]> delete from students where StuID=27;
Query OK, 1 row affected (0.03 sec)

MariaDB [hellodb]> select * from students order by StuID desc limit 4;
+-------+-------------+-----+--------+---------+-----------+
| StuID | Name        | Age | Gender | ClassID | TeacherID |
+-------+-------------+-----+--------+---------+-----------+
|    29 | linger      |  25 | F      |    NULL |      NULL |
|    28 | fangshiyu   |  29 | F      |    NULL |      NULL |
|    26 | yuanming    |  50 | F      |    NULL |      NULL |
|    25 | Sun Dasheng | 100 | M      |    NULL |      NULL |
+-------+-------------+-----+--------+---------+-----------+
4 rows in set (0.00 sec)

MariaDB [hellodb]> insert into tree value ('guoshu','xueli',3.6);
Query OK, 1 row affected (0.04 sec)

MariaDB [hellodb]> select * from tree;
+----------+------------+------+
| type     | name       | high |
+----------+------------+------+
| zhenxing | songshu    | 7.82 |
| guoshu   | lishu      | 3.68 |
| guoshu   | pingguoshu | 5.02 |
| guoshu   | xueli      |  3.6 |
+----------+------------+------+
4 rows in set (0.00 sec)
作一次增量備份
[root@hostpc ~]# mysqlbinlog --start-datetime='2015-04-24-15-54-27' /mysql/data/mysql-bin.000005 > /mysql/$(date +%F-%H-%M-%S)
在作一些操做
1.刪除tree表
2.追加一行數據到students表上
MariaDB [hellodb]> drop table tree;
Query OK, 0 rows affected (0.08 sec)

MariaDB [hellodb]> insert into students (StuID,Name,Age,Gender) values (30,'huier',23,'F');
Query OK, 1 row affected (0.03 sec)
作增量備份
[root@hostpc ~]# ls /mysql/
2015-04-24-14-52-30  2015-04-24-15-54-27  2015-04-24-16-01-52  data  lost+found
[root@hostpc ~]# mysqlbinlog --start-datetime='2015-04-24-16-01-52' /mysql/data/mysql-bin.000005 > /mysql/$(date +%F-%H-%M-%S)
[root@hostpc ~]# ls /mysql/
2015-04-24-14-52-30  2015-04-24-16-01-52  data
2015-04-24-15-54-27  2015-04-24-16-05-45  lost+found   ok增量備份完成了
若是說要恢復到2015-04-24-14-52-30這個時刻,須要在增量備份上一層一層去恢復,直到第一個徹底備份處才行,
查看一下當前庫有哪些表
MariaDB [hellodb]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| book              |
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| toc               |
+-------------------+
8 rows in set (0.00 sec)
MariaDB [hellodb]> \. /mysql/2015-04-24-16-01-52
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
。。。。
ERROR 1146 (42S02) at line 47 in file: '/mysql/2015-04-24-16-01-52': Table 'hellodb.tree' doesn't exist
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> create table tree (type char(20) not null,name char(30) not null,high float not null);
Query OK, 0 rows affected (0.19 sec)

MariaDB [hellodb]> \. /mysql/2015-04-24-16-01-52
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
。。。。。。
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> select * from tree;
+--------+-------+------+
| type   | name  | high |
+--------+-------+------+
| guoshu | xueli |  3.6 |
+--------+-------+------+
1 row in set (0.00 sec)

MariaDB [hellodb]> select * from students where StuID=27;
Empty set (0.00 sec)
MariaDB [hellodb]> \. /mysql/2015-04-24-15-54-27
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
。。。
ERROR 1062 (23000) at line 55 in file: '/mysql/2015-04-24-15-54-27': Duplicate entry '29' for key 'PRIMARY'
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> select * from tree;
+----------+------------+------+
| type     | name       | high |
+----------+------------+------+
| guoshu   | xueli      |  3.6 |
| zhenxing | songshu    | 7.82 |
| guoshu   | lishu      | 3.68 |
| guoshu   | pingguoshu | 5.02 |
+----------+------------+------+
4 rows in set (0.00 sec)

MariaDB [hellodb]> select * from students where StuID=27;
Empty set (0.00 sec)

MariaDB [hellodb]> \! ls /mysql
2015-04-24-14-52-30  2015-04-24-16-01-52  data
2015-04-24-15-54-27  2015-04-24-16-05-45  lost+found
MariaDB [hellodb]> \. /mysql/2015-04-24-14-52-30
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

MariaDB [hellodb]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| book              |
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| toc               |
| tree              |
+-------------------+
9 rows in set (0.00 sec)

MariaDB [hellodb]> select * from tree;
+----------+------------+------+
| type     | name       | high |
+----------+------------+------+
| guoshu   | xueli      |  3.6 |
| zhenxing | songshu    | 7.82 |
| guoshu   | lishu      | 3.68 |
| guoshu   | pingguoshu | 5.02 |
+----------+------------+------+
4 rows in set (0.00 sec)

MariaDB [hellodb]> select * from students where StuID=27;
+-------+---------+-----+--------+---------+-----------+
| StuID | Name    | Age | Gender | ClassID | TeacherID |
+-------+---------+-----+--------+---------+-----------+
|    27 | liuqing |  40 | F      |    NULL |      NULL |
+-------+---------+-----+--------+---------+-----------+
1 row in set (0.00 sec)

數據都恢復過來了
能夠根據本身的要求,要恢復到哪就找到對應的時間點,先讓徹底備份後的第一個增量備份恢復,再讓第二增量備份恢復,知道對應的時間點爲止,因爲上
面是按相反的方向,提示了一些錯誤。ok mysqldump和mysqlbinlgo使用就先到這裏,只是上面少了經過位置來進行恢復也便是--start-position,能夠本身
嘗試一下

    實現數據量比較大時,通常使用物理備份,經過rsync來遠程備份
    
    物理備份:(經過複製數據文件)數據文件的時間一致性
        冷備: 經過主從複製,備份時,從服務器下線,備份好之後再上線同步主服務器上的數據,此時從服務器主要功用就是作備份了
        幾乎熱備:lvm2快照,前提數據必須放在邏輯捲上,改變數據目錄後,經過初始化MySQL或修改配置文件指定datadir=指定的數據目錄。
    備份好全部庫之後,登陸到MySQL後(#mysql -u rot -p),刷新一下受權表,在家目錄下的.my.cnf,再次鏈接mysql便可(#mysql),
    備份單個表時,在InnoDB存儲引擎下要確保每一個表存儲一個表空間文件(啓用innodb_file_per_table),不然,備份時必須全庫備份,不能備份單獨庫。
    在對應庫目錄下,執行徹底備份只須要把目錄複製一份便可,可是對InnoDB表來說這樣複製可能存在問題,
    
            一、請求鎖定全部表:
                mysql> FLUSH TABLES WITH READ LOCK;(在生產環境中,此命令可能須要比較長的時間,由於施加鎖,須要等待)
    
            二、記錄二進制日誌文件及事件位置:
                >flush logs;或者
                mysql> SHOW MASTER STATUS;(結果最好保存一份)
                
            三、建立快照:另起會話
                lvcreate -L SIZE -s -p r -n NAME /dev/VG_NAME/LV_NAME(原數據目錄所在的lvm)  r(爲只讀操做)
    
            四、釋放鎖:
                mysql> UNLOCK TABLES
    
            五、掛載快照卷,複製數據進行備份;
                cp, rsync(rsync -a hellodb /backup/xxx`date xxx`), tar等命令複製數據;
                操做表(添加,刪除)
            六、備份完成以後,刪除快照卷;
                把以後的操做在二進制日誌備份出來
            七、恢復以後,把剛纔最後備份的二進制日誌導入便可
    
    當出現MySQL大故障時,當即將mysql離線
    
    通常狀況下都是備份部分庫,就是比較重要的庫和表  
數據庫

    物理備份
    [root@hostpc ~]# df -lhP
    Filesystem                                 Size  Used Avail Use% Mounted on
    /dev/mapper/vg_lvm-lv1                      20G  8.7G   10G  47% /
    tmpfs                                      922M     0  922M   0% /dev/shm
    /dev/sda1                                  190M   63M  117M  36% /boot
    /dev/mapper/vg_lvm-lv2                     9.8G  286M  9.0G   4% /var
    /dev/mapper/vg_lvm-data                    9.8G  198M  9.1G   3% /mysql
    /dev/mapper/vg_lvm-data1                   9.8G  134M  9.1G   2% /mydata
    /centox6.x/CentOS-6.6-x86_64-bin-DVD1.iso  4.4G  4.4G     0 100% /var/www/html/6
    MySQL數據目錄爲/mysql/data
    [root@hostpc ~]# ls /mysql/data/
    aria_log.00000001  ibdata1            mysql-bin.000001  mysql-bin.index
    aria_log_control   ib_logfile0        mysql-bin.000002  performance_schema
    hellodb            ib_logfile1        mysql-bin.000003  tempdb
    hostpc.err         multi-master.info  mysql-bin.000004  test
    hostpc.pid         mysql              mysql-bin.000005
    [root@hostpc ~]# ls /mysql/
    data  lost+found
    另外一個會話
    MariaDB [hellodb]> flush tables with read lock;   鎖住全部表
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [hellodb]> show master status;  查看二進制日誌文件及其位置
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000005 |    13471 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    
    [root@hostpc ~]# lvcreate -L 8G -s -p r -n snop /dev/vg_lvm/data   對數據目錄作一次快照
      Logical volume "snop" created
      
    MariaDB [hellodb]> unlock tables;   對全部表進行解鎖
    Query OK, 0 rows affected (0.00 sec)
    
    [root@server ~]# mkdir /snop
    [root@hostpc ~]# mount /dev/vg_lvm/snop /snop/   掛載快照卷
    mount: block device /dev/mapper/vg_lvm-snop is write-protected, mounting read-only
    [root@hostpc ~]# ls /snop/
    data  lost+found
    [root@hostpc ~]# ls /snop/data/   查看作快照的內容
    aria_log.00000001  ibdata1            mysql-bin.000001  mysql-bin.index
    aria_log_control   ib_logfile0        mysql-bin.000002  performance_schema
    hellodb            ib_logfile1        mysql-bin.000003  tempdb
    hostpc.err         multi-master.info  mysql-bin.000004  test
    hostpc.pid         mysql              mysql-bin.000005
    [root@hostpc ~]# service mysqld stop  中止mysql服務器
    Shutting down MySQL.. SUCCESS! bash

    模擬數據目錄所在磁盤損壞
    [root@hostpc ~]# rm -rf /mysql/data服務器

    建立新的數據目錄
    [root@hostpc ~]# mkdir /mysql/data -pv
    mkdir: created directory `/mysql/data'
    [root@hostpc ~]# cp -a /snop/data/* /mysql/data/   複製快照下的全部文件到新的數據目錄下
    [root@hostpc ~]# chown -R mysql.mysql /mysql/data   改變屬主和屬組
    [root@hostpc ~]# ls /mysql/data -l
    total 177268
    -rw-rw---- 1 mysql mysql    16384 Apr 21 10:43 aria_log.00000001
    -rw-rw---- 1 mysql mysql       52 Apr 21 10:43 aria_log_control
    drwx------ 2 mysql mysql     4096 Apr 24 17:35 hellodb
    -rw-r----- 1 mysql mysql     2821 Apr 21 10:44 hostpc.err
    -rw-rw---- 1 mysql mysql        6 Apr 21 10:44 hostpc.pid
    -rw-rw---- 1 mysql mysql 79691776 Apr 24 17:35 ibdata1
    -rw-rw---- 1 mysql mysql 50331648 Apr 24 17:35 ib_logfile0
    -rw-rw---- 1 mysql mysql 50331648 Apr 21 10:33 ib_logfile1
    -rw-rw---- 1 mysql mysql        0 Apr 21 10:35 multi-master.info
    drwx------ 2 mysql mysql     4096 Apr 21 10:33 mysql
    -rw-rw---- 1 mysql mysql    67307 Apr 21 10:33 mysql-bin.000001
    -rw-rw---- 1 mysql mysql   977605 Apr 21 10:33 mysql-bin.000002
    -rw-rw---- 1 mysql mysql      345 Apr 21 10:43 mysql-bin.000003
    -rw-rw---- 1 mysql mysql    41256 Apr 24 14:39 mysql-bin.000004
    -rw-rw---- 1 mysql mysql    13471 Apr 24 17:35 mysql-bin.000005
    -rw-rw---- 1 mysql mysql       95 Apr 24 14:39 mysql-bin.index
    drwx------ 2 mysql mysql     4096 Apr 21 10:33 performance_schema
    drwx------ 2 mysql mysql     4096 Apr 22 13:54 tempdb
    drwx------ 2 mysql mysql     4096 Apr 21 10:33 test  修改爲功
    [root@hostpc ~]# service mysqld start  啓動mysql
    Starting MySQL.. SUCCESS!
    [root@hostpc ~]# mysql  登陸MySQL
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 4
    Server version: 10.0.13-MariaDB-log Source distribution
    
    Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MariaDB [(none)]> show databases;   查看數據庫都完整
    +--------------------+
    | Database           |
    +--------------------+
    | hellodb            |
    | information_schema |
    | mysql              |
    | performance_schema |
    | tempdb             |
    | test               |
    +--------------------+
    6 rows in set (0.00 sec)
    
    MariaDB [(none)]> \u hellodb
    Database changed
    MariaDB [hellodb]> show tables;  hellodb下的表也都有
    +-------------------+
    | Tables_in_hellodb |
    +-------------------+
    | book              |
    | classes           |
    | coc               |
    | courses           |
    | scores            |
    | students          |
    | teachers          |
    | toc               |
    | tree              |
    +-------------------+
    9 rows in set (0.00 sec)
    MariaDB [hellodb]> \! df -lhP   查看掛載的信息
    Filesystem                                 Size  Used Avail Use% Mounted on
    /dev/mapper/vg_lvm-lv1                      20G  8.7G   10G  47% /
    tmpfs                                      922M     0  922M   0% /dev/shm
    /dev/sda1                                  190M   63M  117M  36% /boot
    /dev/mapper/vg_lvm-lv2                     9.8G  286M  9.0G   4% /var
    /dev/mapper/vg_lvm-data                    9.8G  198M  9.1G   3% /mysql
    /dev/mapper/vg_lvm-data1                   9.8G  134M  9.1G   2% /mydata
    /centox6.x/CentOS-6.6-x86_64-bin-DVD1.iso  4.4G  4.4G     0 100% /var/www/html/6
    /dev/mapper/vg_lvm-snop                    9.8G  198M  9.1G   3% /snop
    MariaDB [hellodb]> show master status;  顯示當前的日誌文件和所處的位置,發現日誌文件已經發生滾動了
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000006 |      326 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)session

  

    主要須要注意app

        通常發生重大的恢復操做時,首先最重要的是先作一下徹底備份。

相關文章
相關標籤/搜索