一、安裝mysql社區服務
二、數據庫的介紹
三、備份類型和備份工具
一、安裝mysql社區服務
這是小編自己寫的,沒有安裝的去看看
Linux換源以及yum安裝nginx和mysql-CSDN博客
二、數據庫的介紹
2.1?數據庫的組成
數據庫是一堆物理文件的集合,主要包括:
-
數據文件 /var/lib/mysql
-
配置文件 => /etc/my.cnf
-
日志文件(主要是二進制日志文件)
2.2?存儲引擎層
簡單來說,就是數據的存儲方式。在MySQL中,我們可以使用show engines
查看當前數據庫版本支持哪些引擎。
常見的數據存儲引擎:InnoDB、MyISAM、NDB等。
MyISAM與InnoDB引擎的區別
-
MyISAM引擎:
-
擅長數據的查詢,支持全文索引。
-
-
InnoDB引擎:
-
支持事務處理、行級鎖、支持外鍵。==5.7也是支持全文索引==
-
2.3?存儲層(數據文件與日志文件 - InnoDB)
存儲引擎的數據文件存儲方式
首先創建一個數據庫:
create database lsh DEFAULT CHARSET=utf8;
MyISAM引擎的文件存儲
mysql> USE lsh;
mysql> CREATE TABLE tb_user(id INT, name CHAR(1)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
InnoDB引擎的文件存儲
mysql> USE lsh;
mysql> CREATE TABLE tb_user(id INT, name CHAR(1)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2.4?日志文件
日志類型 | 寫入日志的信息 |
---|---|
錯誤日志 (error log) | 啟動、運行或停止 mysqld 時遇到的問題 |
通用查詢日志 (general log) | 服務器收到的所有客戶端連接和語句 |
二進制日志 (binary log) | 數據更改語句 (更新、刪除、更改表結構) |
慢查詢日志 (slow query log) | 執行時間超過特定閾值的查詢語句 |
DDL日志 (元數據日志) | 由DDL語句執行的元數據操作 |
二進制日志
作用:
二進制日志記錄數據庫的所有更改操作(DDL/DML/DCL),不包含select或者show這類語句。
場景:
-
用于主從復制:在主從復制中,master主服務器將二進制日志中的更改操作發送給slave從服務器,從服務器執行這些更改操作是的和主服務器的更改相同。
-
用于數據的恢復:用于數據的恢復操作。
默認binlog日志是關閉的,可以通過修改配置文件完成開啟,如下:
# vim /etc/my.cnf[mysqld]
log-bin=/usr/local/mysql/data/binlog
server-id=1
當我們更改了my.cnf配置文件,一定要記得重啟MySQL服務器。service命令
systemctl restart mysqld
二進制日志比較特殊,需要使用
mysqlbinlog
工具查看,如mysqlbinlog
二進制日志文件。
mysqlbinlog 【文件名】
三、備份類型和備份工具
3.1 備份和冗余的區別
-
備份:能夠防止由于機械故障以及人為誤操作帶來的數據丟失,例如將數據庫文件保存在了其它地方。
-
冗余:數據有多份冗余,但不等于備份,只能防止機械故障帶來的數據丟失,例如主備模式、數據庫集群。
3.2 備份類型
邏輯備份(mysqldump)
-
備份的是建表、建庫、插入等操作所執行SQL語句(DDL,DML,DCL)。
-
適用于中小型數據庫,效率相對較低一般。在數據庫正常提供服務的前提下進行,如:mysqldump、mydumper等。
-
備份實質:就是把要備份的數據導出成.sql或.txt文件
物理備份(tar、cp、xtrabackup)
-
直接復制數據庫文件
-
適用于大型數據庫環境,不受存儲引擎的限制,但不能恢復到不同的MySQL版本。
-
一般是在數據庫徹底關閉或者不能完成正常提供服務的前提下進行的備份;
-
如:tar、cp、xtrabackup(數據庫可以正常提供服務lvm,snapshot、rsync等)
-
備份的實質:對數據文件+配置文件+日志文件進行拷貝操作
在線熱備(數據冗余、AB復制、主從復制)
-
MySQL的replication架構,如M-S|M-S-S|M-M-S等
-
實時在線備份
3.3 備份工具
社區版安裝包中的備份工具
mysqldump(邏輯備份,只能全量備份)
1)企業版和社區版都包含
2)本質上使用SQL語句描述數據庫及數據并導出
3)在MYISAM引|擎上鎖表,Innodb引擎上鎖行
4)數據量很大時不推薦使用
mysql hotcopy(物理備份工具)
1)企業版和社區版都包含
2)perl寫的一個腳本,本質上是使用鎖表語句后再拷貝數據
3)只支持MYISAM數據引擎
企業版安裝包中的備份工具
mysqlbackup
1)在線備份
2)增量備份
3)部分備份
4)在某個特定時間的一致性狀態的備份
第三方備份工具
XtraBackup
Xtrabackup是一個對InnoDB做數據備份的工具,支持寺在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDBHotbackup的一個很好的替代品。
Xtrabackup有兩個主要的工具:xtrabackup、innobackupex
xtrabackup只能備份InnoDB和XtraDB3兩種數據表,不能備份myisam類型的表。
innobackupex是將Xtrabackup進行封裝的per腳本,所以能同時備份處理innodb和myisam的存儲引擎,但在處理myisam時需要加一個讀鎖。
3.3 mysqldump工具(邏輯備份工具)
本質:導出的是sql語句文件
優點:無論是什么存儲引擎,都可以用mysqldump備成sql語句
缺點:速度較慢,導入時可能會出現格式不兼容的突發狀況
無法直接做增量備提供三種級別的備份,表級,庫級和全庫級
mysqldump基本語法
表級別備份
mysqldump [OPTIONS] database [tables] > b.sql
庫級別備份
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
全庫級別備份
mysqldump [OPTIONS] --all-databases [OPTIONS]
準備一些要備份的數據:
-- 創建數據庫
mysql> CREATE DATABASE db_it DEFAULT CHARSET=utf8;-- 使用數據庫
mysql> USE db_it;-- 創建表
CREATE TABLE tb_student (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(20),age TINYINT UNSIGNED DEFAULT 0,gender ENUM('male', 'female'),subject ENUM('ui', 'java', 'yunwei', 'python'),PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 插入數據
INSERT INTO tb_student VALUES (NULL, '劉備', 33, 'male', 'java'),(NULL, '關羽', 32, 'male', 'yunwei'),(NULL, '張飛', 30, 'male', 'python'),(NULL, '貂蟬', 18, 'female', 'ui'),(NULL, '大喬', 18, 'female', 'ui');
mysqldump表級備份與還原
備份
案例:把db_it數據庫中的tb_student數據表進行備份
# mkdir /bak
# mysqldump -uroot -p db_it tb_student > /bak/tb_student.sql
還原
-- 還原之前先把表刪了
drop table tb_studnet;# mysql -u root -pmysql> use db_it
mysql> source /bak/tb_student.sql
mysqldump庫級備份與還原
備份
案例:把db_it數據庫進行備份
# mysqldump -uroot -p --databases db_it > /bak/db_it.sql
還原
drop database db_it;# mysql -uroot -pmysql> source /bak/db_it.sql
mysqldump全庫級備份
在MySQL中,如果想使用mysqldump進行全庫級備份,必須開啟二進制日志!!!
開啟二進制日志
vim /etc/my.cnfserver-id=1
log-bin=/mysql_3306/data/binlog
# mysqldump -uroot -p --all-databases --master-data --single-transaction > /bak/all.sql
選項 | 描述說明 |
---|---|
--flush-logs, -F | 開始備份前刷新日志(二進制日志)binlog.000001 => binlog.000002 |
--flush-privileges | 備份包含mysql數據庫時刷新授權表 => 刷新用戶和授權信息 |
--lock-all-tables, -x | MyISAM一致性,服務可用性(針對所有庫所有表) |
--lock-tables, -l | 備份前鎖表(針對要備份的庫) |
--single-transaction | 適用InnoDB引擎,保證一致性,服務可用性 |
--master-data=2 | 表示將二進制日志位置和文件名寫入到備份文件并在dump文件中注釋掉這一行 |
--master-data=1 | 表示將二進制日志位置和文件名寫入到備份文件,在dump文件中不注釋這一行 |
3.4 實現增量備份(重要)
增量備份的核心思路
增量備份的關鍵:
-
要有全量備份作為基礎
-
繼續增刪改數據
-
再次需要備份時,不需要進行全量備份,只需要備份binlog日志文件即可(因為binlog日志記錄了增刪改操作的所有SQL語句)
增量備份實驗步驟
第一步:先準備數據
-- 創建數據庫
CREATE DATABASE db_it DEFAULT CHARSET=utf8;-- 使用數據庫
USE db_it;-- 創建表
CREATE TABLE tb_student (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(20),age TINYINT UNSIGNED DEFAULT 0,gender ENUM('male', 'female'),subject ENUM('ui', 'java', 'yunwei', 'python'),PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 插入數據
INSERT INTO tb_student VALUES (NULL, '劉備', 33, 'male', 'java'),(NULL, '關羽', 32, 'male', 'yunwei'),(NULL, '張飛', 30, 'male', 'python'),(NULL, '貂蟬', 18, 'female', 'ui'),(NULL, '大喬', 18, 'female', 'ui');
第二步:開啟二進制日志,重啟服務,然后進行全庫備份
# 編輯 MySQL 配置文件
vim /etc/my.cnf# 添加以下配置
[mysqld]
server-id=10
log-bin=/mysql_3306/data/binlog# 重啟 MySQL 服務
systemctl restart mysqld# 清理臨時備份文件
rm -rf /tmp/sqlbak/*# 備份所有數據庫
mysqldump \
--single-transaction \
--flush-logs \
--master-data=2 \
--all-databases \
> /bak/a.sql \
-p
第三步:繼續對數據庫進行增刪改操作
-- 插入新記錄
INSERT INTO tb_student VALUES (NULL, '小喬', 16, 'female', 'ui');
-- 刪除記錄
DELETE FROM tb_student WHERE id = 3;
第四步:突然發生了硬件故障,數據庫丟失了
# 模擬故障情況,刪除數據庫
mysql -e "DROP DATABASE db_it;" -p
# 輸入密碼: 123
第五步:動員運維工程師開始進行數據恢復,馬上把最新的二進制文件進行備份
# 復制二進制日志文件到備份目錄
cp /usr/local/mysql/data/binlog.000003 /bak
第六步:先進行全庫恢復
# 恢復全量備份
mysql < /tmp/sqlbak/all.sql -p
# 輸入密碼: 123
第七步:通過binlog增量備份還原數據到100%
學會讀二進制日志文件,必須通過專業的工具
# 使用 mysqlbinlog 解析二進制日志文件,定位關鍵操作
/mysqlbinlog /bak/binlog.000003
# 重點關注事故臨界點(如 DROP DATABASE)# 確認日志中操作位置的起始和結束偏移量
# 使用指定位置范圍恢復數據
mysqlbinlog --start-position=201 --stop-position=629 /bak/binlog.000003 | mysql -uroot -p