無標題文章

普通文件方式

簡單數據的導入和導出

編輯配置文件my.cnf添加如下配置項

[mysqld]

secure_file_priv = 保存到本地目錄

例如

secure_file_priv = /tmp

配置完成后需要重啟服務

本地目錄需要給mysql用戶授予讀寫權限

登錄到服務器,可以驗證配置項是否生效

SELECT@@GLOBAL.secure_file_priv;或者SHOWVARIABLESLIKE"secure_file_priv";

假如沒有使用此配置項,查詢到的值為NULL。

mysql> SELECT @@GLOBAL.secure_file_priv;+---------------------------+| @@GLOBAL.secure_file_priv |+---------------------------+| NULL? ? ? ? ? ? ? ? ? ? ? |+---------------------------+1rowinset (0.00sec)

執(zhí)行下面的導入導出語句時就會報如下錯誤

ERROR1290(HY000): The MySQL server is runningwiththe --secure-file-priv option so it cannot executethisstatement

導出

select *fromschool.classinto outfile"/tmp/class2.db";

導入

導入到數據文件中的列必須和表中的一一對應。包含id列的值。

實例文件

5,云計算1809

6,云計算1901

7,云計算1902

導入語句

載入外部“形式整齊”的數據(csv 格式的文件,沒有域之家用逗號隔開): load data infile'文件完整名(含路徑)'into table 表名fields terminated by'域分隔符'optionally? ? enclosed? by'"'ignore 1 lines;

optionally? ? enclosed? by '"' 用于識別域值的界定符

ignore 1 lines;? 忽略第一行

MySQL 邏輯備份 mysqldump

邏輯備份特點

備份的是建表、建庫、插入等操作所執(zhí)行SQL語句(DDL DML DCL),適用于中小型數據庫。

效率相對較低

在日常工作中,我們會使用 mysqldump 命令創(chuàng)建SQL格式的轉儲文件來備份數據庫?;蛘呶覀儼褦祿С龊笞鰯祿w移,主從復制等操作。mysqldump是一個邏輯備份工具,復制原始的數據庫對象定義和表數據產生一組可執(zhí)行的SQL語句。 默認情況下,生成insert語句,也能生成其它分隔符的輸出或XML格式的文件。

特點

自動記錄position位置。

show master? status\G;

可用性,一致性

鎖表機制

用法

mysqldump-h服務器-u用戶名-p密碼? 數據庫名? > 備份文件.sql/*查看幫助*/mysqldump--help

日常用法

備份所有庫

// 先配置用戶名和密碼shell> vi ~/.mysql_user[mysqldump]user=rootpassword=123shell> mysqldump --defaults-file=~/.mysql_user -h172.16.153.10 --all-databases > `date +%FT%H_%M_%S`dump_all.sql# 不包含 INFORMATION_SCHEMA,performance_schema,sys

備份指定的多個庫

// 為了考慮篇幅,請自行添加指定用戶名密碼參數和指定服務器的參數

// --defaults-file=~/.mysql_user -hip

shell> mysqldump --databases db1 db2 db3 > `date +%FT%H_%M_%S`dump_all.sql

備份指定庫的指定幾個表

shell>mysqldumpdb1t1t3t7>dump.sql

其他參數

--master-data=0|1|2

服務器的二進制日志必須打開

0? ? 不記錄二進制日志文件及位置:

1? ? 以CHANGE MASTER TO 的方式記錄位置,可用于恢復后直接啟動從服務器:

2? 以CHANGE MASTER TO 的方式記錄位置,但默認被注釋:

--dump-slave 用于在slave上dump數據,建立新的slave。因為我們在使用mysqldump時會鎖表,所以大多數情況下,我們的導出操作一般會在只讀備庫上做,為了獲取主庫的Relay_Master_Log_File(二進制日志)和Exec_Master_Log_Pos(主服務器二進制日志中數據所處的位置),需要用到這個參數,不過這個參數只有在5.7以后的才會有

--no-data, -d 不導出任何數據,只導出數據庫表結構

