1. 程式人生 > >資料庫篇——完全、增量備份和恢復

資料庫篇——完全、增量備份和恢復

一、準備資料庫環境

1、搭建安裝環境

yum -y install \
gcc \
gcc-c++ \
make \
ncurses \
ncurses-devel \
bison \
Cmake

2、新增資料庫使用者
useradd -s /sbin/nologin mysql //新增資料庫使用者
3、安裝mysql資料庫

tar xf mysql-boost-5.7.20.tar.gz –C /opt/       //解壓原始碼包

cmake \     //檢查安裝配置環境
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1

make && make install        //編譯安裝

chown -R mysql.mysql /usr/local/mysql/  //將資料庫安裝目錄的使用許可權給使用者mysql

vi /etc/my.cnf  //將主配置檔案清空新增以下內容
[client]
port = 3306 
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

chown mysql:mysql /etc/my.cnf       //更改主配置檔案的許可權

echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile      //新增系統環境變數
source /etc/profile //重新整理立即生效

cd /usr/local/mysql/        //進入安裝目錄初始化資料庫
bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data

cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/       //製作資料庫系統啟動命令
systemctl daemon-reload           //重新整理識別啟動指令碼
systemctl start mysqld      //啟動資料庫
netstat -anpt | grep 3306       //檢視埠是否在監聽狀態

二、直接備份

停止資料庫,直接打包資料庫資料目錄/usr/local/mysql/data
tar cJvf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data/

三、完全備份

完全備份:每次對資料進行完整的備份。可以備份整個資料庫,包含使用者表、系統表、索引、檢視和儲存過程等所有資料庫物件。
優點:備份與恢復操作簡單方便
缺點:資料庫存在大量的重複,佔用大量的備份空間,備份時間長。
1、使用mysqldump命令備份

# mysqldump -u root -p --all-databases > all-data-$(date +%F).sql //備份所有資料庫
# mysqldump -u root -p --databases auth mysql > auth-mysql.sql //備份多個數據庫
# mysqldump -u root -p auth > auth-$(date +%F).sql //備份單個auth資料庫
# mysqldump -u root -p mysql user > mysql-user-$(date +%F).sql //備份mysql的庫中的user表

#mysqldump -u root -p -d mysql user > /tmp/desc-mysql-user.sql //備份mysql庫user表的結構。
2、還原備份的資料庫

source /tmp/auth.sql        //要先進入某個具體的資料庫再進行恢復,除非是恢復所有資料庫。
mysql -u root -p  < all-data-$(date +%F).sql    //恢復所有的資料庫
mysql -u root -p mysql < mysql-user-$(date +%F).sql     //恢復mysql的user表,需要指定庫名
mysql -uroot -p auth < /tmp/desc-mysql-user.sql     //將資料結構恢復到auth庫中,單庫備份的時候要指定還原到哪個資料庫中,需要建立空庫,庫名可以任意

3、案列演示

create database client; //建立client庫
use client; //進庫
create table user_info(××× int(18),姓名 varchar(20),性別 varchar(20),使用者ID號 int(20),資費 int(48));     //建立user_info表
desc user_info; //查看錶結構

資料庫篇——完全、增量備份和恢復
插入一些資料

insert into user_info values('000000001','孫空武','男','011','100');
insert into user_info values('000000002','藍凌','女','012','98');
insert into user_info values('000000003','姜紋','女','013','12');
insert into user_info values('000000004','關園','男','014','38');
insert into user_info values('000000005','羅中昆','男','015','39');

檢視資料
select * from user_info;
資料庫篇——完全、增量備份和恢復
a、備份整個client資料庫
mysqldump -uroot -p client &gt; client-$(date +%F).sql
資料庫篇——完全、增量備份和恢復
刪除原有的client庫重新建一個new_client空庫

drop database client;
create database new_client;

還原client庫
mysql -u root -p new_client&lt; client-2018-12-10.sql
進入資料庫檢視驗證
資料庫篇——完全、增量備份和恢復
b、備份client庫的中的表
mysqldump -uroot -p client user_info &gt; client_user_info-$(date +%F).sql
資料庫篇——完全、增量備份和恢復
刪除client庫中的user_info表

drop tables client.user_info;
show tables in client;

資料庫篇——完全、增量備份和恢復
還原client庫中的user_info表
mysql -uroot -p client &lt; client_user_info-2018-12-10.sql
進入資料庫檢視驗證
資料庫篇——完全、增量備份和恢復
c、備份client庫中的表結構(無資料)
mysqldump -uroot -p -d client user_info &gt; desc-client_user_info.sql
資料庫篇——完全、增量備份和恢復
新建new_client空資料庫
create database new_client;
還原client庫中user_info表中的結構
mysql -uroot -p new_client &lt; desc-client_user_info.sql
進入資料庫檢視驗證

desc new_client.user_info;
select * from new_client.user_info;

資料庫篇——完全、增量備份和恢復

四、增量備份

