MySQL(5)日志管理、备份与恢复,断点
文章目錄
- 一、MySQL日志管理
- 1.1 日志的分類
- 1)錯(cuò)誤日志
- 2) 通用查詢?nèi)罩?/li>
- 3) 二進(jìn)制日志(binlog)
- 4) 慢查詢?nèi)罩?/li>
- 5) 配置日志
- 1.2 日志的查詢
- 二、MySQL 完全備份與恢復(fù)
- 2.1 數(shù)據(jù)備份的重要性
- 2.2 造成數(shù)據(jù)丟失的原因
- 2.3 數(shù)據(jù)庫(kù)備份的分類
- 2.3.1 從物理和邏輯角度分
- 1)物理備份
- 2)邏輯備份
- 2.4 數(shù)據(jù)庫(kù)的備份策略
- 2.5 MySQL 完全備份
- 2.5.1 物理冷備份與恢復(fù)
- 2.1.2 專用備份工具mydump 和mysqlhotocopy
- (1)完全備份一個(gè)或多個(gè)完整的庫(kù)(包括其中所有的表)
- (2)完全備份 MySQL 服務(wù)器中所有的庫(kù)
- (3)完全備份指定庫(kù)中的部分表
- (4)查看備份文件
- 2.1.3 MySQL 完全備份(使用免交互)
- (1)恢復(fù)數(shù)據(jù)庫(kù)
- (2)恢復(fù)數(shù)據(jù)表
- 2.1.4 MySQL 增量備份與恢復(fù)
- 1.開啟二進(jìn)制日志功能
- 2.可每周對(duì)數(shù)據(jù)庫(kù)或表進(jìn)行完全備份
- 3.可每天進(jìn)行增量備份操作,生成新的二進(jìn)制日志文件(例如 mysql-bin.000002)
- 4.插入新數(shù)據(jù),以模擬數(shù)據(jù)的增加或變更
- 5.再次生成新的二進(jìn)制日志文件(例如 mysql-bin.000005)
- 6.查看二進(jìn)制日志文件的內(nèi)容
- 2.1.5 MySQL 增量恢復(fù)
- 1.一般恢復(fù)
- 2.斷點(diǎn)恢復(fù)
一、MySQL日志管理
MySQL 的日志默認(rèn)保存位置為/usr/local/mysql/data
MySQL 的日志配置文件為/etc/my.cnf ,里面有個(gè)[mysqld]項(xiàng)。
這是我們當(dāng)時(shí)安裝mysql時(shí)指定的目錄,如下圖所示:
1.1 日志的分類
1)錯(cuò)誤日志
用來記錄當(dāng)MySQL啟動(dòng)、停止或運(yùn)行時(shí)發(fā)生的錯(cuò)誤信息,默認(rèn)已開啟
log-error=/usr/local/mysql/data/mysql_error.log #指定日志的保存位置和文件名
2) 通用查詢?nèi)罩?/h3>
用來記錄MySQL的所有連接和語句,默認(rèn)是關(guān)閉的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
3) 二進(jìn)制日志(binlog)
用來記錄所有更新了數(shù)據(jù)或者已經(jīng)潛在更新了數(shù)據(jù)的語句,記錄了數(shù)據(jù)的更改,可用于數(shù)據(jù)恢復(fù),默認(rèn)已開啟
log-bin=mysql-bin #也可以 log_bin=mysql-bin
4) 慢查詢?nèi)罩?/h3>
用來記錄所有執(zhí)行時(shí)間超過long_query_time秒的語句,可以找到哪些查詢語句執(zhí)行時(shí)間長(zhǎng),以便于優(yōu)化,默認(rèn)是關(guān)閉的
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5 #設(shè)置超過5秒執(zhí)行的語句被記錄,缺省時(shí)為10秒
5) 配置日志
1)修改my,cof配置文件
2)重新mysql服務(wù)
1.2 日志的查詢
mysql -u root -p[密碼]
show variables like ‘general%’; #查看通用查詢?nèi)罩臼欠耖_啟
show variables like ‘log_bin%’; #查看二進(jìn)制日志是否開啟
show variables like ‘%slow%’; #查看慢查詢?nèi)展δ苁欠耖_啟
show variables like ‘long_query_time’; #查看慢查詢時(shí)間設(shè)置
set global show_query_log=ON; #在數(shù)據(jù)庫(kù)中設(shè)置開啟慢查詢的方法
二、MySQL 完全備份與恢復(fù)
2.1 數(shù)據(jù)備份的重要性
備份的主要目的是災(zāi)難恢復(fù)
在生產(chǎn)環(huán)境中,數(shù)據(jù)的安全性至關(guān)重要
任何數(shù)據(jù)的丟失都可能產(chǎn)生嚴(yán)重的后果
2.2 造成數(shù)據(jù)丟失的原因
程序錯(cuò)誤
人為操作錯(cuò)誤.
運(yùn)算錯(cuò)誤
磁盤故障
災(zāi)難(如火災(zāi)、地震)和盜竊
2.3 數(shù)據(jù)庫(kù)備份的分類
2.3.1 從物理和邏輯角度分
1)物理備份
對(duì)數(shù)據(jù)庫(kù)操作系統(tǒng)的物理文件(如數(shù)據(jù)文件、日志文件等)的備份
物理備份的方法:
冷備份(脫機(jī)備份) :是在關(guān)閉數(shù)據(jù)庫(kù)的時(shí)候進(jìn)行的;
熱備份(聯(lián)機(jī)備份) :數(shù)據(jù)庫(kù)處于運(yùn)行狀態(tài),依賴于數(shù)據(jù)庫(kù)的日志文件;
溫備份:數(shù)據(jù)庫(kù)鎖定表格(不可寫入但可讀)的狀態(tài)下進(jìn)行備份操作。
2)邏輯備份
對(duì)數(shù)據(jù)庫(kù)邏輯組件(如:表等數(shù)據(jù)庫(kù)對(duì)象)的備份
2.4 數(shù)據(jù)庫(kù)的備份策略
完全備份:每次對(duì)數(shù)據(jù)庫(kù)進(jìn)行完整的備份
是對(duì)整個(gè)數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)結(jié)構(gòu)和文件結(jié)構(gòu)的備份
保存的是備份完成時(shí)刻的數(shù)據(jù)庫(kù)
是差異備份與增量備份的基礎(chǔ)
優(yōu)點(diǎn):備份與恢復(fù)操作簡(jiǎn)單方便
缺點(diǎn):數(shù)據(jù)存在大量的重復(fù)、占用大量的備份空間及備份與恢復(fù)時(shí)間長(zhǎng)
差異備份:備份自從上次完全備份之后被修改過的文件
增量備份:只有在上次完全備份或者增量備份后被修改的文件才會(huì)被備份
use school;
create table if not exists info1 (
id int(4) not null auto_increment,
name varchar(10) not null,
sex char(10) not null,
hobby varchar(50),
primary key (id));
insert into info1 values(1,‘user1’,‘male’,‘running’);
insert into info1 values(2,‘user2’,‘female’,‘singing’);
2.5 MySQL 完全備份
InnoDB存儲(chǔ)引擎的數(shù)據(jù)庫(kù)在磁盤上存儲(chǔ)成三個(gè)文件:db.opt(表屬性文件)、表名.frm(表結(jié)構(gòu)文件)、表名.ibd(表數(shù)據(jù)文件)。
實(shí)驗(yàn)環(huán)境如下:在school庫(kù)中有info1、2張表
2.5.1 物理冷備份與恢復(fù)
備份時(shí)數(shù)據(jù)庫(kù)處于關(guān)閉狀態(tài),直接打包數(shù)據(jù)庫(kù)文件
備份速度快,恢復(fù)時(shí)也是最簡(jiǎn)單的
操作步驟(理論):
systemctl stop mysqld
yum -y install xz
cd /usr/local/mysql
#壓縮備份data目錄
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz data/
#解壓恢復(fù)data目錄
tar Jxvf /opt/mysql_all_2021-06-26.tar.xz -C ./
實(shí)驗(yàn)操作步驟(實(shí)操):
1)備份data命令
2)登錄mysql,刪除school庫(kù)
3)解壓之前備份的數(shù)據(jù)庫(kù)data目錄,不用刪除原目錄,會(huì)自動(dòng)替換
4)重啟服務(wù)查看被刪除的庫(kù)
2.1.2 專用備份工具mydump 和mysqlhotocopy
mysqldump常用的邏輯備份工具
mysqlhotcopy僅擁有備份MyISAM和ARCHIVE表
(1)完全備份一個(gè)或多個(gè)完整的庫(kù)(包括其中所有的表)
mysqldump -u root -p[密碼] --databases 庫(kù)名1 [庫(kù)名2] … > /備份路徑/備份文件名.sql #導(dǎo)出的就是數(shù)據(jù)庫(kù)腳本文件
例:備份單個(gè)和多個(gè)庫(kù)
mysqldump -uroot -p --databases school > /opt/backup/school.sql
mysqldump -uroot -p --databases school yy > /opt/backup/school_yy.sql
(2)完全備份 MySQL 服務(wù)器中所有的庫(kù)
mysqldump -u root -p[密碼] --all-databases > /備份路徑/備份文件名.sql
例:備份所有庫(kù)
mysqldump -uroot -p --all-databases > /opt/backup/all.sql
(3)完全備份指定庫(kù)中的部分表
mysqldump -u root -p[密碼] 庫(kù)名 [表名1] [表名2] … > /備份路徑/備份文件名.sql
例:備份school庫(kù)中的兩個(gè)表
mysqldump -uroot -p school [-d] info1 info2 > /opt/backup/school_info1_info2.sql
#使用“-d”選項(xiàng),說明只保存數(shù)據(jù)庫(kù)的表結(jié)構(gòu)
#不使用“-d”選項(xiàng),說明表數(shù)據(jù)也進(jìn)行備份
(4)查看備份文件
grep -v “^–” /opt/backup/school_info1_info2.sql | grep -v “^/” | grep -v “^$”
2.1.3 MySQL 完全備份(使用免交互)
systemctl start mysqld
(1)恢復(fù)數(shù)據(jù)庫(kù)
mysql -u root -p -e ‘drop database school;’
#“-e”選項(xiàng),用于指定連接 MySQL 后執(zhí)行的命令,命令執(zhí)行完后自動(dòng)退出
mysql -u root -p -e ‘show databases;’
#恢復(fù)school數(shù)據(jù)庫(kù)
mysql -u root -p < /opt/backup/school.sql
mysql -u root -p -e ‘show databases;’
具體操作:
(2)恢復(fù)數(shù)據(jù)表
當(dāng)備份文件中只包含表的備份,而不包含創(chuàng)建的庫(kù)的語句時(shí),執(zhí)行導(dǎo)入操作時(shí)必須指定庫(kù)名,且目標(biāo)庫(kù)必須存在。
mysqldump -u root -p kgc info1 > /opt/kgc_info1.sql
mysql -u root -p -e ‘drop table kgc.info1;’
mysql -u root -p -e ‘show tables from kgc;’
mysql -u root -p kgc < /opt/kgc_info1.sql
mysql -u root -p -e ‘show tables from kgc;’
具體操作:
1)刪除school中的class1表
2)恢復(fù)school庫(kù)中的表
2.1.4 MySQL 增量備份與恢復(fù)
1.開啟二進(jìn)制日志功能
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED 指定二進(jìn)制日志(binlog)的記錄格式為 MIXED
server-id = 1
二進(jìn)制日志(binlog)有3種不同的記錄格式:
STATEMENT(基于SQL語句)
ROW(基于行)
MIXED(混合模式),默認(rèn)格式是STATEMENT
只要重啟就會(huì)自動(dòng)生成二進(jìn)制文件
systemctl start mysqld
ls -l /usr/local/mysql/data/mysql-bin.*
測(cè)試:
2.可每周對(duì)數(shù)據(jù)庫(kù)或表進(jìn)行完全備份
mysqldump -u root -p school class1 > /opt/school_class1_KaTeX parse error: Expected group after '_' at position 83: …l > /opt/school_?(date +%F).sql #對(duì)所有的庫(kù)做備份
3.可每天進(jìn)行增量備份操作,生成新的二進(jìn)制日志文件(例如 mysql-bin.000002)
mysqladmin -u root -p flush-logs
4.插入新數(shù)據(jù),以模擬數(shù)據(jù)的增加或變更
use school;
insert into info1 values(6,‘qq’,‘女’,‘上天’);
insert into info1 values(7,‘la’,‘男’,‘整容’);
5.再次生成新的二進(jìn)制日志文件(例如 mysql-bin.000005)
mysqladmin -u root -p flush-logs
#之前的步驟4的數(shù)據(jù)庫(kù)操作會(huì)保存到mysql-bin.000004文件中,之后數(shù)據(jù)庫(kù)數(shù)據(jù)再發(fā)生變化則保存在mysql-bin.000005文件中
6.查看二進(jìn)制日志文件的內(nèi)容
cp /usr/local/mysql/data/mysql-bin.000004 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt//backup/mysql-bin.000004
#–base64-output=decode-rows:使用64位編碼機(jī)制去解碼并按行讀取
#-v:顯示詳細(xì)內(nèi)容
2.1.5 MySQL 增量恢復(fù)
1.一般恢復(fù)
(1)模擬丟失更改的數(shù)據(jù)的恢復(fù)步驟
use school;
delete from info1 where id=6;
delete from info1 where id=7;
mysqlbinlog --no-defaults mysql-bin.000007 | mysql -u root -p123123
具體操作:
1)刪除info1表中的末2行數(shù)據(jù)
2)通過二進(jìn)制日志進(jìn)行恢復(fù)
(2)模擬丟失所有數(shù)據(jù)的恢復(fù)步驟
use school;
drop table class1;
mysql -u root -p school < /opt/backup/school_info1_info2.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000005 | mysql -u root -p
具體操作:
1)刪除school庫(kù)中的class1表
2)先回復(fù)整表,然后在恢復(fù)二進(jìn)制日志文件
2.斷點(diǎn)恢復(fù)
實(shí)驗(yàn):表和數(shù)據(jù)如下
mysqladmin -u root -p flush-logs # 刷新生成新的二進(jìn)制日志文件
cd /usr/local/mysql/data # 進(jìn)入到data目錄
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.0000009 #查看二進(jìn)制日志文件
例:
# at 497 #斷點(diǎn)
#210831 21:24:46 #時(shí)間
insert into football values(1,‘梅西’,34,800000) #插入的數(shù)據(jù)
# at 2246
#210831 21:28:02 #時(shí)間
insert into football values(7,‘楊鵬’,23,100) #插入的數(shù)據(jù)
(1)基于位置恢復(fù)
#僅恢復(fù)到操作 ID 為“2246之前的數(shù)據(jù),即不恢復(fù)“后面一條”的數(shù)據(jù)
mysqlbinlog --no-defaults --stop-position=‘2246’ mysql-bin.000009 | mysql -uroot -p
1)刪除football表中所有數(shù)據(jù)
2)對(duì)數(shù)據(jù)進(jìn)行恢復(fù)
恢復(fù)最后一條數(shù)據(jù)
mysqlbinlog --no-defaults --start-position=‘2246’ mysql-bin.000006 | mysql -uroot -p
1)重新刪除數(shù)據(jù)
2)對(duì)數(shù)據(jù)進(jìn)行恢復(fù)
(2)基于時(shí)間點(diǎn)恢復(fù)
#僅恢復(fù)到 210628 15:05:23 之前的數(shù)據(jù),即不恢復(fù)“楊鵬”的數(shù)據(jù)
mysqlbinlog --no-defaults --stop-datetime=‘2021-08-31 21:28:02’ mysql-bin.000009 |mysql -uroot -p123123
1)刪除數(shù)據(jù)
2)恢復(fù)數(shù)據(jù)
恢復(fù)最后一條數(shù)據(jù)
mysqlbinlog --no-defaults --start-datetime=‘2021-08-31 21:28:02’ mysql-bin.000009 |mysql -uroot -p123123
恢復(fù)數(shù)據(jù)
總結(jié)
以上是生活随笔為你收集整理的MySQL(5)日志管理、备份与恢复,断点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL(4) 索引、事务与存储引擎
- 下一篇: MySQL(6)数据库中的高级(进阶)