--lock-all-tables:鎖定所有表 對MyISAM引擎的表開始備份前,先鎖定所有表。

優(yōu)勢

mysqldump的優(yōu)勢:

可以查看或者編輯十分方便,它也可以靈活性的恢復之前的數據。

不關心底層的存儲引擎,既適用于支持事務的,也適用于不支持事務的表。

不過它不能作為一個快速備份大量的數據或可伸縮的解決方案。如果數據庫過大,即使備份步驟需要的時間不算太久,但有可能恢復數據的速度也會非常慢,因為它涉及的SQL語句插入磁盤I/O,創(chuàng)建索引等等。 對于大規(guī)模的備份和恢復,更合適的做法是物理備份,復制其原始格式的數據文件,可以快速恢復。

恢復

shell>mysql

或者,在mysql中,使用source命令:

mysql>sourcedump.sql

如果文件是不包含CREATE DATABASEUSE語句的單數據庫轉儲 ,請首先創(chuàng)建數據庫(如有必要):

shell> mysqladmin create db1

然后在加載轉儲文件時指定數據庫名稱:

shell>mysqldb1

或者,在mysql中創(chuàng)建數據庫,將其選為默認數據庫,然后加載轉儲文件:

mysql> CREATE DATABASEIFNOT EXISTS db1;mysql>USEdb1;mysql>source dump.sql

Example

shell> mysql --defaults-file=~/.mysql_user < /backup/2016-12-08-04-mysql-all.sql

MySQL 物理備份: Innobackupex 和 xtrabackup(熱備)

Percona XtraBackup是一款基于MySQL的熱備份的開源實用程序,它可以備份5.1到5.7版本上InnoDB,XtraDB,MyISAM存儲引擎的表, Xtrabackup有兩個主要的工具:xtrabackup、innobackupex 。

第一種安裝方式: 使用YUM方式安裝

地址

https://www.percona.com/downloads/Percona-XtraBackup-LATEST/

確保安裝 EPEL 源

yum installhttps://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

安裝libev

為了成功安裝Percona XtraBackup libev包需要先安裝。

yum? install -y libev

安裝Percona存儲庫

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

測試存儲庫的可用性

shell> yumlist| grep percona

應該輸出如下信息

...percona-xtrabackup-20.x86_642.0.8-587.rhel5percona-release-x86_64percona-xtrabackup-20-debuginfo.x86_642.0.8-587.rhel5percona-release-x86_64percona-xtrabackup-20-test.x86_642.0.8-587.rhel5percona-release-x86_64percona-xtrabackup-21.x86_642.1.9-746.rhel5percona-release-x86_64percona-xtrabackup-21-debuginfo.x86_642.1.9-746.rhel5percona-release-x86_64percona-xtrabackup-22.x86_642.2.13-1.el5percona-release-x86_64percona-xtrabackup-22-debuginfo.x86_642.2.13-1.el5percona-release-x86_64percona-xtrabackup-debuginfo.x86_642.3.5-1.el5percona-release-x86_64percona-xtrabackup-test.x86_642.3.5-1.el5percona-release-x86_64percona-xtrabackup-test-21.x86_642.1.9-746.rhel5percona-release-x86_64percona-xtrabackup-test-22.x86_642.2.13-1.el5percona-release-x86_64...

安裝軟件

shell> yum install percona-xtrabackup-24

驗證安裝

image.png

第二種安裝方式:下載對應版本的軟件包,在本地安裝

點擊下載頁面,選擇對應版本后進行下載

image.png

示例:

下載2.4.4版本

wgethttps://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm

安裝

yumlocalinstallpercona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm

注意:像這樣手動安裝軟件包時,您需要確保解決所有依賴項并自行安裝缺少的軟件包。

卸載

yum remove percona-xtrabackup

80 版本

注意:

這個版本只支持 MySQL8.0的數據進行備份,不支持 MySQL8.0版本之前的數據進行備份。

# 安裝倉庫文件yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm# 啟用倉庫percona-releaseenable-only tools release#安裝軟件yum install percona-xtrabackup-80

