一、搭建mysql服務器,並實現主主複製、半同步複製php
存儲引擎:node
表類型:也稱爲「表類型」,表級別概念,不建議在同一個庫中的表上使用不一樣的ENGINE;mysql
CREATE TABLE ... ENGINE[=]STORAGE_ENGINE_NAME ...redis
SHOW TABLE STATUS算法
常見的存儲引擎:sql
MyISAM, Aria, InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE, FEDERATED數據庫
InnoDB:InnoBasevim
Percona-XtraDB, Supports transactions, row-level locking, and foreign keyscentos
數據存儲於「表空間(table space)"中:緩存
(1) 全部數據庫中的全部類型爲InnoDB的表的數據和索引存儲於同一個表空間中;
表空間文件:datadir定義的目錄中
文件:ibdata1, ibdata2, ...
(2) innodb_file_per_table=ON,意味着每表使用單獨的表空間文件;
每表的數據文件(數據和索引,存儲於數據庫目錄)存儲於本身專用的表空間文件中,並存儲於數據庫目錄下: tbl_name.ibd
表結構的定義:在數據庫目錄,tbl_name.frm
事務型存儲引擎,適合對事務要求較高的場景中;但較適用於處理大量短時間事務;
基於MVCC(Mutli Version Concurrency Control)支持高併發;支持四個隔離級別,默認級別爲REPEATABLE-READ;間隙鎖以防止幻讀;
使用匯集索引(主鍵索引);
支持」自適應Hash索引「;
鎖粒度:行級鎖;間隙鎖;
總結:
數據存儲:表空間;
併發:MVCC,間隙鎖,行級鎖;
索引:彙集索引、輔助索引;
性能:預讀操做、內存數據緩衝、內存索引緩存、自適應Hash索引、插入操做緩存區;
備份:支持熱備;
MyISAM:
支持全文索引(FULLTEXT index)、壓縮、空間函數(GIS);
不支持事務
鎖粒度:表級鎖
崩潰沒法保證表安全恢復
適用場景:只讀或讀多寫少的場景、較小的表(以保證崩潰後恢復的時間較短);
文件:每一個表有三個文件,存儲於數據庫目錄中
tbl_name.frm:表格式定義;
tbl_name.MYD:數據文件;
tbl_name.MYI:索引文件;
特性:
加鎖和併發:表級鎖;
修復:手動或自動修復、但可能會丟失數據;
索引:非彙集索引;
延遲索引更新;
表壓縮;
行格式:
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
其它的存儲引擎:
CSV:將CSV文件(以逗號分隔字段的文本文件)做爲MySQL表文件;
MRG_MYISAM:將多個MyISAM表合併成的虛擬表;
BLACKHOLE:相似於/dev/null,不真正存儲數據;
MEMORY:內存存儲引擎,支持hash索引,表級鎖,經常使用於臨時表;
FEDERATED: 用於訪問其它遠程MySQL服務器上表的存儲引擎接口;
MariaDB額外支持不少種存儲引擎:
OQGraph、SphinxSE、TokuDB、Cassandra、CONNECT、SQUENCE、...
搜索引擎:
lucene, sphinx
lucene:Solr, ElasticSearch
併發控制:
鎖:Lock
鎖類型 :
讀鎖:共享鎖,可被多個讀操做共享;
寫鎖:排它鎖,獨佔鎖;
鎖粒度:
表鎖:在表級別施加鎖,併發性較低;
行鎖:在行級別施加鎖,併發性較高;維持鎖狀態的成本較大;
鎖策略:在鎖粒度及數據安全性之間尋求一種平衡機制;
存儲引擎:級別以及什麼時候施加或釋放鎖由存儲引擎自行決定;
MySQL Server:表級別,可自行決定,也容許顯式請求;
鎖類別:
顯式鎖:用戶手動請求的鎖;
隱式鎖:存儲引擎自行根據須要施加的鎖;
顯式鎖的使用:
(1) LOCK TABLES
LOCK TABLES tbl_name read|write, tbl_name read|write, ...
UNLOCK TABLES
(2) FLUSH TABLES
FLUSH TABLES tbl_name,... [WITH READ LOCK];
UNLOCK TABLES;
(3) SELECT cluase
[FOR UPDATE | LOCK IN SHARE MODE]
show processlist; #查看線程列表
手動控制事務:
啓動:START TRANSACTION
提交:COMMIT
回滾:ROLLBACK
事務支持savepoints:
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
事務隔離級別:
READ-UNCOMMITTED:讀未提交 --> 髒讀;
READ-COMMITTED:讀提交--> 不可重複讀;
REPEATABLE-READ:可重複讀 --> 幻讀;
SERIALIZABLE:串行化;
mysql> SELECT @@session.tx_isolation;
+----------------------------------+
| @@session.tx_isolation |
+----------------------------------+
| REPEATABLE-READ |
+----------------------------------+
查看InnoDB存儲引擎的狀態信息:
SHOW ENGINE innodb STATUS;
日誌:
查詢日誌:general_log
慢查詢日誌:log_slow_queries
錯誤日誌:log_error, log_warnings
二進制日誌:binlog
中繼日誌:relay_log
事務日誌:innodb_log
一、查詢日誌
記錄查詢語句,日誌存儲位置:
文件:file
表:table (mysql.general_log)
general_log={ON|OFF}
general_log_file=HOSTNAME.log
log_output={FILE|TABLE|NONE}
二、慢查詢日誌
慢查詢:運行時間超出指定時長的查詢;
long_query_time
存儲位置:
文件:FILE
表:TABLE,mysql.slog_log
log_slow_queries={ON|OFF}
slow_query_log={ON|OFF}
slow_query_log_file=
log_output={FILE|TABLE|NONE}
log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
log_slow_rate_limit
log_slow_verbosity
三、錯誤日誌
記錄信息:
(1) mysqld啓動和關閉過程 輸出的信息;
(2) mysqld運行中產生的錯誤信息;
(3) event scheduler運行時產生的信息;
(4) 主從複製架構中,從服務器複製線程啓動時產生的日誌;
log_error=
/var/log/mariadb/mariadb.log|OFF
log_warnings={ON|OFF}
四、二進制日誌
用於記錄引發數據改變或存在引發數據改變的潛在可能性的語句(STATEMENT)或改變後的結果(ROW),也多是兩者混合;
功用:「重放」
binlog_format={STATEMENT|ROW|MIXED}
STATEMENT:語句;
ROW:行;
MIXED:混編;
查看二進制日誌文件列表:
SHOW MASTER|BINARY LOGS;
查看當前正在使用的二進制日誌文件:
SHOW MASTER STATUS;
查看二進制 日誌文件中的事件:
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
服務器變量:
log_bin=/PATH/TO/BIN_LOG_FILE
只讀變量;
session.sql_log_bin={ON|OFF}
控制某會話中的「寫」操做語句是否會被記錄於日誌文件中;
max_binlog_size=1073741824
sync_binlog={1|0}
mysqlbinlog:
YYYY-MM-DD hh:mm:ss
--start-datetime=
--stop-datetime=
-j, --start-position=#
--stop-position=#
--user, --host, --password
二進制日誌事件格式:
# at 553
#160831 9:56:08 server id 1 end_log_pos 624 Query thread_id=2 exec_time=0 error_code=0
SET TIMESTAMP=1472608568/*!*/;
BEGIN
/*!*/;
事件的起始位置:# at 553
事件發生的日期時間:#160831 9:56:08
事件發生的服務器id:server id 1
事件的結束位置:end_log_pos 624
事件的類型:Query
事件發生時所在服務器執行此事件的線程的ID: thread_id=2
語句的時間戳與將其寫入二進制日誌文件中的時間差:exec_time=0
錯誤代碼:error_code=0
事件內容:SET TIMESTAMP=1472608568/*!*/;
中繼日誌:
從服務器上記錄下來從主服務器的二進制日誌文件同步過來的事件;
事務日誌:
事務型存儲引擎innodb用於保證事務特性的日誌文件:
redo log
undo log
主/從架構:
異步複製:
半同步複製:
一主多從;
一從一主;
級聯複製;
循環複製;
雙主複製;
一從多主:
每一個主服務器提供不一樣的數據庫;
配置:
時間同步;
複製的開始位置:
從0開始;
從備份中恢復到從節點後啓動的複製,複製的起始點備份操做時主節點所處的日誌文件及其事件位置;
主從服務器mysqld程序版本不一致?
從的版本號高於主的版本號;
主服務器:
配置文件my.cnf
server_id=#
log_bin=log-bin
啓動服務:
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'USERNAME'@'HOST' IDENTIFIED BY 'YOUR_PASSWORD';
mysql> FLUSH PRIVILEGES;
從服務器:
配置文件my.cnf
server_id=#
relay_log=relay-log
read_only=ON
啓動服務:
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;
課外做業:基於SSL的複製的實現;
主主複製:
互爲主從:兩個節點各自都要開啓binlog和relay log;
一、數據不一致;
二、自動增加id;
定義一個節點使用奇數id
auto_increment_offset=1
auto_increment_increment=2
另外一個節點使用偶數id
auto_increment_offset=2
auto_increment_increment=2
配置:
一、server_id必需要使用不一樣值;
二、均啓用binlog和relay log;
三、存在自動增加id的表,爲了使得id不相沖突,須要定義其自動增加方式;
服務啓動後執行以下兩步:
四、都受權有複製權限的用戶帳號;
五、各把對方指定爲主節點;
複製時應該注意的問題:
一、從服務設定爲「只讀」;
在從服務器啓動read_only,但僅對非SUPER權限的用戶有效;
阻止全部用戶:
mysql> FLUSH TABLES WITH READ LOCK;
二、儘可能確保複製時的事務安全
在master節點啓用參數:
sync_binlog = ON
若是用到的是InnoDB存儲引擎:
innodb_flush_logs_at_trx_commit=ON
innodb_support_xa=ON
三、從服務器意外停止時儘可能避免自動啓動複製線程
四、從節點:設置參數
sync_master_info=ON
sync_relay_log_info=ON
半同步複製
支持多種插件:/usr/lib64/mysql/plugins/
須要安裝方可以使用:
mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';
半同步複製:
semisync_master.so
semisync_slave.so
主節點:
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;
從節點:
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;
判斷方法:
主節點:
MariaDB [mydb]> SELECT @@global.rpl_semi_sync_master_clients;
複製過濾器:
僅複製有限一個或幾個數據庫相關的數據,而非全部;由複製過濾器進行;
有兩種實現思路:
(1) 主服務器
主服務器僅向二進制日誌中記錄有關特定數據庫相關的寫操做;
問題:其它庫的time-point recovery將無從實現;
binlog_do_db=
binlog_ignore_db=
(2) 從服務器
從服務器的SQL THREAD僅重放關注的數據庫或表相關的事件,並將其應用於本地;
問題:網絡IO和磁盤IO;
Replicate_Do_DB=
Replicate_Ignore_DB=
Replicate_Do_Table=
Replicate_Ignore_Table=
Replicate_Wild_Do_Table=
Replicate_Wild_Ignore_Table=
主從架構
修改配置文件。
加入server-id。開啓二進制日誌
將二進制日誌目錄全部者更改成mysql
從節點修改配置文件,啓用中繼日誌,將會把主節點二進制日誌複製過來
mkdir /data/mysql
[root@centos7 ~]# chown -R mysql.mysql /data/mysql/
MariaDB [(none)]> grant replication slave,replication client on *.* to 'repluser'@'192.168.1.%' identified by '123456'; #主節點建立複製帳號賦予複製權限
skip_name_resolve=ON #避免mysql將ip地址解析爲主機名,這裏能夠跳過解析,在配置文件中加入此行
change master to master_host='192.168.1.196',master_port=3306,master_user='repluser',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=245;
在從節點配置鏈接信息。
master_host='192.168.1.196'#主節點主機。master_log_file='mysql-bin.000001'#指定從哪一個二進制文件開始複製,master_log_pos=245;#從二進制文件中的哪一個位置複製
start slave;備用節點開啓複製
查看同步狀態
主主複製:
互爲主從:兩個節點各自都要開啓binlog和relay log;
一、數據不一致;
二、自動增加id;
定義一個節點使用奇數id
auto_increment_offset=1
auto_increment_increment=2
另外一個節點使用偶數id
auto_increment_offset=2
auto_increment_increment=2
配置:
一、server_id必需要使用不一樣值;
二、均啓用binlog和relay log;
三、存在自動增加id的表,爲了使得id不相沖突,須要定義其自動增加方式;
服務啓動後執行以下兩步:
四、都受權有複製權限的用戶帳號;
五、各把對方指定爲主節點;
複製時應該注意的問題:
一、從服務設定爲「只讀」;
在從服務器啓動read_only,但僅對非SUPER權限的用戶有效;
阻止全部用戶:
mysql> FLUSH TABLES WITH READ LOCK;
二、儘可能確保複製時的事務安全
在master節點啓用參數:
sync_binlog = ON
若是用到的是InnoDB存儲引擎:
innodb_flush_logs_at_trx_commit=ON
innodb_support_xa=ON
三、從服務器意外停止時儘可能避免自動啓動複製線程
四、從節點:設置參數
sync_master_info=ON
sync_relay_log_info=ON
修改配置文件,啓用二進制日誌和中繼日誌
serverid區別開來
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repluser@'192.168.1.%' IDENTIFIED BY '123456';
在兩邊節點都須要建立複製帳號
在複製時要指定對方當前的二進制日誌記錄點,
change MASTER TO MASTER_HOST='192.168.1.196',MASTER_USER='repluser',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=245;
change MASTER TO MASTER_HOST='192.168.1.198',MASTER_USER='repluser',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=418;
半同步複製
支持多種插件:/usr/lib64/mysql/plugins/
須要安裝方可以使用:
mysql> INSTALL PLUGIN plugin_name SONAME 'shared_library_name';
半同步複製:
semisync_master.so
semisync_slave.so
主節點:
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;
從節點:
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;
判斷方法:
主節點:
MariaDB [mydb]> SELECT @@global.rpl_semi_sync_master_clients;
複製過濾器:
僅複製有限一個或幾個數據庫相關的數據,而非全部;由複製過濾器進行;
有兩種實現思路:
(1) 主服務器
主服務器僅向二進制日誌中記錄有關特定數據庫相關的寫操做;
問題:其它庫的time-point recovery將無從實現;
binlog_do_db=
binlog_ignore_db=
(2) 從服務器
從服務器的SQL THREAD僅重放關注的數據庫或表相關的事件,並將其應用於本地;
問題:網絡IO和磁盤IO;
Replicate_Do_DB= #白名單
Replicate_Ignore_DB=#黑名單
Replicate_Do_Table= #表白名單
Replicate_Ignore_Table=#表黑名單
Replicate_Wild_Do_Table=#表通配符白名單
Replicate_Wild_Ignore_Table=
複製的監控和維護:
(1) 清理日誌:PURGE
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr };
(2) 複製監控
MASTER:
SHOW MASTER STATUS;
SHOW BINLOG EVENTS;
SHOW BINARY LOGS;
SLAVE:
SHOW SLAVE STATUS;
判斷從服務器是否落後於主服務器:
Seconds_Behind_Master: 0
(3) 如何肯定主從節點數據是否一致?
經過表的CHECKSUM檢查;
使用percona-tools中pt-table-checksum;
(4) 主從數據不一致時的修復方法?
從新複製;
mysql 讀寫分離器
proxysql
vi /etc/yum.repos.d/proxysql.repo
[proxysql_repo]
name= ProxySQL YUM repository
baseurl=https://repo.proxysql.com/ProxySQL/proxysql-2.0.x/centos/latest
gpgcheck=1
gpgkey=https://repo.proxysql.com/ProxySQL/repo_pub_key
yum install proxysql
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
}
)
二、搭建mysql服務器,並用mysqldump實現備份還原
備份工具:
mysqldump:mysql服務自帶的備份工具;邏輯備份工具;#將表查出來,轉換爲insert語句,還原時在表插入數據
徹底、部分備份;
InnoDB:熱備;
MyISAM:溫備;
cp/tar
lvm2:快照(請求一個全局鎖),以後當即釋放鎖,達到幾乎熱備的效果;物理備份;
注意:不能僅備份數據文件;要同時備份事務日誌;
前提:要求數據文件和事務日誌位於同一個邏輯卷;
xtrabackup:
由Percona提供,開源工具,支持對InnoDB作熱備,物理備份工具;
徹底備份、部分備份;
徹底備份、增量備份;
徹底備份、差別備份;
mysqlhotcopy
select:
備份:SELECT cluase INTO OUTFILE 'FILENAME';
恢復:CREATE TABLE
導入:LOAD DATA
mysqldump:
邏輯備份、徹底備份、部分備份;
二次封裝工具:
mydumper
phpMyAdmin
Usage:
mysqldump [OPTIONS] database [tables]
OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
mysqldump mydb:表級別備份
mysqldump --databases mydb:庫級別備份
MyISAM存儲引擎:支持溫備,備份時要鎖定表;
-x, --lock-all-tables:鎖定全部庫的全部表,讀鎖;
-l, --lock-tables:鎖定指定庫全部表;
InnoDB存儲引擎:支持溫備和熱備;
--single-transaction:建立一個事務,基於此快照執行備份;
其它選項:
-R, --routines:存儲過程和存儲函數;
--triggers
-E, --events
--master-data[=#]
1:記錄爲CHANGE MASTER TO語句,此語句不被註釋;
2:記錄爲CHANGE MASTER TO語句,此語句被註釋;
--flush-logs:鎖定表完成後,即進行日誌刷新操做;
mysqldump -uroot --all-databases -x -E --master-data=2 --flush-logs > /root/alldb-`date +%F`.sql
備份以後插入數據到表中
保存二進制日誌,刪庫
還原
查表
mysql -uroot < alldb-2019-09-29.sql
還原
三、使用xtrabackup實現徹底備份,增量備份,並還原
使用Xtrabackup進行MySQL備份:
1、安裝
一、簡介
Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上唯一一款開源的可以對innodb和xtradb數據庫進行熱備的工具。特色:
(1)備份過程快速、可靠;
(2)備份過程不會打斷正在執行的事務;
(3)可以基於壓縮等功能節約磁盤空間和流量;
(4)自動實現備份檢驗;
(5)還原速度快;
二、安裝
其最新版的軟件可從 http://www.percona.com/software/percona-xtrabackup/ 得到。本文基於RHEL5.8的系統,所以,直接下載相應版本的rpm包安裝便可,這裏再也不演示其過程。
2、備份的實現
一、徹底備份
# innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
若是要使用一個最小權限的用戶進行備份,則可基於以下命令建立此類用戶:
mysql> CREATE USER ’bkpuser’@’localhost’ IDENTIFIED BY ’s3cret’;
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ’bkpuser’;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’bkpuser’@’localhost’;
mysql> FLUSH PRIVILEGES;
使用innobakupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中。
備份的目錄以當前時間點爲目錄名,二進制日誌記錄點爲000003 pos爲245,表示備份的節點,之後能夠基於這個節點日後利用二進制日誌還原
在備份的同時,innobackupex還會在備份目錄中建立以下文件:
(1)xtrabackup_checkpoints —— 備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息;
每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的。
(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。
(3)xtrabackup_binlog_pos_innodb —— 二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。
(4)xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件;
(5)backup-my.cnf —— 備份命令用到的配置選項信息;
在使用innobackupex進行備份時,還可使用--no-timestamp選項來阻止命令自動建立一個以時間命名的目錄;如此一來,innobackupex命令將會建立一個BACKUP-DIR目錄來存儲備份數據。
二、準備(prepare)一個徹底備份
通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
innobakupex命令的--apply-log選項可用於實現上述功能。以下面的命令:
# innobackupex --apply-log /path/to/BACKUP-DIR
若是執行正確,其最後輸出的幾行信息一般以下:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
120407 9:01:36 InnoDB: Starting shutdown...
120407 9:01:40 InnoDB: Shutdown completed; log sequence number 92036620
120407 09:01:40 innobackupex: completed OK!
在實現「準備」的過程當中,innobackupex一般還可使用--use-memory選項來指定其可使用的內存的大小,默認一般爲100M。若是有足夠的內存可用,能夠多劃分一些內存給prepare的過程,以提升其完成速度。
刪庫
innobackupex --apply-log . #對當前目錄執行指定應用日誌
通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處理不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
innobakupex命令的--apply-log選項可用於實現上述功能。以下面的命令:
# innobackupex --apply-log /path/to/BACKUP-DIR
若是執行正確,其最後輸出的幾行信息一般以下:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
120407 9:01:36 InnoDB: Starting shutdown...
120407 9:01:40 InnoDB: Shutdown completed; log sequence number 92036620
120407 09:01:40 innobackupex: completed OK!
在實現「準備」的過程當中,innobackupex一般還可使用--use-memory選項來指定其可使用的內存的大小,默認一般爲100M。若是有足夠的內存可用,能夠多劃分一些內存給prepare的過程,以提升其完成速度。
三、從一個徹底備份中恢復數據
注意:恢復不用啓動MySQL
innobackupex命令的--copy-back選項用於執行恢復操做,其經過複製全部數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。innobackupex經過backup-my.cnf來獲取DATADIR目錄的相關信息。
# innobackupex --copy-back /path/to/BACKUP-DIR
若是執行正確,其輸出信息的最後幾行一般以下:
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/backup/2012-04-07_08-17-03'
innobackupex: back to original InnoDB log directory '/mydata/data'
innobackupex: Finished copying back files.
120407 09:36:10 innobackupex: completed OK!
innobackupex --copy-back /data/backup/2019-09-29_22-51-00/
當數據恢復至DATADIR目錄之後,還須要確保全部數據文件的屬主和屬組均爲正確的用戶,如mysql,不然,在啓動mysqld以前還須要事先修改數據文件的屬主和屬組。如:
# chown -R mysql:mysql /mydata/data/
要實現第一次增量備份,可使用下面的命令進行:
# innobackupex --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是徹底備份所在的目錄,此命令執行結束後,innobackupex命令會在/backup目錄中建立一個新的以時間命名的目錄以存放全部的增量備份數據。另外,在執行過增量備份以後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。
須要注意的是,增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是徹底備份。
「準備」(prepare)增量備份與整理徹底備份有着一些不一樣,尤爲要注意的是:
(1)須要在每一個備份(包括徹底和各個增量備份)上,將已經提交的事務進行「重放」。「重放」以後,全部的備份數據將合併到徹底備份上。
(2)基於全部的備份將未提交的事務進行「回滾」。
因而,操做就變成了:
# innobackupex --apply-log --redo-only BASE-DIR
接着執行:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
然後是第二個增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
innobackupex --copy-back ./
其中BASE-DIR指的是徹底備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即若是有屢次增量備份,每一次都要執行如上操做;
增量備份
innobackupex --incremental /data/backup/ --incremental-basedir=/data/backup2019-09-29_23-21-27
刪除表操做
MariaDB [mydb]> delete from tb1 where id=1;
增量備份完以後在刪除一次表,利用二進制日誌還原
delete from tb1 where id=2;
查看徹底備份二進制日誌記錄點
將記錄點日後的記錄導出
mysqlbinlog -j 1178 /data/mysql/mysql-bin.000001 > /root/xtraback-binlog.sql
而後刪庫
[root@centos7 2019-09-29_23-21-27]$ innobackupex --apply-log --redo-only . #第一次提交
innobackupex --apply-log --redo-only . --incremental-dir=/data/backup/2019-09-29_23-33-16 #將增量備份也應用至第一次的完備,而後合併日誌
[root@centos7 2019-09-29_23-21-27]$innobackupex --copy-back ./ . #而後合併應用日誌
innobackupex --copy-back ./ #還原須要修改權限
set sql_log_bin=OFF; #關閉
source /tmp/xtraback-binlog.sql #在還原xtrabackup
四、搭建redis,並說明redis持久化原理
程序環境:
配置文件:/etc/redis.conf
主程序:/usr/bin/redis-server
6379/tcp
客戶端:/usr/bin/redis-cli
Unit File:/usr/lib/systemd/system/redis.service
數據目錄:/var/lib/redis
安裝:
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ make
$ src/redis-server
$ src/redis-cli
redis> set foo barOK
redis> get foo"bar"
配置和使用Redis:
基本配置項
網絡配置項
持久化相關配置
複製相關的配置
安全相關配置
Limit相關的配置
SlowLog相關的配置
INCLUDES
Advanced配置
網絡配置項:
bind IP
port PORT
protected-mode
tcp-backlog
unixsocket
timeout:鏈接的空閒超時時長;
安全配置:
requirepass <PASSWORD>
rename-command <COMMAND> <NEW_CMND_NAME>
在AOF或Replication環境中,不推薦使用;
Limits相關的配置:
maxclients
maxmemory <bytes>
maxmemory-policy noeviction
淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
maxmemory-samples 5
淘汰算法運行時的採樣樣本數;
SlowLog相關的配置:
slowlog-log-slower-than 10000
單位是微秒;
slowlog-max-len 128
SlowLog記錄的日誌最大條目;
Redis的持久化:
RDB:snapshotting, 二進制格式;按事先定製的策略,週期性地將數據從內存同步至磁盤;數據文件默認爲dump.rdb;
客戶端顯式使用SAVE或BGSAVE命令來手動啓動快照保存機制;
SAVE:同步,即在主線程中保存快照,此時會阻塞全部客戶端請求;
BGSAVE:異步;
AOF:Append Only File, fsync
記錄每次寫操做至指定的文件尾部實現的持久化;當redis重啓時,可經過從新執行文件中的命令在內存中重建出數據庫;
BGREWRITEAOF:AOF文件重寫;
不會讀取正在使用AOF文件,而是經過將內存中的數據以命令的方式保存至臨時文件中,完成以後替換原來的AOF文件;
RDB相關的配置:
*save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
表示:三個策略知足其中任意一個均會觸發SNAPSHOTTING操做;900s內至少有一個key有變化,300s內至少有10個key有變化,60s內至少有1W個key發生變化;
stop-writes-on-bgsave-error yes
dump操做出現錯誤時,是否禁止新的寫入操做請求;
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb:指定rdb文件名
*dir /var/lib/redis:rdb文件的存儲路徑
AOF相關的配置
*appendonly no
appendfilename "appendonly.aof"
*appendfsync
Redis supports three different modes:
no:redis不執行主動同步操做,而是OS進行;
everysec:每秒一次;
always:每語句一次;
no-appendfsync-on-rewrite no
是否在後臺執行aof重寫期間不調用fsync,默認爲no,表示調用;
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
上述兩個條件同時知足時,方會觸發重寫AOF;與上次aof文件大小相比,其增加量超過100%,且大小很多於64MB;
aof-load-truncated yes
注意:持久機制自己不能取代備份;應該制訂備份策略,對redis庫按期備份;
RDB與AOF同時啓用:
(1) BGSAVE和BGREWRITEAOF不會同時進行;
(2) Redis服務器啓動時用持久化的數據文件恢復數據,會優先使用AOF;
五、搭建redis,並實現主從複製
複製:
特色:
一個Master能夠有多個slave主機,支持鏈式複製;
Master以非阻塞方式同步數據至slave主機;
配置slave節點:
redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
redis-cli> CONFIG SET masterauth <PASSWORD>
配置參數:
*slaveof
*masterauth
slave-serve-stale-data yes
slave-read-only yes
*repl-diskless-sync no
no, Disk-backed, Diskless
新的從節點或某較長時間未能與主節點進行同步的從節點從新與主節點通訊,須要作「full synchronization",此時其同步方式有兩種style:
Disk-backend:主節點新建立快照文件於磁盤中,然後將其發送給從節點;
Diskless:主節佔新建立快照後直接經過網絡套接字文件發送給從節點;爲了實現並行複製,一般須要在複製啓動前延遲一個時間段;
repl-diskless-sync-delay 5
repl-ping-slave-period 10
*repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 1mb
*slave-priority 100
複製集羣中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高,但0表示不參與選舉;
min-slaves-to-write 3:主節點僅容許其可以通訊的從節點數量大於等於此處的值時接受寫操做;
min-slaves-max-lag 10:從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操做;
在從節點上修改配置文件,增長主節點ip端口,驗證密碼
Server相關的命令:
CLIENT GETNAME
*CLIENT KILL
CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
*CLIENT LIST
CLIENT PAUSE
CLIENT PAUSE timeout
CLIENT REPLY
CLIENT SETNAME:Set the current connection name
SHUTDOWN [NOSAVE|SAVE]
CONFIG GET #查詢配置文件中的配置段
CONFIG RESETSTAT
CONFIG REWRITE #將命令行中保存的配置寫入配置文件
CONFIG SET #在命令行中修改配置文件中的配置
INFO:服務器狀態信息查看;分爲多個secion;
INFO [section]
在命令行中直接配置從節點加入主節點複製
配置完成後,使用config rewrite 寫入配置文件完成永久有效
六、搭建redis集羣
sentinel:https://redis.io/topics/sentinel #官方文檔
主要完成三個功能:監控、通知、自動故障轉移
選舉:流言協議、投票協議
配置項:
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>
<quorum>表示sentinel集羣的quorum機制,即至少有quorum個sentinel節點同時斷定主節點故障時,才認爲其真的故障;
s_down: subjectively down
o_down: objectively down
sentinel down-after-milliseconds <master-name> <milliseconds>
監控到指定的集羣的主節點異常狀態持續多久方纔將標記爲「故障」;
sentinel parallel-syncs <master-name> <numslaves>
指在failover過程當中,可以被sentinel並行配置的從節點的數量;
sentinel failover-timeout <master-name> <milliseconds>
sentinel必須在此指定的時長內完成故障轉移操做,不然,將視爲故障轉移操做失敗;
sentinel notification-script <master-name> <script-path>
通知腳本,此腳本被自動傳遞多個參數;
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters
SENTINEL slaves <MASTER_NAME>
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>
vim /etc/redis-sentinel.conf #修改配置文件
port 26379
bind 0.0.0.0
sentinel monitor mymaster 192.168.1.196 6379 2 #添加監控主節點ip及端口,以及投票權重
sentinel auth-pass mymaster 123456 #密碼
sentinel down-after-milliseconds mymaster 5000 #超時時長
sentinel parallel-syncs mymaster 1 #幾路併發時間
sentinel failover-timeout mymaster 180000 #sentinel必須在此指定的時長內完成故障轉移操做,不然,將視爲故障轉移操做失敗;
複製至其餘節點。
systemctl start redis-sentinel #在其餘節點啓動sentinel服務便可
會自動記錄主從節點
redis cluster
修改配置文件。
vim /etc/redis.conf
cluster-enabled yes #啓用集羣
cluster-config-file cluster.conf #集羣配置文件
cluster-node-timeout 15000 #超時時長
cluster-slave-validity-factor 10 #主從判斷因子
將配置文件複製至其餘集羣節點
rm -rf /var/lib/redis/dump.rdb #這裏我刪除以前配置的數據。
redis-cli -a 123456 -c cluster addslots {0..5500}
啓動redis後爲每一個節點分配slots; cluster addslots
每一個slot要獨立建立,可用範圍爲0-16383,共16384個;
redis-cli -h 192.168.1.198 -a 123456 -c cluster addslots {5501..11000}
redis-cli -h 192.168.1.202 -a 123456 -c cluster addslots {11001..16385}
設定集羣成員關係;cluster meet
cluster info;
集羣創建成功後每一個slots都爲16384