增量備份:只有那些在上次完全備份或增量備份後被修改的檔案才會被備份。
優點:沒有重複資料,備份量不大,時間短。
缺點:需要上次完全備份及完全備份之後所有的增量備份才能恢復,而且對所有增量備份進行逐個反推恢復,操作較為繁瑣。
為什麼使用增量備份?
解決完全備份存在的問題,完全備份每次都把所有的資料備份,存在大量重複資料,備份與恢復的時間長。
增量備份的特點
(1)二進位制日誌儲存了所有更新或者可能更新資料庫的操作
(2)二進位制日誌在啟動mysql伺服器後開始記錄,並在檔案達到max_binlog_size所設定的大小或者接收到flush logs命令後重新建立新的日誌檔案。
(3)只需要定時執行flush logs方法重新建立新的日誌,生成二進位制檔案序列,並及時把這些日誌儲存到安全的地方就完成了一個時間段的增量備份。
1、開始二進位制日誌功能

vi /etc/my.cfg
在[mysqld]下新增
log_bin=/usr/local/mysql/data/mysql_bin

資料庫篇——完全、增量備份和恢復
systemctl restart mysqld //重啟資料庫
2、檢視生成的二進位制檔案
cd /usr/local/mysql/data/
資料庫篇——完全、增量備份和恢復
3、案列演示
下面的資料庫中的操作會被記錄在mysql_bin.000001二進位制日誌中

create database client;
use client;
create table info(××× int(18),姓名 varchar(20),性別 varchar(20),使用者ID號 int(20),資費 int(48));
insert into info values('000000001','孫空武','男','011','100');
insert into info values('000000002','藍凌','女','012','98');
insert into info values('000000003','姜紋','女','013','12');
select * from info;

資料庫篇——完全、增量備份和恢復
先做一次全量備份
mysqldump -u root -p client info &gt; client_info-$(date +%F).sql
資料庫篇——完全、增量備份和恢復
重新整理日誌檔案
mysqladmin -uroot -p flush-logs
資料庫篇——完全、增量備份和恢復
插入檔案(該操作記錄在mysql_bin.000002二進位制日誌中)

insert into info values('000000004','關園','男','014','38');
insert into info values('000000005','羅中昆','男','015','39');

資料庫篇——完全、增量備份和恢復
重新整理日誌檔案
mysqladmin -uroot -p flush-logs
資料庫篇——完全、增量備份和恢復
模擬刪除資料(該操作會被記錄在mysql_bin.000003二進位制日誌中)

delete from info where ×××=4;
delete from info where ×××=5;

資料庫篇——完全、增量備份和恢復
通過二進位制日誌恢復刪除的檔案

mysqlbinlog --no-defaults mysql_bin.000002 | mysql -u root -p       //實為恢復儲存在mysql_bin.000002中的插入操作
進入資料庫驗證是否恢復成功
select * from client.info;

資料庫篇——完全、增量備份和恢復
將恢復成功的表再做一次全量備份
mysqldump -u root -p client info &gt; client_info-$(date +%F).sql
重新整理日誌
mysqladmin -uroot -p flush-logs
資料庫篇——完全、增量備份和恢復
模擬資料庫操作(其中既有正確的操作又有錯誤的操作,並且記錄在mysql_bin.000004中)
正確操作:

insert into info values('000000006','藍凌林','女','012','98');
insert into info values('000000007','姜紋文','女','013','12');

錯誤操作:
delete from info where ×××=1;
正確操作:

insert into info values('000000008','凌林','女','012','98');
insert into info values('000000009','紋文','女','013','12');

資料庫篇——完全、增量備份和恢復

斷點恢復(為了避開錯誤的操作)

進行最近一次全量備份還原
mysql -u root -p client &lt; clientinfo-2018-12-05.sql
檢視二進位制日誌內部詳細資訊:
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql_bin.000004
獲取第一個正確操作的位置變數
資料庫篇——完全、增量備份和恢復
資料庫篇——完全、增量備份和恢復
獲取第二個正確操作的位置變數
資料庫篇——完全、增量備份和恢復
資料庫篇——完全、增量備份和恢復
開始恢復

mysqlbinlog --no-defaults --start-position='293'  --stop-position='732' mysql_bin.000004 | mysql -uroot -p  //斷點恢復第一處
mysqlbinlog --no-defaults --start-position='1160'  --stop-position='1593' mysql_bin.000004 | mysql -uroot -p    //斷點恢復第二處

驗證端點恢復是否成功
資料庫篇——完全、增量備份和恢復
說明:該操作成功避免了日誌檔案錯誤操作delete from info where ×××=1;對應的位置偏移量範圍,將正確的操作恢復。

附:關於位置變數的篩選方法和時間變數的篩選方法

基於位置:at
跳過錯誤的
mysqlbinlog --no-defaults --stop-position='871' mysql_bin.000005 | mysql -uroot -p
mysqlbinlog --no-defaults --start-position='1160' mysql_bin.000005 | mysql -uroot -p
篩選正確的
mysqlbinlog --no-defaults --start-position='871' --stop-position='1160' mysql_bin.000005 | mysql -uroot -p
基於時間點:time
mysqlbinlog --no-defaults --stop-datetime='2018-03-11 21:30:39' mysql_bin.000002 | mysql -u root -p
mysqlbinlog --no-defaults --start-datetime='2018-03-11 21:30:39' mysql_bin.000002 | mysql -u root -p
篩選一段時間
mysqlbinlog --no-defaults --start-datetime='2018-12-05 21:30:39' --stop-datetime='2018-12-05 22:01:20' mysql_bin.000002 | mysql -u root -p
關鍵記錄好時間點:
誤操作時間點:2018-12-05 22:01:13
之後新增正確:2018-12-05 22:01:20