報錯解決

來自file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona 的無效 GPG 密鑰:No key foundingiven key data

或者

源"CentOS 7 - Percona"的 GPG 密鑰已安裝,但是不適用于此軟件包。請檢查源的公鑰 URL 是否配置正確。 失敗的軟件包是:Percona-Server-shared-56-5.6.43-rel84.3.el7.x86_64 GPG? 密鑰配置為:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona

修改倉庫文件percona-release.repo不使用密鑰認證

image.png

再次安裝會看到如下報錯信息

Transaction check error:? file /etc/my.cnffrominstallofPercona-Server-shared-56-5.6.43-rel84.3.el7.x86_64 conflictswithfilefrompackage mysql-community-server-5.7.25-1.el7.x86_64錯誤概要-------------

需要安裝如下軟件

yum install -y? mysql-community-libs-compat

注意:

這個軟件的源是mysql57-community

[mysql57-community]name=MySQL5.7Community Serverbaseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/enabled=1gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql文件內容如下:

點我傳送門

再執(zhí)行安裝命令

yum install percona-xtrabackup-24

日常操作

條件:

在 MySQL 服務器本地安裝 Xtrbackup 并執(zhí)行相關操作。

給執(zhí)行備份到用戶進行相應的授權。

配置選項

配置選項可以在sh命令行中直接使用,也可以在my.cnf文件中配置

# my.cnf 文件的配置[xtrabackup]target_dir = /backups/mysql/# 備份數據放置的位置

假如是編譯安裝的 mysql ,需要在配置文件my.cnf中指定 socket 文件的路徑。

[xtrabackup]socket =/tmp/mysql.sock

1. 全備

下面的命令均假設沒有在my.cnf中配置任何關于 xtrabackup 的選項

要執(zhí)行備份需要指定 備份數據放置的位置,就是目錄,假如目錄不存在,則會自動創(chuàng)建;==注意這個目錄不會被遞歸創(chuàng)建,僅僅會創(chuàng)建最后一級目錄;==假如存在,就會直接開始備份,并且不會覆蓋原來的數據。

開始備份

shell> xtrabackup --backup --user=root --password='123'--target-dir=/backups/full# 備份完成后,可以看到備份時的LSN號,當下次進行增量備份時,xtrabackup就只備份大于此號的page即可。

查看備份文件

[root@mysql-master ~]# ls -lh /backups/full總用量 13M-rw-r----- 1 root root? 487 8月? 18 09:44 backup-my.cnf-rw-r----- 1 root root? 293 8月? 18 09:44 ib_buffer_pool-rw-r----- 1 root root? 12M 8月? 18 09:44 ibdata1drwxr-x--- 2 root root 4.0K 8月? 18 09:44 mysqldrwxr-x--- 2 root root? 88 8月? 18 09:44 one_dbdrwxr-x--- 2 root root 8.0K 8月? 18 09:44 performance_schemadrwxr-x--- 2 root root? 58 8月? 18 09:44 shark_dbdrwxr-x--- 2 root root 8.0K 8月? 18 09:44 sys-rw-r----- 1 root root? 115 8月? 18 09:44 xtrabackup_checkpoints-rw-r----- 1 root root? 446 8月? 18 09:44 xtrabackup_info-rw-r----- 1 root root 2.5K 8月? 18 09:44 xtrabackup_logfile

進入目錄后,可以看到一些目錄,這些目錄與我們數據庫的名稱相同,沒錯,這些就是各個數據庫的數據文件備份目錄。

還有一個innodb的共享表空間文件,ibdata1,注意,如果想要使用xtrabackup備份眾多數據庫中的某一個,那么必須保證在創(chuàng)建這個數據庫時,已經開啟了innodb_file_per_table參數,否則將無法單獨備份數據庫服務器中的某一個數據庫。

除了剛才描述的這些數據文件,xtrabackup還為我們生成了一些文件,我們來看看這些文件都有什么用(不同版本的xtrabackup生成的文件可能不同)。

