linux 安装mysql8_MySQL 8.0与MariaDB 10.4,谁更易于填坑补锅?
作者介紹
賀春旸,凡普金科DBA團(tuán)隊(duì)負(fù)責(zé)人,《MySQL管理之道:性能調(diào)優(yōu)、高可用與監(jiān)控》第一、二版作者,曾任職于中國(guó)移動(dòng)飛信、安卓機(jī)鋒網(wǎng)。致力于MariaDB、MongoDB等開源技術(shù)的研究,主要負(fù)責(zé)數(shù)據(jù)庫(kù)性能調(diào)優(yōu)、監(jiān)控和架構(gòu)設(shè)計(jì)。
本文我將列舉一些MySQL 8.0和MariaDB 10.4關(guān)鍵新特性的對(duì)比,以便大家在今后的數(shù)據(jù)庫(kù)版本升級(jí)維護(hù)中能根據(jù)自身情況更快更好地做出選擇,其他新特性請(qǐng)參考官網(wǎng):
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html
https://mariadb.com/kb/en/library/changes-improvements-in-mariadb-104/
一、身份認(rèn)證插件改變
MySQL 8.0開始將caching_sha2_password作為默認(rèn)的身份驗(yàn)證插件。如果你升級(jí)了數(shù)據(jù)庫(kù)至8.0版本,對(duì)應(yīng)用程序jdbc驅(qū)動(dòng)兼容性不友好,讓應(yīng)用程序跑起來(lái)最快的方法需要將默認(rèn)的caching_sha2_password改為之前的mysql_native_password。
例:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password? BY 'password';
或者直接寫死在my.cnf,重啟mysqld服務(wù)永久生效。
[mysqld]
default_authentication_plugin = mysql_native_password
(注:推薦用這種方法,方便快捷)
MariaDB 10.4身份驗(yàn)證插件仍為mysql_native_password,沒(méi)有發(fā)生改變。
二、增加身份驗(yàn)證插件 - Unix Socket
unix_socket認(rèn)證插件允許用戶通過(guò)本地Unix套接字文件連接到MariaDB的時(shí)候使用操作系統(tǒng)的憑證。
通俗的講就是用Linux操作系統(tǒng)的賬號(hào),去登錄MariaDB/MySQL數(shù)據(jù)庫(kù)。
這個(gè)功能是在MariaDB 10.4.6版本里添加的,目前也支持在MySQL 8.0.18版本中。
1)MySQL 8.0.18使用方法
① 安裝插件
mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Query OK, 0 rows affected (0.01 sec)
② 創(chuàng)建數(shù)據(jù)庫(kù)賬號(hào)hechunyang
mysql> CREATE USER 'hechunyang'@'localhost' IDENTIFIED WITH auth_socket;
Query OK, 0 rows affected (0.00 sec)
③ 創(chuàng)建操作系統(tǒng)賬號(hào)hechunyang
# useradd hechunyang
# passwd hechunyang
以hechunyang用戶登錄操作系統(tǒng)。
④ 登錄MySQL 8.0.18
[root@localhost soft]# su - hechunyang
Last login: Fri Nov? 8 16:40:53 CST 2019>[hechunyang@localhost ~]$
?[hechunyang@localhost ~]$ /usr/local/mysql/bin/mysql -S /tmp/mysql_hcy.sock -uhechunyang -e "select version();"
+-----------+
| version() |
+-----------+
| 8.0.18? ? |
+-----------+
[hechunyang@localhost ~]$
在此示例中,用戶hechunyang已登錄操作系統(tǒng)并具有完全shell訪問(wèn)權(quán)限。他已經(jīng)使用操作系統(tǒng)進(jìn)行了身份驗(yàn)證,并且他的MySQL帳戶已配置為使用unix_socket身份驗(yàn)證插件,因此他無(wú)需再次對(duì)數(shù)據(jù)庫(kù)進(jìn)行身份驗(yàn)證。MySQL接受他的操作系統(tǒng)憑證并允許他連接。
2)MariaDB 10.4.10使用方法
① 創(chuàng)建數(shù)據(jù)庫(kù)賬號(hào)hechunyang
MariaDB [(none)]> GRANT ALL ON *.* TO 'hechunyang' IDENTIFIED VIA unix_socket;
Query OK, 0 rows affected (0.001 sec)
后續(xù)操作和MySQL 8.0.18一樣。
InnoDB一、數(shù)據(jù)字典改進(jìn)支持原子DDL(atomic DDL)
MySQL 8.0使用新的數(shù)據(jù)字典,廢棄了MyISAM系統(tǒng)表。MySQL庫(kù)元信息存儲(chǔ)在數(shù)據(jù)目錄中mysql.ibd的innodb表空間文件中(.frm表結(jié)構(gòu)信息文件移除)。
新的數(shù)據(jù)字典支持原子DDL(atomic DDL)功能,這意味著,當(dāng)執(zhí)行DDL時(shí),數(shù)據(jù)字典更新、存儲(chǔ)引擎操作和二進(jìn)制日志中的寫入被組合成一個(gè)要么完全執(zhí)行、要么不執(zhí)行的單個(gè)原子事務(wù)。這提供了更好的可靠性,未完成的DDL不會(huì)留下任何不完整的數(shù)據(jù)。
比如當(dāng)對(duì)大表做alter table modify變更時(shí),kill -9 mysqld進(jìn)程,在MySQL8.0之前的版本會(huì)留下臨時(shí)數(shù)據(jù)文件(例#sql-22a4_17.ibd),而在MySQL 8.0版本里將直接回滾掉。
二、instant ADD COLUMN億級(jí)大表毫秒級(jí)加字段
加字段是痛苦的,需要對(duì)表進(jìn)行重建,尤其是對(duì)億級(jí)別的大表,雖然Online DDL可以避免鎖表,但如果在主庫(kù)上執(zhí)行耗時(shí)30分鐘,那么再?gòu)?fù)制到從庫(kù)上執(zhí)行,主從復(fù)制就出現(xiàn)延遲。使用instant ADD COLUMN特性(只需要修改元數(shù)據(jù)),彈下煙灰的時(shí)間,字段就加好了,享受MongoDB那樣的非結(jié)構(gòu)化存儲(chǔ)的靈活方便。
限制
1)如果指定了AFTER,字段必須是在最后一列,否則會(huì)重新建立表。
(注:MariaDB 10.4支持加字段在任何位置上使用algorithm=instant算法)
2)不適用于ROW_FORMAT = COMPRESSED
3)DROP COLUMN需要重建表。
(注:MariaDB 10.4支持對(duì)DROP刪除字段使用algorithm=instant算法)
三、安全執(zhí)行Online DDL
Online DDL從名字上看很容易誤導(dǎo)新手,以為不論什么情況,修改表結(jié)構(gòu)都不會(huì)鎖表,理想很豐滿,現(xiàn)實(shí)很骨感,注意這個(gè)坑!
有以下兩種情況執(zhí)行DDL操作會(huì)鎖表的,Waiting for table metadata lock(元數(shù)據(jù)表鎖)
1)增加、刪除字段或索引不會(huì)鎖全表,刪除主鍵、更改字段屬性會(huì)鎖全表。
2)在添加字段alter table表時(shí),對(duì)該表的增、刪、改、查均不會(huì)鎖表。而在這之前,該表有被訪問(wèn)時(shí),需要等其執(zhí)行完畢后,才可以執(zhí)行alter table,例如在會(huì)話一,故意執(zhí)行一條大結(jié)果的查詢,然后在會(huì)話二執(zhí)行增加字段age,此時(shí)還會(huì)出現(xiàn)表鎖。
針對(duì)第二種情況,MariaDB 10.3 增補(bǔ)AliSQL補(bǔ)丁-DDL FAST FAIL,讓其DDL操作快速失敗。
語(yǔ)法為:
ALTER TABLE tbl_name [WAIT n|NOWAIT] ...
CREATE ... INDEX ON tbl_name (index_col_name, ...) [WAIT n|NOWAIT] ...
DROP INDEX ... [WAIT n|NOWAIT]
DROP TABLE tbl_name [WAIT n|NOWAIT] ...
LOCK TABLE ... [WAIT n|NOWAIT]
OPTIMIZE TABLE tbl_name [WAIT n|NOWAIT]
RENAME TABLE tbl_name [WAIT n|NOWAIT] ...
SELECT ... FOR UPDATE [WAIT n|NOWAIT]
SELECT ... LOCK IN SHARE MODE [WAIT n|NOWAIT]
TRUNCATE TABLE tbl_name [WAIT n|NOWAIT]
如果線上有某個(gè)慢SQL對(duì)該表進(jìn)行操作,可以使用WAIT n(以秒為單位設(shè)置等待)或NOWAIT在語(yǔ)句中顯式設(shè)置鎖等待超時(shí),在這種情況下,如果無(wú)法獲取鎖,語(yǔ)句將立即失敗。WAIT 0相當(dāng)于NOWAIT。
(注:MySQL 8.0目前不支持ALTER NOWAIT,僅僅支持SELECT FOR UPDATE NOWAIT)
四、clone克隆插件
從MySQL 8.0.17開始,MySQL提供了一個(gè)克隆插件,可以方便我們快速克隆出一個(gè)從庫(kù)或者M(jìn)GR的Secondary節(jié)點(diǎn)。
1)克隆插件的安裝和驗(yàn)證過(guò)程
① 安裝克隆插件
mysql> INSTALL PLUGIN CLONE SONAME 'mysql_clone.so';?
② 檢查克隆插件是否處于活動(dòng)狀態(tài)
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS? FROM?
INFORMATION_SCHEMA.PLUGINS? WHERE? PLUGIN_NAME? LIKE? 'clone';
+-----------------------+--------------------------+
| PLUGIN_NAME? | PLUGIN_STATUS? |
+-----------------------+--------------------------+
| clone? ? ? ? ? ? | ACTIVE? ? ? ? ? |
+-----------------------+--------------------------+
1 row in set (0.00 sec)
③ 創(chuàng)建clone克隆賬號(hào)權(quán)限(所有節(jié)點(diǎn)都執(zhí)行)
CREATE USER 'clone_user'@'%' IDENTIFIED BY '123456';
GRANT BACKUP_ADMIN,CLONE_ADMIN ON *.* TO 'clone_user'@'%';
2)克隆過(guò)程
① 設(shè)置提供數(shù)據(jù)的節(jié)點(diǎn)(捐贈(zèng)者)
set global clone_valid_donor_list = '192.168.137.11:3306';
② 開始從遠(yuǎn)程MySQL(捐贈(zèng)者)克隆數(shù)據(jù)并將其傳輸?shù)疆?dāng)前的MySQL實(shí)例
CLONE INSTANCE FROM clone_user@192.168.137.11:3306 IDENTIFIED BY '123456';
③ 完成克隆后,新節(jié)點(diǎn)mysqld進(jìn)程會(huì)自動(dòng)重啟(原有數(shù)據(jù)會(huì)被自動(dòng)刪除)
④ 狀態(tài)查看
select * from performance_schema.clone_status;
select * from performance_schema.clone_progress;
⑤ 開啟復(fù)制
CHANGE MASTER TO MASTER_HOST = '192.168.137.11', MASTER_PORT =?
3306,MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_AUTO_POSITION = 1;
start slave;
局限性
僅支持InnoDB存儲(chǔ)引擎。
TRUNCATE TABLE在克隆期間為禁止?fàn)顟B(tài)。
如果DDL正在運(yùn)行,則克隆操作將等待其執(zhí)行完才能進(jìn)行。
(注:MariaDB 10.4不支持clone克隆功能)
General Features一、MariaDB 10.3支持自動(dòng)KILL掉未提交的空閑事務(wù)
參數(shù)innodb_kill_idle_transaction(這個(gè)是Percona XtraDB引用的參數(shù)),意思為當(dāng)一個(gè)事務(wù)長(zhǎng)時(shí)間未提交,那么這個(gè)連接就不能關(guān)閉,內(nèi)存就不釋放,并發(fā)一大,導(dǎo)致DB連接數(shù)增多,就會(huì)對(duì)性能產(chǎn)生影響。
默認(rèn)是0秒,你可以根據(jù)自己的情況設(shè)定閾值。超過(guò)這個(gè)閾值,服務(wù)端自動(dòng)殺死未提交的空閑事務(wù)。
MariaDB在10.2.6版本里將其移除,因不再捆綁Percona XtraDB,分道揚(yáng)鑣。
MariaDB在10.3版本里,增加了3個(gè)參數(shù),對(duì)標(biāo)Percona的功能。
idle_transaction_timeout(所有的事務(wù))
idle_write_transaction_timeout(寫事務(wù))
idle_readonly_transaction_timeout(只讀事務(wù))
單位為秒。設(shè)置這個(gè)參數(shù)后只針對(duì)新的連接有效,正在執(zhí)行的連接無(wú)效。
(注:Oralce MySQL 8.0不支持該功能)
二、MariaDB 10.3 系統(tǒng)版本表有效防止數(shù)據(jù)丟失
系統(tǒng)版本表是SQL:2011標(biāo)準(zhǔn)中首次引入的功能,它存儲(chǔ)所有更改的歷史數(shù)據(jù),而不僅僅是當(dāng)前時(shí)刻有效的數(shù)據(jù)。
舉個(gè)例子,同一行數(shù)據(jù)一秒內(nèi)被更改了10次,那么系統(tǒng)版本表就會(huì)保存10份不同時(shí)間的版本數(shù)據(jù)。就像電影《源代碼》里的平行世界理論一樣,你可以退回任意時(shí)間里,從而有效保障你的數(shù)據(jù)是安全的。也就是說(shuō),DBA手抖或是程序BUG引起的數(shù)據(jù)丟失,在MariaDB 10.3里已然成為過(guò)去。
具體操作詳見:https://dbaplus.cn/news-11-2057-1.html
三、MariaDB 10.3支持update多表ORDER BY and LIMIT
1)update連表更新,limit語(yǔ)句
update t1 join t2 on t1.id=t2.id set t1.name='hechunyang' limit 3;
2)update連表更新,ORDER BY and LIMIT語(yǔ)句
update t1 join t2 on t1.id=t2.id set t1.name='hechunyang' order by t1.id DESC limit 3;
MySQL 8.0 直接報(bào)錯(cuò)
ERROR 1221 (HY000): Incorrect usage of UPDATE and LIMIT
四、MariaDB 10.3 解決掉了UPDATE不支持同一張表的子查詢更新
案例:
CREATE TABLE t1 (c1 INT, c2 INT);
INSERT INTO t1 VALUES (10,10), (20,20);
UPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);
MySQL 8.0 直接報(bào)錯(cuò):
ERROR 1093 (HY000): You can't specify target table 't1' for update in FROM clause
MySQL目前只能改寫SQL實(shí)現(xiàn),即max那條語(yǔ)句讓其產(chǎn)生衍生表就可以通過(guò):
UPDATE t1 a, (SELECT MAX(c2) as m_c2 FROM t1) as b SET a.c1=a.c1+1 WHERE a.c2=b.m_c2;
五、MySQL 8.0解決Too many connections數(shù)據(jù)庫(kù)連接數(shù)被打滿
其實(shí)這個(gè)功能,MySQL增加的著實(shí)太晚了。在MariaDB 10.0和Percona5.6版本中,有個(gè)參數(shù)extra_port可以登錄“后門”解決。
在MySQL 8.0版本中,有個(gè)類似的參數(shù)實(shí)現(xiàn)了該功能。
admin_address? =? ?127.0.0.1
admin_port? ? =? ? 13308
create_admin_listener_thread? ?=? ?ON
只需要指定13308端口號(hào),就可以連接了。
(注:不支持動(dòng)態(tài)修改,要寫死在my.cnf配置文件里重啟mysqld進(jìn)程生效)
六、MariaDB FLUSH TABLES命令只關(guān)閉未使用的表
會(huì)話一
select id,sleep(60) from t1;
因未執(zhí)行完,t1表持有METADATA LOCK(MDL)元數(shù)據(jù)鎖。
會(huì)話二
FLUSH TABLES;
在MariaDB 10.4 版本以前,執(zhí)行FLUSH TABLES會(huì)把所有的表強(qiáng)制關(guān)閉,因會(huì)話一持有MDL元數(shù)據(jù)鎖,固FLUSH TABLES會(huì)等待Waiting for table metadata lock。
在MariaDB 10.4 GA版本,將只關(guān)閉未使用的表,正在使用中的表忽略不受影響。(除非你手工指定表,如FLUSH TABLES t1,將會(huì)強(qiáng)制關(guān)閉t1表)
場(chǎng)景:MHA在線切換調(diào)用master_ip_online_change腳本時(shí),第一步會(huì)執(zhí)行FLUSH NO_WRITE_TO_BINLOG TABLES關(guān)閉所有表,此時(shí)如果你的數(shù)據(jù)庫(kù)有未執(zhí)行完的慢SQL,FLUSH NO_WRITE_TO_BINLOG TABLES就會(huì)卡住,導(dǎo)致無(wú)法切換。
(注:MySQL 8.0.18版本不支持該功能)
Optimizer一、Descending Index降序索引
MySQL 8.0開始支持降序索引(InnoDB引擎)。可以直接定義索引為DESC,這樣在存儲(chǔ)的時(shí)候就是降序的,在降序掃描時(shí)會(huì)大幅度提升性能。當(dāng)然,最大的好處是我們可以用索引處理 order by a desc ,b asc,c desc混合排序的查詢了,在之前的版本,排序的字段順序必須一致,否則使用不到索引,explain的結(jié)果中會(huì)出現(xiàn)filesort。
CREATE TABLE t1 (a INT PRIMARY KEY, b INT, KEY a_idx(a DESC, b ASC));
(注:MariaDB 10.4不支持該功能)
二、MySQL 8.0.18 Hash Join不支持left/right join左右連接
在MySQL 8.0.18中,增加了Hash Join新功能,它適用于未創(chuàng)建索引的字段,做等值關(guān)聯(lián)查詢。在之前的版本里,如果連接的字段沒(méi)有創(chuàng)建索引,查詢速度會(huì)是非常慢的,優(yōu)化器會(huì)采用BNL(塊嵌套)算法。
Hash Join算法是把一張小表數(shù)據(jù)存儲(chǔ)到內(nèi)存中的哈希表里,并逐行去匹配大表中的數(shù)據(jù),計(jì)算哈希值并把符合條件的數(shù)據(jù),從內(nèi)存中返回客戶端。
我們用explain format=tree命令可以查看到已經(jīng)使用到hash join算法。
但目前8.0.18版本,僅支持join。left join和right join失效,explain執(zhí)行計(jì)劃會(huì)顯示,這里請(qǐng)注意。
(注:MariaDB 10.4不支持該功能)
三、Explain Analyze在MySQL 8.0.18版本中的擴(kuò)展使用
在之前的版本里,我們是用explain命令來(lái)查看SQL的具體執(zhí)行計(jì)劃。在MySQL 8.0.18版本里新增了explain擴(kuò)展,一個(gè)是explain format=tree,另一個(gè)是基于explain format=tree延伸擴(kuò)展的Explain Analyze,今天我們查看下該命令是怎樣執(zhí)行的。
測(cè)試用例:
explain analyze select count(*) from sbtest1;
這個(gè)結(jié)果很讓人奇怪,不加where條件,啥都不能顯示出來(lái),貌似是個(gè)BUG?
加個(gè)where id>0再試試。
explain analyze select count(*) from sbtest1 where id>0;
注意看紅色劃線部分,它內(nèi)部會(huì)運(yùn)行查詢并測(cè)量執(zhí)行時(shí)間。
含義解釋:
1) cost部分的rows=4932000,是和explain生成的結(jié)果一致,都是估算讀取的行數(shù)。
2)actual部分的rows=1000000,是執(zhí)行這條SQL返回的真正結(jié)果,見如下圖所示。
3)actual time=5504.446(單位ms毫秒),轉(zhuǎn)換為秒是這條SQL執(zhí)行的時(shí)間為5.5秒,但其實(shí)是有很大的誤差的,你看上面的執(zhí)行時(shí)間0.24秒,誤差很大,因此我們不能真正相信這些數(shù)字。
MariaDB 10.4也實(shí)現(xiàn)了類似的功能,需要開啟優(yōu)化器跟蹤,命令如下:
SET optimizer_trace='enabled=on';
然后查看select * from information_schema.optimizer_trace表即可。
四、MySQL 8.0資源組有效解決慢SQL引發(fā)CPU告警
資源組的作用是資源隔離(你可以理解為開通云主機(jī)時(shí)勾選的硬件配置),將線上的慢SQL線程id分配給CPU一個(gè)核,讓它慢慢跑,從而不影響CPU整體性能。
創(chuàng)建一個(gè)資源組
mysql> create resource group slowsql_rg type=user vcpu=3?
thread_priority=19 enable;
slowsql_rg為資源組名字
type=user 來(lái)源是用戶端的慢SQL
vcpu=3 給它分配到哪個(gè)CPU核上(你可以用cat /proc/cpuinfo? | grep processor查看CPU有多少核)
thread_priority為優(yōu)先級(jí)別,范圍是0到19,19是最低優(yōu)先級(jí),0是最高優(yōu)先級(jí)。
查看資源組信息:
mysql> select * from information_schema.resource_groups;
查找慢SQL的線程ID:
SELECT THREAD_ID,PROCESSLIST_INFO,RESOURCE_GROUP,PROCESSLIST_TIME FROM?
performance_schema.threads WHERE PROCESSLIST_INFO REGEXP?
'SELECT|INSERT|UPDATE|DELETE|ALTER' AND PROCESSLIST_TIME > 10;
把THREAD_ID取出來(lái)的值,放入資源組里做限制:
set resource group slowsql_rg for 379;
比如你想放寬的限制,也可以更改:
ALTER RESOURCE GROUP slowsql_rg VCPU = 3?
THREAD_PRIORITY = 0;
關(guān)閉資源組,解除限制:
ALTER RESOURCE GROUP slowsql_rg DISABLE FORCE;
(注:MariaDB 10.4不支持該功能)
五、Query Rewrite支持SELECT INSERT UPDETE DELETE REPLACE語(yǔ)句重寫
這個(gè)功能要點(diǎn)贊,比如開發(fā)上線時(shí),有個(gè)SQL查詢字段索引忘記加了,直接把線上CPU打滿,此時(shí),你可以將SQL重寫,讓業(yè)務(wù)先報(bào)錯(cuò),別打死數(shù)據(jù)庫(kù),然后馬上通知開發(fā)回滾,等加完索引后再上線。
安裝插件:
mysql -S /tmp/mysql_hcy.sock -p123456 <.>
查看是否生效:
SHOW GLOBAL VARIABLES LIKE 'rewriter_enabled';
編寫重寫規(guī)則:
insert into query_rewrite.rewrite_rules(pattern, replacement,?
pattern_database) values (
"SELECT * from sbtest1 limit ?",
"SELECT k,c from sbtest1 limit ?",
"test");
意思為將以下語(yǔ)句:
SELECT * from sbtest1 limit ?;
改寫成:
SELECT k,c from sbtest1 limit ?;
(注:問(wèn)號(hào)?為變量)
執(zhí)行規(guī)則生效:
CALL query_rewrite.flush_rewrite_rules();
演示:
mysql> SELECT * from sbtest1 limit 1\G;
*************************** 1. row ***************************
k: 499284
c: 83868641912-28773972837-60736120486-75162659906-27563526494-20381887404-41576422241-93426793964-56405065102-33518432330
1 row in set, 1 warning (0.00 sec)
ERROR:?
No query specified
mysql> show warnings\G
*************************** 1. row ***************************
? Level: Note
? ?Code: 1105
Message: Query 'SELECT * from sbtest1 limit 1' rewritten to 'SELECT k,c from sbtest1 limit 1' by a query rewrite plugin
1 row in set (0.00 sec)
(注:MariaDB 10.4不支持該功能)
Backup一、Percona Xtrabackup 8.0備份MySQL 8.0
隨著Percona XtraBackup 8.0的推出,Percona XtraBackup 2.4將繼續(xù)支持MySQL和Percona Server 5.6和5.7數(shù)據(jù)庫(kù)。
由于MySQL 8.0在數(shù)據(jù)字典,重做日志和撤消日志中引入的更改與以前的版本不兼容,因此Percona XtraBackup 8.0 目前不支持8.0之前的版本。
1)備份
# xtrabackup --defaults-file=/etc/my_hechunyang.cnf -S /tmp/mysql_hechunyang.sock?
--user='root' --password='123456' --slave-info --backup?
--compress --compress-threads=4 --target-dir=/data/bak/
(注:compress是開啟壓縮模式;compress-threads是開啟壓縮模式線程數(shù))
壓縮模式需要先安裝Percona自研的qpress壓縮工具。
# yum install? https://repo.percona.com/yum/percona-release-latest.noarch.rpm??
# yum install qpress -y
2)解壓縮
# for bf in `find . -iname "*\.qp"`; do qpress -d $bf $(dirname $bf) && rm -f $bf; done
3)恢復(fù)備份期間增量數(shù)據(jù)(這一步類似innobackupex --apply-log)
# xtrabackup? --prepare --target-dir=/data/bak/
4)恢復(fù)
① 關(guān)閉mysqld進(jìn)程
② 確保datadir目錄為空,你可以把原目錄改個(gè)名字,再創(chuàng)建一個(gè)新的
③ 恢復(fù)
# xtrabackup --defaults-file=/etc/my_hechunyang.cnf --copy-back --target-dir=/data/bak/
④ 更改目錄屬性
# chown -R mysql:mysql /var/lib/mysql/
⑤ 啟動(dòng)mysqld進(jìn)程
二、MariaDB - Mariabackup熱備份工具
自MariaDB10.2.7(含)以上版本,不再支持使用Percona XtraBackup工具在線物理熱備份。
MariaDB 10.1引入了MariaDB獨(dú)有的功能,例如InnoDB頁(yè)面壓縮和靜態(tài)數(shù)據(jù)加密。這些獨(dú)家功能在MariaDB用戶中非常受歡迎。但是,來(lái)自MySQL生態(tài)系統(tǒng)的現(xiàn)有備份解決方案(如Percona XtraBackup)不支持這些功能的完全備份功能。
為了滿足用戶的需求,MariaDB官方?jīng)Q定開發(fā)一個(gè)完全支持MariaDB獨(dú)有功能的備份解決方案。它基于Percona XtraBackup 2.3.8版本改寫擴(kuò)展。
mariabackup工具使用(包含在二進(jìn)制tar包bin目錄下)
1)備份
shell> mariabackup --defaults-file=/etc/my.cnf -S /tmp/mysql3306.sock --backup --target-dir=/data/bak/ --user=root --password=123456
2)恢復(fù)備份期間增量數(shù)據(jù)(這一步類似innobackupex --apply-log)
shell> mariabackup --prepare --target-dir=/data/bak/
(注:/data/bak/xtrabackup_binlog_pos_innodb文件,記錄主庫(kù)show master status的POS點(diǎn))
3)恢復(fù)
步驟
① 關(guān)閉mysqld進(jìn)程
② 確保datadir目錄為空,你可以把原目錄改個(gè)名字,再創(chuàng)建一個(gè)新的
③恢復(fù)
# mariabackup --defaults-file=/etc/my.cnf --copy-back?
--target-dir=/data/bak/
④ 更改目錄屬性
# chown -R mysql:mysql /var/lib/mysql/
⑤ 啟動(dòng)mysqld進(jìn)程
如果你想在從庫(kù)上備份,并且想記錄從庫(kù)的show slave status的POS點(diǎn),以便后續(xù)再接一個(gè)從庫(kù),那么你可以這樣搞:
mariabackup --defaults-file=/etc/my.cnf -S /tmp/mysql3306.sock?
--backup --slave-info --safe-slave-backup --target-dir=/data/bak/?
--user=root --password=123456
(注:/data/bak/xtrabackup_slave_info文件,記錄從庫(kù)show slave status的POS點(diǎn))
總結(jié)
以上是生活随笔為你收集整理的linux 安装mysql8_MySQL 8.0与MariaDB 10.4,谁更易于填坑补锅?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: docker 挂载目录_Docker容器
- 下一篇: 中北大学计算机二级负责老师,导师信息#中