1.1 數據庫管理系統(DBMS)
RDBMS : Oracle SQLServer DB2 MySQL
NoSQL : Redis MongoDB ES
NewSQL: PolarDB OceanBase TDB TiDBpython
1.2 排名
db-engines.com/rankingmysql
1.3 MySQL 介紹linux
1.3.1 如何獲取軟件
www.mysql.com算法
1.3.2 企業版本選擇.6
5.7
8.0sql
GA 6-12月版本,大約20個版本左右,能夠測試使用了. 從邊緣業務開始,作好前期的測試數據庫
1.3.3 分支
Oracle MySQL
Percona
MariaDB
RDS
TDBvim
2.1 上傳並解壓軟件
[root@db01 local]# tar xf mysql-8.0.20-linux-glibc2.12-x86_64.tacentos
**2.2 軟鏈接 **安全
[root@db01 local]# mv mysql-8.0.20-linux-glibc2.12-x86_64 mysq
**2.3 環境變量 **
[root@db01 bin]# vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH
source /etc/profile
[root@db01 bin]# mysql -V
mysql Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)
**2.4 建用戶 **
[root@db01 bin]# useradd mysql
2.5 建立所需目錄
[root@db01 ~]# mkdir -p /data/3306/data
[root@db01 ~]# chown -R mysql.mysql /data
2.6 數據初始化
[root@db01 ~]# mv /etc/my.cnf /tmp
[root@db01 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data
2.7 配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysql]
socket=/tmp/mysql.sock
[mysqld]
server_id=10
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
**2.8 準備啓動腳本 **
[root@db01 ~]# cd /usr/local/mysql/support-files/
[root@db01 support-files]# \cp mysql.server /etc/init.d/mysqld
[root@db01 support-files]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/3306/data/db01.err'.
. SUCCESS!
1.1 Unix Socket
1.2 網絡socket(TCP/IP)
1.3 鏈接方法
自帶的客戶端程序: mysql mysqldump
開發工具: navicat sqlyog workbench
程序鏈接: pymysql
2.1 server
2.1.1 鏈接層
協議
驗證
線程
2.1.2 SQL層
語法,語義,權限檢查
解析,生成解析樹
優化,生成執行計劃
執行,得出執行結果.
2.2 engine
從磁盤中段 , 區(簇,64個PAGE,默認1M) ,頁(16KB)
3.1 定義
oldguo@'白名單'
白名單:
%
10.0.0.%
10.0.0.5%
10.0.0.1
10.0.0.0/255.255.254.0
localhost
**3.2 用戶管理 **
注意:
1. 8.0以後,必須先創建用戶再受權,不能經過grant建立用戶和修改密碼. 2. 8.0以後,加密插件從mysql_native_password 改成了 caching_sha2_password
(1) 查詢
mysql> select user,host,authentication_string ,plugin from mysql.user;
+------------------+-----------+------------------------------------------------------------------------+-----------------------+
| user | host | authentication_string | plugin |
+------------------+-----------+------------------------------------------------------------------------+-----------------------+
| mysql.infoschema | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| mysql.session | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| mysql.sys | localhost | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password |
| root | localhost | | caching_sha2_password |
+------------------+-----------+------------------------------------------------------------------------+-----------------------+
(2) 建立用戶
mysql> create user oldguo@'10.0.0.%' identified with mysql_native_password by '123';
mysql> create user oldboy@'10.0.0.%' identified by '123';
(3) 修改
mysql> alter user root@'localhost' identified with mysql_native_password by '123';
mysql> alter user oldguo@'10.0.0.%' account lock;
mysql> alter user oldguo@'10.0.0.%' account unlock;
(4) 刪除
drop user oldguo@'10.0.0.%';
**4.1 權限的定義 **
mysql> show privileges;
8.0 加入了新特性role . approle
all
Grant option
**4.2 受權和回收 **
grant 權限 on 權限範圍 to 用戶
權限範圍:
.
app.*
app.t1
mysql> create user root@'10.0.0.%' identified with mysql_native_password by '123';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on . to root@'10.0.0.%' with grant option;
revoke
mysql> revoke drop on . from root@'10.0.0.%';
mysql> show grants for root@'10.0.0.%';
4.3 受權表
例如: users db tables_priv
**4.4 本地管理員密碼忘記 **
[root@db01 ~]# /etc/init.d/mysqld stop
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &
[root@db01 ~]# mysql
mysql> flush privileges ;
mysql> alter user root@'localhost' identified with mysql_native_password by '123';
[root@db01 ~]# /etc/init.d/mysqld restart
5.1 mysqld 程序啓動
/usr/local/mysql/bin/mysqld &
直接啓動數據庫服務,而且打印全部日誌到屏幕上.
通常是在須要啓動調試時使用.
5.2 mysqld_safe 程序啓動
mysqld_safe ----> mysqld
通常是在須要啓動調試時使用.例如,能夠在啓動時,臨時加參數,--skip-grant-tables --skip-networking
**5.3 sys-v ---> /etc/init.d/ **
[root@db01 ~]# service mysqld stop
[root@db01 ~]# service mysqld strt
[root@db01 ~]# service mysqld restart
**5.4 systemd **
[root@db01 ~]# systemctl start mysqld
[root@db01 ~]# systemctl stop mysqld
[root@db01 ~]# systemctl restart mysqld
**5.5 關閉 **
[root@db01 ~]# mysqladmin -uroot -p123 shutdown
**6.1 默認讀取位置 **
[root@db01 ~]# mysqld --help --verbose |grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
6.2 改變默認配置文件位置
mysqld
mysqld_safe
--defaults-file=/opt/aa.txt
6.3 配置文件結構
[標籤] ----> 做用: 表示下面的配置影響了什麼程序
配置
類型:
客戶端標籤: 影響本地登陸 ---> [mysql] [mysqldump]
服務端標籤: 影響數據庫啓動 ---> [mysqld] [mysqld_safe]
[mysql]
socket=/tmp/mysql.sock
[mysqld]
server_id=10
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
**7.1 本地客戶端工具鏈接 **
(1) Socket文件方式
前提: 必須提早建立白名單爲localhost用戶,並受權.例如:oldguo@'localhost'
[root@db01 ~]# mysql -uroot -p123 -S /tmp/mysql.sock
(2) tcpip方式 :
前提: 必須提早建立白名單爲遠程登陸用戶,並受權.例如:oldboy@'10.0.0.%'
[root@db01 ~]# mysql -uoldboy -p123 -h10.0.0.51 -P3306
**7.2 開發工具 **
去掉沒必要要的括號
如: ((a AND b) AND c OR (((a AND b) AND (c AND d))))
修改爲 (a AND b AND c) OR (a AND b AND c AND d)
去掉重疊條件
如: (a<b AND b=c) AND a=5
修改爲 b>5 AND b=c AND a=5
如: (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
修改爲 B=5 OR B=6
避免使用not in、not exists 、<>、like %%
多表鏈接,小表驅動大表
減小臨時表應用,優化order by 、group by、uninon、distinct、join等
減小語句查詢範圍,精確查詢條件
多條件,符合聯合索引最左原則
查詢條件減小使用函數、拼接字符等條件、條件隱式轉換
union all 替代 union
10.減小having子句使用
11.如非必須不使用 for update語句
12.update和delete,開啓安全更新參數
mysql> set global sql_safe_updates=1;
13.減小inset ... select語句應用
若是是歸檔表,pt-archiver
14.使用load 替代insert錄入大數據
導入大量數據時,能夠禁用索引、增大緩衝區(innodb_buffer_pool_size)、增大redo(innodb_log_file_size)文件和 redo buffer()、關閉autocommit、RC級別能夠提升效率.
16.優化limit,最好業務邏輯中先獲取主鍵ID,再基於ID進行查詢
limit 5000000,10
DDL執行前要審覈
8.0以前: 若是緊急,pt-osc,gh-ost
多表鏈接語句執行前要看執行計劃
Btree 索引
Hash 索引
FULLTEXT
b-tree、b+tree、b*tree:請看博主關於mysql的應用詳解連接
3.1 聚簇(區)索引
IOT組織表: 索引組織表.聚簇索引組織表.數據行是按照聚簇索引順序組織存儲的.
前提:
1. 若是有主鍵,主鍵就是聚簇索引
2. 沒有主鍵,選擇第一個不爲空的惟一鍵的列
3. 都沒有,生成隱藏列
3.2 輔助索引
**3.3 關於索引自由化能力 **
AHI : 自適應Hash索引
索引的索引. latch 閂鎖.
自動評估內存索引頁訪問頻率,將熱點內存頁生成hash列表,快速鎖定內存地址目的.
Change buffer(Insert buffer)
主要影響輔助索引的修改.
對於輔助索引的更新,不會當即進行,會將更新緩衝到change buffer區域中.
ICP 索引下推
(a,b,c)
MRR
3.4 索引優化
非惟一索引按照「i_字段名稱_字段名稱[_字段名]」進行命名。
惟一索引按照「u_字段名稱_字段名稱[_字段名]」進行命名。
索引名稱使用小寫。
索引中的字段數不超過5個。
惟一鍵由3個如下字段組成,而且字段都是整形時,使用惟一鍵做爲主鍵。
沒有惟一鍵或者惟一鍵不符合5中的條件時,使用自增id做爲主鍵。
惟一鍵不和主鍵重複。
索引選擇度高的列做爲聯合索引最左條件
ORDER BY,GROUP BY,DISTINCT的字段須要添加在索引的後面。 where a order by b
單張表的索引數量控制在5個之內,若單張表多個字段在查詢需求上都要單獨用到索引,須要通過DBA評估。查詢性能問題沒法解決的,應從產品設計上進行重構。
使用EXPLAIN判斷SQL語句是否合理使用索引,儘可能避免extra列出現:Using File Sort,Using Temporary。
UPDATE、DELETE語句須要根據WHERE條件添加索引。
對長度大於50的VARCHAR字段創建索引時,按需求恰當的使用前綴索引,或使用其餘方法。
下面的表增長一列url_crc32,而後對url_crc32創建索引,減小索引字段的長度,提升效率。
CREATE TABLE all_url(ID INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
url VARCHAR(255) NOT NULL DEFAULT 0,
url_crc32 INT UNSIGNED NOT NULL DEFAULT 0,
index idx_url(url_crc32));
合理建立聯合索引(避免冗餘),(a,b,c) 至關於 (a) 、(a,b) 、(a,b,c)。
合理利用覆蓋索引,減小回表。
減小冗餘索引和使用率較低的索引
優化器選擇完的執行計劃.能夠經過分析執行計劃,評估查詢語句的執行效率.
mysql> desc select *from city ;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | city | NULL | ALL | NULL | NULL | NULL | NULL | 4188 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
table
type
possible_keys
key
key_len
rows
Extra
ALL 全表掃描
index 全索引掃描
range 索引範圍掃描
< >= <= like or in
**說明: **
in or 有些情境下能夠改寫爲union all ,主要看一下重複值多少,若是太多不建議調整.
select * from city where countrycode in ('CHN','USA');
select * from city where countrycode='CHN' union all select * from city where countrycode='USA';
mysqlslap --defaults-file=/etc/my.cnf
--concurrency=100 --iterations=1 --create-schema='world'
--query="select * from city where countrycode in ('CHN','USA')" engine=innodb
--number-of-queries=2000 -uroot -p123 -verbose
mysqlslap --defaults-file=/etc/my.cnf
--concurrency=100 --iterations=1 --create-schema='world'
--query="select * from city where countrycode='CHN' union all select * from city where countrycode='USA'" engine=innodb
--number-of-queries=2000 -uroot -p123 -verbose
ref 輔助索引等值查詢
eq_ref 多表鏈接中的被驅動表的關聯條件是主鍵或惟一鍵
const(system) 主鍵或惟一鍵等值查詢
判斷聯合索引覆蓋長度. 索引最大預估字節長度.
a,b,c
a keylen 63
b keylen 21
c keylen 15
not null 無not null
tinyint 1 1 1+1
int 4 4 4+1
utf8 not null 無 not null
char(10) 310 310+1
varchar(10) 310+2 310+2+1
utf8mb4 not null 無 not null
char(10) 410 410+1
varchar(10) 410+2 410+2+1
i_a_b_c(a,b,c)
最左原則:
建索引,最左列惟一值多的
查詢條件必須包含最左列
徹底覆蓋
where a= and b= and c=
where a= and c= and b=
where a and b order c
部分覆蓋
where a= and c=
where a= and c=
where a= and b < > and c=
不覆蓋
where b= and c=
using filesort 額外排序 : order by group by distinct union
using temp 使用了臨時表 :
mysql> show engines;
FEDERATED
MEMORY
InnoDB
PERFORMANCE_SCHEMA
MyISAM
MRG_MYISAM
BLACKHOLE
CSV
ARCHIVE
事務
行鎖
MVCC
多緩衝區
外鍵
熱備
自動故障恢復(Crash Recovery)
DWB(double write buffer)
3.1 ACID特性
原子性 :
一致性 :
隔離性 :
持久性 :
**3.2 生命週期管理 **
(1) 標準事務控制語句
begin;/start transaction;
commit;
rollback;
(2) 自動提交機制
沒有使用顯示啓動事務時
begin;/start transaction;
對每個DML語句,都會自動提交
(3) 隱式提交
**3.3 事務的隔離級別 **
RU : 髒讀 不可重複讀 幻讀
RC : 不可重複讀 幻讀
RR : 能夠配合GAP Next lock 解決幻讀
SE :
4.1 redo 日誌
WAL : 日誌先行.
redo log file
redo log buffer
主要功能是實現ACID中的D的特性,同時還實現了AC.
**4.2 undo 日誌 **
存儲數據行修改的前鏡像.
主要功能實現ACID中的A特性.CI的特性有必定影響
**4.3 I特性 **
隔離級別 : 讀
鎖 : 寫
MVCC : 利用多個版本readview ---> undo
4.4 C 特性
CR : crash recovery ---> redo undo
DWB: double write buffer
mysql> show variables like '%general_log%';
+------------------+--------------------------+
| Variable_name | Value |
+------------------+--------------------------+
| general_log | OFF |
| general_log_file | /data/3306/data/db01.log |
**1.1 做用: **
記錄全部操做日誌.
**1.2 配置 **
mysql> set global general_log=0;
mysql>
mysql> show variables like '%log_error%';
log_error | ./db01.err
log_error_verbosity | 2
2.1 做用
記錄數據運行期間,狀態 警告 報錯
2.2 配置
mysql> set global log_error_verbosity=3;
**2.3 查看 **
Z 0 [ERROR] [MY-000067] [Server] unknown variable 'defualts-file=/opt/aa.txt'.
2020-10-09T03:35:59.905745Z 0 [ERROR] [MY-010119] [Server] Aborting
**3.1 做用: **
記錄數據庫中運行較慢的語句
3.2 配置
mysql> select @@slow_query_log;
+------------------+
| @@slow_query_log |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)
mysql> select @@slow_query_log_file;
+-------------------------------+
| @@slow_query_log_file |
+-------------------------------+
| /data/3306/data/db01-slow.log |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select @@long_query_time;
+-------------------+
| @@long_query_time |
+-------------------+
| 10.000000 |
+-------------------+
1 row in set (0.01 sec)
mysql> select @@log_queries_not_using_indexes;
+---------------------------------+
| @@log_queries_not_using_indexes |
+---------------------------------+
| 0 |
+---------------------------------+
1 row in set (0.00 sec)
mysql> set glo
mysql> set global slow_query_log=1;
Query OK, 0 rows affected (0.00 sec)
mysql> set global long_query_time=0.1;
Query OK, 0 rows affected (0.00 sec)
mysql> set global log_queries_not_using_indexes=1;
Query OK, 0 rows affected (0.00 sec)
**3.3 分析 **
[root@db01 data]# mysqldumpslow -s c -t 3 db01-slow.log
4.1 做用
記錄MySQL發生過的修改類的操做日誌.以二進制事件的方式記錄到日誌文件中.
能夠用來作數據恢復,能夠用來作主從複製.
**4.2 配置 **
8.0版本默認開啓,在數據目錄下存儲.
mysql> select @@log_bin;
+-----------+
| @@log_bin |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
mysql> select @@log_bin_basename;
+------------------------+
| @@log_bin_basename |
+------------------------+
| /data/3306/data/binlog |
+------------------------+
1 row in set (0.00 sec)
mysql> select @@binlog_format;
+-----------------+
| @@binlog_format |
+-----------------+
| ROW |
+-----------------+
1 row in set (0.00 sec)
mysql> select @@sync_binlog;
+---------------+
| @@sync_binlog |
+---------------+
| 1 |
**二進制日誌格式? **
row : 記錄航變化,記錄精準,日誌量比較大.
update t1 set name='a' where id<1000; 記錄999行變化日誌.
statement : SQL 數據操做時,若是有函數操做,例如隨機數函數.
update t1 set name='a' where id<1000; 記錄SQL語句自己.
miexd: 混合模式.
4.3 管理操做
mysql> show binary logs;
mysql> show master status ;
mysql> show binlog events in 'binlog.000014';
+---------------+-----+----------------+-----------+-------------+----------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+---------------+-----+----------------+-----------+-------------+----------------------------------------+
| binlog.000014 | 4 | Format_desc | 10 | 125 | Server ver: 8.0.20, Binlog ver: 4 |
| binlog.000014 | 125 | Previous_gtids | 10 | 156 | |
| binlog.000014 | 156 | Anonymous_Gtid | 10 | 233 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000014 | 233 | Query | 10 | 347 | create database oldguo /* xid=62898 */ |
+---------------+-----+----------------+-----------+-------------+---------------------------------------
[root@db01 data]# mysqlbinlog --start-position=233 --stop-position=347 /data/3306/data/binlog.000014 >/tmp/bin.sql
mysql> set sql_log_bin=0;
mysql> source /tmp/bin.sql
mysql> set sql_log_bin=1;
mysql> flush logs;
mysql> select @@binlog_expire_logs_seconds;
mysql> PURGE BINARY LOGS TO 'binlog.000010';
mysql> reset master;
4.4 binlog2sql 閃回DML操做
yum install python3
pip3 install -r requirements.txt
pip3 show pymysql
pip3 install --upgrade PyMySQL
a. 單獨過濾某張表的binlog
[root@db01 binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.51 -P3306 -uroot -p123 -d binlog -t t1 --start-file='binlog.000001'
INSERT INTO test1
.t1
(id
) VALUES (1); #start 1647 end 1891 time 2020-09-18 08:46:53 gtid
INSERT INTO test1
.t1
(id
) VALUES (2); #start 1922 end 2166 time 2020-09-18 08:46:54 gtid
INSERT INTO test1
.t1
(id
) VALUES (3); #start 3125 end 3369 time 2020-09-18 08:47:50 gtid
INSERT INTO test1
.t1
(id
) VALUES (4); #start 3400 end 3644 time 2020-09-18 08:47:53 gtid
b. 單獨過濾某些類型的binlog
[root@db01 binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.51 -P3306 -uroot -p123 -d test1 -t t1 --sql-type=delete --start-file='mysql-bin.000003'
DELETE FROM test1
.t1
WHERE id
=3 LIMIT 1; #start 5172 end 5416 time 2020-09-18 09:17:48 gtid
[root@db01 binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.51 -P3306 -uroot -p123 -d test1 -t t1 --sql-type=update --start-file='mysql-bin.000003'
UPDATE test1
.t1
SET id
=10 WHERE id
=1 LIMIT 1; #start 4882 end 5141 time 2020-09-18 09:17:35 gtid
[root@db01 binlog2sql-master]# python3 binlog2sql.py -h 10.0.0.51 -P3306 -uroot -p123 -d test1 -t t1 --sql-type=insert --start-file='mysql-bin.000003'
INSERT INTO test1
.t1
(id
) VALUES (1); #start 1647 end 1891 time 2020-09-18 08:46:53 gtid
INSERT INTO test1
.t1
(id
) VALUES (2); #start 1922 end 2166 time 2020-09-18 08:46:54 gtid
INSERT INTO test1
.t1
(id
) VALUES (3); #start 3125 end 3369 time 2020-09-18 08:47:50 gtid
INSERT INTO test1
.t1
(id
) VALUES (4); #start 3400 end 3644 time 2020-09-18 08:47:53 gtid
[root@db01 binlog2sql-master]#
c. 生成指定事件回滾語句
應用場景: 3000萬數據,誤刪10行數據,怎麼恢復?
[root@db01 binlog2sql]# python3 binlog2sql.py -h 10.0.0.51 -P3306 -uroot -p123 -d test -t t1 --start-file='mysql-bin.000003' --sql-type=delete --start-position=932 --stop-position=1198 -B
[root@db01 binlog2sql]# python3 binlog2sql.py -h 10.0.0.51 -P3306 -uroot -p123 -d test -t t1 --start-file='mysql-bin.000003' --sql-type=delete --start-position=932 --stop-position=1198 -B>/tmp/flashback.sql
1.1 介紹
邏輯備份工具.備份的是SQL語句(Create database create table insert into)
比較適合於: 數據量小,大表比較少情景下使用.
1.2 使用
(1) 鏈接參數
-u -p -h -P -S ...
(2) -A 全備參數
mysqldump -uroot -p123 -S /tmp/mysql.sock -A >/tmp/full.sql
(3) -B 單庫\多庫備份
mysqldump -uroot -p123 -S /tmp/mysql.sock -B oldguo test >/tmp/db.sql
(4) 單表多表備份
mysqldump -uroot -p123 -S /tmp/mysql.sock world city country >/tmp/tb.sql
(5) --master-data=2
1. 自動記錄備份時binlog name pos 2. FTWRL(flush table with read lock)
(6) --single-transaction
基於一致性快照備份InnoDB的數據行.
(7) -R -E --triggers 特殊對象備份
source /tmp/full.sql
2.1 介紹
物理備份工具.拷貝表空間數據文件. 在備份同時,產生的新的數據變化經過redo的方式備份走.
恢復時,須要先將備份進行prepare(CR--->redo undo),而後進行恢復.
自帶增量備份功能.
2.2 安裝
8.0.18之後版本,須要使用 pxb 8.0.13 版本.
yum install percona-xtrabackup*.rpm 注意: 對於MySQL 8.0.20版本,須要使用PXB 8.0.12+以上版本,MysQL:8.0.11 ~ 8.0.19 使用PXB 8.0正式版本。 MySQL 8.0 以前(5.6,5.7 )的版本: PXB 2.4
2.3 全量備份
1.全量備份 xtrabackup --defaults-file=/etc/my.cnf --host=10.0.0.51 --user=root --password=123 --port=3306 --backup --target-dir=/data/backup/full 2.數據恢復: 2.0 搞破壞 [root@db01 ~]# pkill mysqld [root@db01 ~]# \rm -rf /data/3306/data/* [root@db01 ~]# \rm -rf /data/3306/logs/* [root@db01 ~]# \rm -rf /data/3306/binlog/* 2.1 準備: xtrabackup --prepare --target-dir=/data/backup/full 說明: 模擬CR過程,將redo前滾,undo回滾,讓備份數據是一致狀態 2.2 拷回數據: xtrabackup --copy-back --target-dir=/data/backup/full 2.3 修改權限並啓動數據庫 [root@db01 data]# chown -R mysql.mysql /data/* [root@db01 data]# /etc/init.d/mysqld start
2.4 增量備份
**介紹 **
增量備份,是基於上一次備份LSN變化過的數據頁進行備份,在備份同時產生的新變動,會將redo備份。
第一次增量是依賴於全備的。未來的恢復也要合併到全備中,再進行統一恢復。
增量備份演練 全量備份的目錄爲: mkdir -p /data/backup/full 增量備份的目錄爲: mkdir -p /data/backup/inc 1.備份操做: 1.1.全量備份: xtrabackup --defaults-file=/etc/my.cnf --host=10.0.0.51 --user=root --password=123 --port=3306 --backup --parallel=4 --target-dir=/data/backup/full mysql> create database pxb; mysql> use pxb mysql> create table t1 (id int); mysql> insert into t1 values(1),(2),(3); mysql> commit; 增量備份: xtrabackup --defaults-file=/etc/my.cnf --host=10.0.0.51 --user=root --password=123 --port=3306 --backup --parallel=4 --target-dir=/data/backup/inc --incremental-basedir=/data/backup/full # 模擬損壞 [root@db01 ~]# pkill mysqld [root@db01 ~]# rm -rf /data/3306/data/* [root@db01 ~]# rm -rf /data/3306/logs/* [root@db01 ~]# rm -rf /data/3306/binlog/* 恢復操做: 2.1 準備全備份的日誌: xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full 2.2 準備增量備份的日誌: xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full --incremental-dir=/data/backup/inc 全備份準備: # xtrabackup --prepare --target-dir=/data/backup/full 拷回數據: xtrabackup --copy-back --target-dir=/data/backup/full 修改數據目錄的權限和屬性: chown -R mysql:mysql /data/* 3. clone plugin
8.0.17版本出現的功能.
本地克隆:
啓動克隆操做的MySQL服務器實例中的數據,克隆到同服務器或同節點上的一個目錄裏
遠程克隆:
默認狀況下,遠程克隆操做會刪除接受者(recipient)數據目錄中的數據,並將其替換爲捐贈者(donor)的克隆數據。您也能夠將數據克隆到接受者的其餘目錄,以免刪除現有數據。(可選)
原理
PAGE COPY
這裏有兩個動做
開啓redo archiving功能,從當前點開始存儲新增的redo log,這樣從當前點開始全部的增量修改都不會丟失。同時上一步在page track的page被髮送到目標端。確保當前點以前所作的變動必定發送到目標端。
關於redo archiving,實際上這是官方早就存在的功能,主要用於官方的企業級備份工具,但這裏clone利用了該特性來維持增量修改產生的redo。
在開始前會作一次checkpoint, 開啓一個後臺線程log_archiver_thread()來作日誌歸檔。當有新的寫入時(notify_about_advanced_write_lsn)也會通知他去archive。當arch_log_sys處於活躍狀態時,他會控制日誌寫入以免未歸檔的日誌被覆蓋(log_writer_wait_on_archiver), 注意若是log_writer等待時間過長的話, archive任務會被中斷掉.
Redo Copy
中止Redo Archiving", 全部歸檔的日誌被髮送到目標端,這些日誌包含了從page copy階段開始到如今的全部日誌,另外可能還須要記下當前的複製點,例如最後一個事務提交時的binlog位點或者gtid信息,在系統頁中能夠找到。
Done
目標端重啓實例,經過crash recovery將redo log應用上去。
*官方文檔列出的一些限制:
The clone plugin is subject to these limitations:
InnoDB
. Other storage engine data is not cloned.4.1 本地
4.1.1 加載插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
或
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT
SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'clone';
4.1.2 建立克隆專用用戶
CREATE USER clone_user@'%' IDENTIFIED by 'password';
GRANT BACKUP_ADMIN ON . TO 'clone_user';
BACKUP_ADMIN是MySQL8.0 纔有的備份鎖的權限
4.1.3 本地克隆
[root@db01 3306]# mkdir -p /data/test/
[root@db01 3306]# chown -R mysql.mysql /data/
mysql -uclone_user -ppassword
CLONE LOCAL DATA DIRECTORY = '/data/test/clonedir';
觀測狀態
db01 [(none)]> SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
+-----------+-------------+----------------------------+
| STAGE | STATE | END_TIME |
+-----------+-------------+----------------------------+
| DROP DATA | Completed | 2020-04-20 21:13:19.264003 |
| FILE COPY | Completed | 2020-04-20 21:13:20.025444 |
| PAGE COPY | Completed | 2020-04-20 21:13:20.028552 |
| REDO COPY | Completed | 2020-04-20 21:13:20.030042 |
| FILE SYNC | Completed | 2020-04-20 21:13:20.439444 |
| RESTART | Not Started | NULL |
| RECOVERY | Not Started | NULL |
+-----------+-------------+----------------------------+
7 rows in set (0.00 sec)
日誌觀測:
set global log_error_verbosity=3;
tail -f db01.err
CLONE LOCAL DATA DIRECTORY = '/data/test/3308';
4.1.4 啓動新實例
[root@db01 clonedir]# mysqld_safe --datadir=/data/test/clonedir --port=3333 --socket=/tmp/mysql3333.sock --user=mysql --mysqlx=OFF &
4.2 遠程clone
**4.2.1 做用 **
a. 遠程的快速熱遷移。
b. 快速建立複製關係
4.2.2 環境準備
a. 克隆1臺虛擬機db02
b. 捐贈者: db01 接受者: db02
c. 接收者(db02),搭建空的數據庫實例。
pkill mysqld
\rm -rf /data/3306/data/*
\rm -rf /data/3306/binlog/*
\rm -rf /data/3306/logs/*
mysqld --initialize-insecure --user=mysql --basedir=/user/local/mysql --datadir=/data/3306/data
/etc/init.d/mysqld restart
4.2.3 加載各個節點插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
或
[mysqld]
plugin-load-add=mysql_clone.so
clone=FORCE_PLUS_PERMANENT
SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'clone';
4.2.4 建立遠程clone用戶
捐贈者受權(db01)
create user test_jz@'%' identified by '123';
grant backup_admin on . to test_jz@'%';
接受者受權(db02)
create user test_js@'%' identified by '123';
grant clone_admin on . to test_js@'%';
4.2.5 遠程clone(db02)
開始克隆
mysql -e "SET GLOBAL clone_valid_donor_list='10.0.0.51:3306';" mysql -utest_js -p123 -h10.0.0.52 -P3306 -e "CLONE INSTANCE FROM test_jz@'10.0.0.51':3306 IDENTIFIED BY '123';"