backup-my.cnf

此文件中包含了my.cnf中的一些設置信息,但是,并不是my.cnf中的所有信息都會包含在此文件中,此文件中只包含了備份時需要的信息。

xtrabackup_binlog_info

需要開啟二進制日志

此文件中記錄了備份開始時二進制日志文件的"位置(position)"

xtrabackup_checkpoints

此文件中記錄此次備份屬于那種類型的備份,是全量還是增量,備份時起始的LSN號碼,結束的LSN號碼等信息。

xtrabackup_info

本次備份的概要信息,此文件中的信息還是比較全面的。

xtrabackup_logfile

記錄了備份過程中的日志,在對數據進行prepare時需要通過日志將數據還原成一致的可用的數據。

準備恢復的數據

使用 xtrabackup --backup 選項進行備份后,并不能直接使用,首先需要準備它以便還原它。

如果您嘗試使用這些數據文件啟動InnoDB,它將檢測損壞并自行崩潰,以防止您在損壞的數據上運行。

因為備份出的數據是不一致的,我們需要將同時備份出的事務日志應用到備份中,才能得到一份完整、一致、可用的數據,xtrabackup稱這一步操作為prepare,直譯過來就是"準備"。

xtrabackup --prepare 步驟使文件在一個時刻完全一致

shell> xtrabackup --prepare --target-dir=/backups/full

如果你要備份的數據量巨大,那么備份時長會變長,期間備份的事務日志容量有可能會很大。那么,我們可以使用--use-memory選項,加速準備工作的完成,在不指定內存大小的情況下,準備工作默認會占用100MB的內存,如果服務器有一定的空閑內存,那么我們可以讓xtrabackup使用指定大小的內存完成準備工作,以提升準備工作完成的速度,示例語句如下。

shell> xtrabackup --prepare --use-memory=512M --target-dir=/backups/full

==準備備份時不建議中斷xtrabackup進程,因為這可能會導致數據文件損壞,備份將無法使用。如果準備過程中斷,則無法保證備份有效性。==

準備備份數據完成后,應該會看到如下信息。

InnoDB: Starting shutdown...InnoDB: Shutdown completed;logsequence number 13596200180818 10:09:19 completed OK!

恢復

xtrabackup 在執(zhí)行copyback時會讀取數據庫的my.cnf中的配置,但是如果my.cnf中沒有配置datadir,那么--datadir選項必須存在,而且,datadir目錄必須為空目錄,其中不能存在數據,否則在執(zhí)行上述命令時會報錯,--copy-back選項對應的目錄就是我們準備好的可用數據的目錄。

為了能夠正常的恢復數據,我們先確定數據庫服務已經停止了,而且對應的數據目錄中不存在數據,然后進行數據還原工作,刪除數據目錄中的文件與日志。

停止數據庫的服務

清理環(huán)境

修改權限

啟動數據庫

