備份和恢復(fù)(數(shù)據(jù)):
備份:存儲(chǔ)的數(shù)據(jù)副本婚肆;
原始數(shù)據(jù):持續(xù)改變俊性;
恢復(fù):把副本應(yīng)用到線上系統(tǒng)锦爵;
僅能恢復(fù)至備份操作時(shí)刻的數(shù)據(jù)狀態(tài);
時(shí)間點(diǎn)恢復(fù):
binary logs;
為什么備份疾棵?
災(zāi)難恢復(fù):硬件故障(冗余)、軟件故障(bug)、自然災(zāi)害趋急、黑客攻擊顶伞、誤操作饵撑、...
測(cè)試;
備份時(shí)應(yīng)該注意事項(xiàng):
能容忍最多丟失多少數(shù)據(jù)唆貌;
恢復(fù)數(shù)據(jù)需要在多長(zhǎng)時(shí)間內(nèi)完成滑潘;
需要恢復(fù)哪些數(shù)據(jù);
做恢復(fù)演練:
測(cè)試備份的可用性锨咙;
增強(qiáng)恢復(fù)操作效率语卤;
...
備份類型:
備份的數(shù)據(jù)集的范圍:
完全備份和部分備份
完全備份:整個(gè)數(shù)據(jù)集;
部分備份:數(shù)據(jù)集的一部分酪刀,比如部分表粹舵;
全量備份、增量備份骂倘、差異備份:
完全備份
增量備份:僅備份自上一次完全備份或 增量備份以來變量的那部數(shù)據(jù)眼滤;
差異備份:僅備份自上一次完全備份以來變量的那部數(shù)據(jù);缺點(diǎn):備份的數(shù)據(jù)量大稠茂,優(yōu)點(diǎn)恢復(fù)快
物理備份柠偶、邏輯備份:
物理備份:復(fù)制數(shù)據(jù)文件進(jìn)行的備份;不啟動(dòng)mysql的情況下
邏輯備份:從數(shù)據(jù)庫導(dǎo)出數(shù)據(jù)另存在一個(gè)或多個(gè)文件中睬关;啟動(dòng)mysql的情況下
能使用物理備份就不使用邏輯備份工具
根據(jù)數(shù)據(jù)服務(wù)是否在線:
熱備:讀寫操作均可進(jìn)行的狀態(tài)下所做的備份诱担;(可以使用主從復(fù)制,也就是說啟用一個(gè)從服務(wù)器电爹,使主從同步蔫仙,在需要備份的時(shí)候停下一個(gè)服務(wù)器進(jìn)行備份達(dá)到時(shí)間點(diǎn)相同,而不會(huì)出現(xiàn)時(shí)間點(diǎn)不同無法回復(fù)的情況)MYISAM不支持熱備丐箩、INNODB支持熱備
溫備:可讀但不可寫狀態(tài)下進(jìn)行的備份摇邦;
冷備:讀寫操作均不可進(jìn)行的狀態(tài)下所做的備份;
備份需要考慮因素:
鎖定資源多長(zhǎng)時(shí)間屎勘?
備份過程的時(shí)長(zhǎng)施籍?
備份時(shí)的服務(wù)器負(fù)載?
恢復(fù)過程的時(shí)長(zhǎng)概漱?
備份策略:
全量+差異 + binlogs
全量+增量 + binlogs
備份手段:物理丑慎、邏輯
備份什么?
數(shù)據(jù)
二進(jìn)制日志、InnoDB的事務(wù)日志竿裂;
代碼(存儲(chǔ)過程玉吁、存儲(chǔ)函數(shù)、觸發(fā)器腻异、事件調(diào)度器)
服務(wù)器的配置文件
備份工具:
mysqldump:mysql服務(wù)自帶的備份工具进副;邏輯備份工具;
完全悔常、部分備份影斑;
InnoDB:熱備;
MyISAM:溫備这嚣;
cp/tar
lvm2:快照(請(qǐng)求一個(gè)全局鎖)鸥昏,之后立即釋放鎖,達(dá)到幾乎熱備的效果姐帚;物理備份吏垮;
注意:不能僅備份數(shù)據(jù)文件;要同時(shí)備份事務(wù)日志罐旗;
前提:要求數(shù)據(jù)文件和事務(wù)日志位于同一個(gè)邏輯卷膳汪;
xtrabackup:
由Percona提供,開源工具九秀,支持對(duì)InnoDB做熱備遗嗽,物理備份工具;
完全備份鼓蜒、部分備份痹换;
完全備份、增量備份都弹;
完全備份娇豫、差異備份;
mysqlhotcopy:幾乎冷備
select:
備份:SELECT cluase INTO OUTFILE 'FILENAME';
恢復(fù):CREATE TABLE
導(dǎo)入:LOAD DATA
InnoBase:Innodb --> XtraDB, Innobackup --> Xtrabackup
備份策略:
xtrabackup:
全量+差異+binlog
全量+增量+binlog
mysqldump:
全量+binlog
mysqldump:
只能做一個(gè)庫的全量備份畅厢,或部分備份
邏輯備份工具:基于mysql客戶端協(xié)議
完全備份冯痢、部分備份;
InnoDB:熱備或溫備框杜;
MyISAM:溫備浦楣;
二次封裝工具:
mydumper
phpMyAdmin
Usage:
mysqldump [OPTIONS] database [tables] # 備份單庫,可以只備份其中的一部分表(部分備份)咪辱;
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] # 備份多庫振劳;
OR mysqldump [OPTIONS] --all-databases [OPTIONS] # 備份所有庫;
MyISAM存儲(chǔ)引擎:支持溫備油狂,備份時(shí)要鎖定表澎迎;
-x, --lock-all-tables:鎖定所有庫的所有表庐杨,讀鎖;
-l, --lock-tables:鎖定指定庫所有表夹供;
InnoDB存儲(chǔ)引擎:支持溫備和熱備;
--single-transaction:創(chuàng)建一個(gè)事務(wù)仁堪,基于此快照?qǐng)?zhí)行備份哮洽;
其它選項(xiàng):
-R, --routines:備份指定庫的存儲(chǔ)過程和存儲(chǔ)函數(shù);
--triggers:備份指定庫的觸發(fā)器弦聂;
-E, --events:
--master-data[=#]
1:記錄為CHANGE MASTER TO語句鸟辅,此語句不被注釋;
2:記錄為CHANGE MASTER TO語句莺葫,此語句被注釋匪凉;
--flush-logs:鎖定表完成后,即進(jìn)行日志刷新操作捺檬;
作業(yè):備份腳本
基于lvm2的備份:
前提:要求數(shù)據(jù)文件和事務(wù)日志位于同一個(gè)邏輯卷再层;
(1) 請(qǐng)求鎖定所有表;
mysql> FLUSH TABLES WITH READ LOCK;
(2) 記錄二進(jìn)制文件事件位置堡纬;
mysql> FLUSH LOGS;
mysql> SHOW MASTER STATUS;
mysql -e 'SHOW MASTER STATUS;' >> /PATH/TO/SOME_POS_FILE
(3) 創(chuàng)建快照卷
lvcreate -L # -s -p r - SNAM-NAME /dev/VG-NAME/LV-NAME
(4) 釋放鎖
mysql> UNLOCK TABLES
(5) 掛載快照卷聂受,并執(zhí)行備份,備份完成后刪除快照卷烤镐;
(6) 周期性備份二進(jìn)制日志蛋济;
Percona:
InnoDB --> XtraDB (mariadb)
Innobackup --> Xtrabackup
Xtrabackup:
MyISAM:溫備,不支持增量備份炮叶;
InnoDB:熱備碗旅,增量;
物理備份镜悉,速率快祟辟、可靠;備份完成后自動(dòng)校驗(yàn)備份結(jié)果集是否可用;還原速度快茴扁;
Usage: [innobackupex [--defaults-file=#] --backup | innobackupex [--defaults-file=#] --prepare] [OPTIONS]
The innobackupex tool is a Perl script that acts as a wrapper for the xtrabackup C program.
備份 --> 應(yīng)用日志 --> 還原
應(yīng)用日志:--apply-log
還原:--copy-back
完全備份:
完全+binlog(總結(jié)):
備份:innobackupex --user --password= --host= /PATH/TO/BACKUP_DIR
準(zhǔn)備:innobackupex --apply-log /PATH/TO/BACKUP_DIR
恢復(fù):innobackupex --copy-back
注意:--copy-back需要在mysqld主機(jī)本地進(jìn)行筋岛,mysqld服務(wù)不能啟動(dòng);
innodb_log_file_size可能要重新設(shè)定叮喳;
總結(jié):完全+增量+binlog
備份:完全+增量+增量+...
完全+差異
準(zhǔn)備:
innobackupex --apply-log --redo-only BASEDIR
innobackupex --apply-log --redo-only BASEDIR --incremental-dir=INCREMENTAL-DIR
恢復(fù):
innobackupex --copy-back BASEDIR
備份單庫:
--databases
注意:未盡的內(nèi)容,請(qǐng)參考官方文檔缰贝;
總結(jié):
mysqldump+binlog
lvm2+cp/tar+binlog
xtrabackup(innodb)+binlog
博客作業(yè):mysqldump和xtrabackup的使用(選作)馍悟;
MySQL Replication:
Master/Slave
Master: write/read
Slaves: read
為什么?
冗余:promte(提升為主)剩晴,異地災(zāi)備
人工
工具程序:MHA
擴(kuò)展:轉(zhuǎn)移一部分“讀”請(qǐng)求锣咒;
支援安全的備份操作侵状;
測(cè)試;
...
主/從架構(gòu):
異步復(fù)制:
一主多從毅整;
一從一主趣兄;
級(jí)聯(lián)復(fù)制;
循環(huán)復(fù)制悼嫉;
雙主復(fù)制艇潭;
半同步復(fù)制:
一從多主:
每個(gè)主服務(wù)器提供不同的數(shù)據(jù)庫;
配置:
時(shí)間同步戏蔑;
復(fù)制的開始位置:
從0開始蹋凝;
從備份中恢復(fù)到從節(jié)點(diǎn)后啟動(dòng)的復(fù)制,復(fù)制的起始點(diǎn)備份操作時(shí)主節(jié)點(diǎn)所處的日志文件及其事件位置总棵;
主從服務(wù)器mysqld程序版本不一致鳍寂?
從服務(wù)器的版本號(hào)高于主服務(wù)器的版本號(hào);
主服務(wù)器:
配置文件my.cnf
server_id=#
log_bin=log-bin
啟動(dòng)服務(wù):
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'USERNAME'@'HOST' IDENTIFIED BY 'YOUR_PASSWORD';
mysql> FLUSH PRIVILEGES;
從服務(wù)器:
配置文件my.cnf
server_id=#
relay_log=relay-log
read_only=ON
啟動(dòng)服務(wù):
mysql> CHANGE MASTER TO MASTER_HOST='HOST',MASTER_USER='USERNAME',MASTER_PASSWORD='YOUR_PASSWORD',MASTER_LOG_FILE='BINLOG',MASTER_LOG_POS=#;
mysql> START SLAVE [IO_THREAD|SQL_THREAD];
mysql> SHOW SLAVE STATUS;
課外作業(yè):基于SSL的復(fù)制的實(shí)現(xiàn)情龄;
主主復(fù)制:
互為主從:兩個(gè)節(jié)點(diǎn)各自都要開啟binlog和relay log迄汛;
1、數(shù)據(jù)不一致刃唤;
2隔心、自動(dòng)增長(zhǎng)id;
定義一個(gè)節(jié)點(diǎn)使用奇數(shù)id
auto_increment_offset=1
auto_increment_increment=2
另一個(gè)節(jié)點(diǎn)使用偶數(shù)id
auto_increment_offset=2
auto_increment_increment=2
配置:
1尚胞、server_id必須要使用不同值硬霍;
2、均啟用binlog和relay log笼裳;
3唯卖、存在自動(dòng)增長(zhǎng)id的表,為了使得id不相沖突躬柬,需要定義其自動(dòng)增長(zhǎng)方式拜轨;
服務(wù)啟動(dòng)后執(zhí)行如下兩步:
4、都授權(quán)有復(fù)制權(quán)限的用戶賬號(hào)允青;
5橄碾、各把對(duì)方指定為主節(jié)點(diǎn);
復(fù)制時(shí)應(yīng)該注意的問題:
1颠锉、從服務(wù)設(shè)定為“只讀”法牲;
在從服務(wù)器啟動(dòng)read_only,但僅對(duì)非SUPER權(quán)限的用戶有效琼掠;
阻止所有用戶:
mysql> FLUSH TABLES WITH READ LOCK;
2拒垃、盡量確保復(fù)制時(shí)的事務(wù)安全
在master節(jié)點(diǎn)啟用參數(shù):
sync_binlog = ON
如果用到的是InnoDB存儲(chǔ)引擎:
innodb_flush_logs_at_trx_commit=ON
innodb_support_xa=ON
3、從服務(wù)器意外中止時(shí)盡量避免自動(dòng)啟動(dòng)復(fù)制線程
4瓷蛙、從節(jié)點(diǎn):設(shè)置參數(shù)
sync_master_info=ON
sync_relay_log_info=ON
半同步復(fù)制
支持多種插件:/usr/lib64/mysql/plugins/
需要安裝方可使用:
mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';
半同步復(fù)制:
semisync_master.so
semisync_slave.so
主節(jié)點(diǎn):
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON |
+------------------------------------+-------+
MariaDB [mydb]> SET GLOBAL rpl_semi_sync_master_enabled=ON;
從節(jié)點(diǎn):
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
MariaDB [mydb]> STOP SLAVE IO_THREAD;
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';
MariaDB [mydb]> START SLAVE IO_THREAD;
判斷方法:
主節(jié)點(diǎn):
MariaDB [mydb]> SELECT @@global.rpl_semi_sync_master_clients悼瓮;
回顧:
主從:
主節(jié)點(diǎn):r/w
從節(jié)點(diǎn):ro
異步戈毒、半同步復(fù)制(部分節(jié)點(diǎn)同步復(fù)制、部分節(jié)點(diǎn)異步)
主從架構(gòu)形式:
主從復(fù)制
雙主模型
循環(huán)復(fù)制
級(jí)聯(lián)復(fù)制
一從僅可有一主横堡,但一主可以多從埋市;
一從可以多主,但各主節(jié)點(diǎn)提供不同的數(shù)據(jù)庫翅萤;
配置:
主節(jié)點(diǎn):server-id, log-bin, user
從節(jié)點(diǎn):server-id, relay-log, connection, IO_THREAD/SQL_THREAD
MySQL:
復(fù)制過濾器:
僅復(fù)制有限一個(gè)或幾個(gè)數(shù)據(jù)庫相關(guān)的數(shù)據(jù)恐疲,而非所有;由復(fù)制過濾器進(jìn)行套么;
有兩種實(shí)現(xiàn)思路:
(1) 主服務(wù)器
主服務(wù)器僅向二進(jìn)制日志中記錄有關(guān)特定數(shù)據(jù)庫相關(guān)的寫操作;
問題:其它庫的time-point recovery將無從實(shí)現(xiàn)碳蛋;
binlog_do_db=
binlog_ignore_db=
(2) 從服務(wù)器
從服務(wù)器的SQL THREAD僅重放關(guān)注的數(shù)據(jù)庫或表相關(guān)的事件胚泌,并將其應(yīng)用于本地;
問題:網(wǎng)絡(luò)IO和磁盤IO肃弟;
Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=
復(fù)制的監(jiān)控和維護(hù):
(1) 清理日志:PURGE
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
(2) 復(fù)制監(jiān)控
MASTER:
SHOW MASTER STATUS;
SHOW BINLOG EVENTS;
SHOW BINARY LOGS;
SLAVE:
SHOW SLAVE STATUS;
判斷從服務(wù)器是否落后于主服務(wù)器:
Seconds_Behind_Master: 0
(3) 如何確定主從節(jié)點(diǎn)數(shù)據(jù)是否一致玷室?
通過表的CHECKSUM檢查;
使用percona-tools中pt-table-checksum笤受;
(4) 主從數(shù)據(jù)不一致時(shí)的修復(fù)方法穷缤?
重新復(fù)制;
主從復(fù)制的讀寫分離:
mysql-proxy --> atlas
amoeba for MySQL:讀寫分離箩兽、分片津肛;
cobar:分片框架
mycat:
OneProxy
MaxScale
ProxySQL
http://www.proxysql.com/, ProxySQL is a high performance, high availability, protocol aware proxy for MySQL and forks (like Percona Server and MariaDB).
https://github.com/sysown/proxysql/releases
AliSQL:
雙主或多主模型是無須實(shí)現(xiàn)讀寫分離,僅需要負(fù)載均衡:haproxy, nginx, lvs, ...
pxc:Percona XtraDB Cluster
MariaDB Cluster
ProxySQL:
配置示例:
datadir="/var/lib/proxysql"
admin_variables=
{
admin_credentials="admin:admin"
mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
}
mysql_variables=
{
threads=4
max_connections=2048
default_query_delay=0
default_query_timeout=36000000
have_compress=true
poll_timeout=2000
interfaces="0.0.0.0:3306;/tmp/mysql.sock"
default_schema="information_schema"
stacksize=1048576
server_version="5.5.30"
connect_timeout_server=3000
monitor_history=600000
monitor_connect_interval=60000
monitor_ping_interval=10000
monitor_read_only_interval=1500
monitor_read_only_timeout=500
ping_interval_server=120000
ping_timeout_server=500
commands_stats=true
sessions_sort=true
connect_retries_on_failure=10
}
mysql_servers =
(
{
address = "172.18.0.67" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
port = 3306 # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
hostgroup = 0 # no default, required
status = "ONLINE" # default: ONLINE
weight = 1 # default: 1
compression = 0 # default: 0
},
{
address = "172.18.0.68"
port = 3306
hostgroup = 1
status = "ONLINE" # default: ONLINE
weight = 1 # default: 1
compression = 0 # default: 0
},
{
address = "172.18.0.69"
port = 3306
hostgroup = 1
status = "ONLINE" # default: ONLINE
weight = 1 # default: 1
compression = 0 # default: 0
}
)
mysql_users:
(
{
username = "root"
password = "mageedu"
default_hostgroup = 0
max_connections=1000
default_schema="mydb"
active = 1
}
)
mysql_query_rules:
(
)
scheduler=
(
)
mysql_replication_hostgroups=
(
{
writer_hostgroup=0
reader_hostgroup=1
}
)
maxscale配置示例:
[maxscale]
threads=auto
[server1]
type=server
address=172.18.0.67
port=3306
protocol=MySQLBackend
[server2]
type=server
address=172.18.0.68
port=3306
protocol=MySQLBackend
[server3]
type=server
address=172.18.0.69
port=3306
protocol=MySQLBackend
[MySQL Monitor]
type=monitor
module=mysqlmon
servers=server1,server2,server3
user=maxscale
passwd=201221DC8FC5A49EA50F417A939A1302
monitor_interval=1000
[Read-Only Service]
type=service
router=readconnroute
servers=server2,server3
user=maxscale
passwd=201221DC8FC5A49EA50F417A939A1302
router_options=slave
[Read-Write Service]
type=service
router=readwritesplit
servers=server1
user=maxscale
passwd=201221DC8FC5A49EA50F417A939A1302
max_slave_connections=100%
[MaxAdmin Service]
type=service
router=cli
[Read-Only Listener]
type=listener
service=Read-Only Service
protocol=MySQLClient
port=4008
[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006
[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
port=6602
mysqlrouter:
語句透明路由服務(wù)汗贫;
MySQL Router 是輕量級(jí) MySQL 中間件身坐,提供應(yīng)用與任意 MySQL 服務(wù)器后端的透明路由。MySQL Router 可以廣泛應(yīng)用在各種用案例中落包,比如通過高效路由數(shù)據(jù)庫流量提供高可用性和可伸縮的 MySQL 服務(wù)器后端部蛇。Oracle 官方出品。
博客作業(yè):簡(jiǎn)單復(fù)制咐蝇、雙主復(fù)制及半同步復(fù)制涯鲁、以及基于SSL的復(fù)制;
master/slave:
切分:
垂直切分:切庫有序,把一個(gè)庫中的多個(gè)表分組后放置于不同的物理服務(wù)器上抹腿;
水平切分:切表,分散其行至多個(gè)不同的table partitions中笔呀;
range, list, hash
sharding(切片):
數(shù)據(jù)庫切分的框架:
cobar
gizzard
Hibernat Shards
HiveDB
...
qps: queries per second
tps: transactions per second
MHA:
manager: 10.1.0.6
master: 10.1.0.67
slave1: 10.1.0.68
slave2: 10.1.0.69