shell> systemctl stop mysqld.serviceshell> rm -rf /var/lib/mysql/*shell> xtrabackup --copy-back --datadir=/var/lib/mysql --target-dir=/backups/full# 下面為完成后的輸出結果180818 10:59:25 [01]? ? ? ? ...done180818 10:59:25 completed OK!shell> chown? mysql.mysql -R /var/lib/mysql

或者使用rsync命令

shell> rsync -avrP /backup/ /var/lib/mysql/

shell> chown? mysql.mysql -R /var/lib/mysql

啟動數據庫

shell> systemctl start mysqld.service

innobackuper 命令實現

shell> innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.146 --user=root --password=123123 /backup

shell> nnobackupex --apply-log --use-memory=4G /backups/2018-08-17_15-53-11

shell> systemctl stop mysqld.service

shell> rm -rf /var/lib/mysql/*

shell> innobackupex --datadir=/var/lib/mysql --copy-back 2018-08-17_15-53-11

shell> chown? mysql.mysql -R /var/lib/mysql

shell> systemctl start mysqld.service

全量備份思路總結

執(zhí)行備份命令

指定 數據庫的用戶名和密碼

指定 備份目錄,注意只可以自動創(chuàng)建最后一級的目錄

準備備份的數據

就是指: --prepare 參數, 保證數據的統(tǒng)一且完整性

停服務,并且把 mysql 的數據目錄下的所有文件和文件夾清除。

/var/lib/mysql/此目錄必須是空的

恢復數據

本質上就是拷貝備份的文件到指定的 mysql 數據目錄下

修改 mysql 數據目錄的屬主和屬組為 MySQL 服務器進程啟動的用戶,默認是 mysql

啟動服務

2. 增量備份

image.png

特點:每次備份,都對自上一次備份(注意是上一次,不是第一次)到此時備份之間有變化的文件,進行備份。所 以備份體積小,備份速度快,但是恢復的時候,需要按備份時間順序,逐個備份版本進行恢復,恢復時持續(xù)的時間長。

無論xtrabackupinnobackupex工具支持增量備份,這意味著它們可以只復制自上次備份以來發(fā)生變化的數據。

您可以在每個完整備份之間執(zhí)行許多增量備份,因此您可以設置備份過程,例如每周一次完整備份和每天增量備份,或每天完整備份和每小時增量備份。

增量備份有效,因為每個InnoDB頁面都包含一個日志序列號或LSN。該LSN是整個數據庫系統(tǒng)的版本號。每個頁面的LSN顯示它最近的更改。

當我們做過全量備份以后會在目錄下產生xtrabackup_checkpoints的文件 這里面記錄了lsn和備份方式,我們可以基于這次的全量做增量的備份。

shell> cat /backups/xtrabackup_checkpoints

backup_type = full-prepared

from_lsn = 0

to_lsn = 13593159

last_lsn = 13593168

compact = 0

recover_binlog_info = 0

增量備份實際上并不將數據文件與先前備份的數據文件進行比較。事實上,如果你知道它的LSN,你可以使用xtrabackup --incremental-lsn來執(zhí)行增量備份,而不需要先前的備份。增量備份只是讀取頁面并將其LSN與最后一個備份的LSN進行比較。但是,您仍需要完整備份來恢復增量更改;如果沒有完整備份作為基礎,增量備份將毫無用處。

創(chuàng)建增量備份

要進行增量備份,請像往常一樣以完整備份開始, 使用下面的命令創(chuàng)建基礎的全量備份。

shell> xtrabackup --backup --user=root --password=123 --target-dir=/backups/base

現在您已擁有完整備份,以后可以根據它進行增量備份。

向數據庫中添加數據,以便于測試

mysql> select count(id) from shark_db.student;+-----------+| count(id) |+-----------+|? ? 99213 |+-----------+1rowinset (0.04sec)mysql> insert into shark_db.student (name,age,phone) values('xiguatian',20,13149876789);Query OK,1row affected (0.00sec)mysql> select count(id) from shark_db.student;+-----------+| count(id) |+-----------+|? ? 99214 |+-----------+1rowinset (0.03sec)

使用以下命令進行增量備份:

shell> xtrabackup --backup --user=root --password=123 --target-dir=/backups/inc1 --incremental-basedir=/backups/base

該/data/backups/inc1/目錄現在應包含增量文件

ls -lh /backups/inc1/

總用量 116K

-rw-r----- 1 root root? 487 8月? 18 11:40 backup-my.cnf

-rw-r----- 1 root root? 293 8月? 18 11:40 ib_buffer_pool

-rw-r----- 1 root root? 64K 8月? 18 11:40 ibdata1.delta

-rw-r----- 1 root root? 44 8月? 18 11:40 ibdata1.meta

drwxr-x--- 2 root root 4.0K 8月? 18 11:40 mysql

drwxr-x--- 2 root root? 144 8月? 18 11:40 one_db

drwxr-x--- 2 root root 8.0K 8月? 18 11:40 performance_schema

drwxr-x--- 2 root root? 88 8月? 18 11:40 shark_db

drwxr-x--- 2 root root 8.0K 8月? 18 11:40 sys

-rw-r----- 1 root root? 120 8月? 18 11:40 xtrabackup_checkpoints

-rw-r----- 1 root root? 498 8月? 18 11:40 xtrabackup_info

-rw-r----- 1 root root 2.5K 8月? 18 11:40 xtrabackup_logfile

這個時候去查看增量備份的xtrabackup_checkpoints,會發(fā)現同樣也記錄了LSN 等信息

shell> cat /backups/inc1/xtrabackup_checkpoints

backup_type = incremental

from_lsn = 13596423

to_lsn = 13596628

last_lsn = 13596637

compact = 0

recover_binlog_info = 0

// 這也意味著你可以在增量的備份上繼續(xù)增量的備份。

from_lsn是備份的起始LSN,對于增量,它必須與前一個/基本備份的to_lsn(如果它是最后一個檢查點)相同。

上面的情況是,to_lsn(上一個檢查點LSN)和last_lsn(上次復制的LSN)之間存在差異,這意味著在備份過程中服務器上存在一些流量

模擬增加數據

mysql> insert into shark_db.student (name,age,phone) values('xiguatian3',21,13149876789);Query OK,1row affected (0.01sec)mysql> select count(id) from shark_db.student;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? +-----------+| count(id) |+-----------+|? ? 99215 |+-----------+1rowinset (0.03sec)

現在可以使用此目錄作為另一個增量備份的基礎:

shell> xtrabackup --backup --user=root --password=123 --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1

準備增量備份的數據

增量備份的步驟與完全備份的步驟不同。在完全備份中,執(zhí)行兩種類型的操作以使數據庫保持一致:從日志文件中針對數據文件重播已提交的事務,并回滾未提交的事務。在準備增量備份時,必須跳過未提交事務的回滾,因為備份時未提交的事務可能正在進行中,并且很可能它們將在下一次增量備份中提交。您應該使用該 選項來阻止回滾階段.

xtrabackup --apply-log-only

警告

如果不使用該 選項來阻止回滾階段,那么增量備份將毫無用處?;貪L事務后,無法應用進一步的增量備份。

要準備數據,需要從一開始就準備,現在回想一下我們都有那些備份

/backups/base

/backups/inc1

/backups/inc2

image.png

準備基礎備份的數據

shell> xtrabackup --prepare --apply-log-only \--target-dir=/backups/base...省略...xtrabackup: starting shutdown with innodb_fast_shutdown = 1InnoDB: Starting shutdown...InnoDB: Shutdown completed;logsequence number 13596441InnoDB: Number of pools: 1180818 11:56:55 completed OK!

注意:

即使已跳過回滾階段,此備份實際上也可以按原樣恢復。如果你恢復它并啟動MySQL,InnoDB將檢測到沒有執(zhí)行回滾階段,它將在后臺執(zhí)行,因為它通常用于啟動時的崩潰恢復。它會通知您數據庫未正常關閉。

把第一次增量備份的數據合并到基礎備份的數據中

shell> xtrabackup? --prepare? --apply-log-only? --user=root --password=123? --target-dir=/backups/base? --incremental-dir=/backups/inc1

再把第二次增量備份的數據也合并到基礎備份的數據中

shell> xtrabackup --prepare --user=root --password=123? --target-dir=/backups/base? --incremental-dir=/backups/inc2

==注意: 最后一次操作不需要加--apply-log-only參數==

停止 MySQL 服務,并刪除數據目錄和日志

shell> systemctl stop mysqld

shell> rm -rf /var/lib/mysql/*

開始恢復合并后的全部數據的數據庫

shell> xtrabackup --copy-back? --datadir=/var/lib/mysql? --target-dir=/backups/base/

更改數據庫目錄的權限并啟動數據庫

shell> chown mysql.mysql -R /var/lib/mysql

shell> systemctl start mysqld

關于加密備份、壓縮備份、部分備份

作者:xiguatian

鏈接:http://www.itdecent.cn/p/169f96c709b1

來源:簡書

簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容