數據庫對於互聯網公司來講是一個公司的心臟,沒有了它這個公司絕對只是一堆ppt。由此對於一個運維來講數據庫絕對是維護的重中之重,天天都要對數據庫進行增量備份,每週要進行一次徹底備份。經常使用的備份工具mysqldump這是一個邏輯被分工具那就意味着性能將會被計算消耗一些;extrabackup這是一個物理備份工具,具備較好的性能;還有一種藉助lvm進行備份的方法,這種方法的顯然不靠譜,由於lvm保存的數據不具備硬件級恢復數據的特性,一旦遇到極端狀況,咱們只能接受數據丟失。node
數據庫須要備份什麼?1數據,日誌;2程序,存儲例程;3配置文件。既然要備份這些數據,咱們須要瞭解他們的結構,配置文件好理解也好備份,程序和存儲例程的備份也比較好備份只要提供統樣的運行環境。mysql
數據備份就很麻煩了,咱們須要充分的瞭解mariadb的運行原理。其中在mariadb存儲時使用的是黑盒存儲,那就形成一個問題,咱們要查看數據庫中的數據只有使用mysql客戶端。那麼咱們備份這些數據就有兩個方法。一個是邏輯備份,咱們把數據反向生成一個mysql客戶端產生數據的方法,這個備份會有一個極大的問題,反向生成會很慢,恢復數據也會很慢;另外一個是物理備份,咱們直接把黑盒數據複製一份,可是這種備份就很麻煩了,備份數據庫咱們不能把數據庫停下來吧,萬一來了一個大單數據庫停會形成很大的影響。天天都例行對數據庫進行維護貌似只有某個交通公司在這麼幹,做爲以用戶爲中心的公司這麼作頗有可能會流失客戶,備份的特性依賴於存儲引擎。sql
存儲引擎數據庫
表類型:表級別概念,不建議在同一個庫中的表上使用不一樣的ENGINE;vim
CREATE TABLE ... ENGINE[=]STORAGE_ENGINE_NAME ... #定義數據庫表使用的存儲引擎緩存
SHOW TABLE STATUS #查看存儲引擎安全
常見的存儲引擎:bash
MyISAM, Aria, InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE, FEDERATED服務器
當前數據庫支持的存儲引擎網絡
mysql> SHOW ENGINES;
InnoDB:InnoBase
Percona-XtraDB, Supports transactions, row-level locking, and foreign keys
數據存儲於「表空間(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,間隙鎖,行級鎖;
事務:REPEATABLE-READ;適用於大量短時間事務;
索引:彙集索引、輔助索引;
性能:預讀操做、內存數據緩衝、內存索引緩存、自適應Hash索引、插入操做緩存區;
備份:支持熱備;
MyISAM:
支持全文索引(FULLTEXT index)、壓縮、空間函數(GIS);
不支持事務
鎖粒度:表級鎖
崩潰沒法保證表安全恢復
適用場景:只讀或讀多寫少的場景、較小的表(以保證崩潰後恢復的時間較短);
文件:每一個表有三個文件,存儲於數據庫目錄中
tbl_name.frm:表格式定義;
tbl_name.MYD:數據文件;
tbl_name.MYI:索引文件;
特性:
加鎖和併發:表級鎖;
修復:手動或自動修復、但可能會丟失數據;
索引:非彙集索引;
延遲索引更新;
表壓縮;
日誌備份
日誌備份就很難理解了,mariadb設計時就考慮到數據的徹底性,必須保證數據寫入成功,那麼設計一套記錄日誌:
訪問日誌
慢訪問日誌,訪問時間較長的命令
二進制日誌,記錄致使數據庫變化的命令。
中繼日誌,數據庫主從
那麼爲何要備份日誌,由於咱們備份數據後,數據庫發生變化那麼怎麼保證數據的徹底性,這裏咱們能夠藉助二進制日誌,把備份的數據庫後變動的操做再次執行一遍,咱們就能夠恢復數據庫的數據了。
邏輯備份恢復數據庫
#首先準備好備份 mysqldump --databases DATABASENAME --single-transaction -R --triggers -E --flush-logs --master-data=2 > /tmp/backup.sql #而後備份二進制日誌,去掉不想執行的語句 mysqlbinlog --stop-position=# /var/lib/mysql/master-log.00000# > /tmp/bin.log mysql <<eof #中止記錄二進制日誌 set @@session.sql_log_bin=OFF; #恢復備份的數據 source /tmp/backup.sql; #恢復二進制日誌中產生的數據 source /tmp/bin.log; #開啓記錄二進制日誌 set @@session.sql_log_bin=ON; eof
物理備份
物理備份咱們能夠進行全量備份,增量備份,變量備份。在這個地址下載xtrabackup:https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.5/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.5-1.el7.x86_64.rpm
全量備份
innobackupex --user=root --host=localhost --password=aaa /BACKUP/DIR 備份數據庫 innobackupex --apply-log /BACKUP/DIR #備份日誌 mysqlbinlog --start-position=# --stop-position=# /var/lib/mysql/master-log.00000# > /tmp/bin.log #而後備份二進制日誌,去掉不想執行的語句
innobackupex --copy-back /BACKUP/DIR #恢復備份 chown -R mysql.mysql /var/lib/mysql systemctl start mariadb.service #恢復二進制日誌中產生的數據 mysql <<eof set @@session.sql_log_bin=OFF; source /tmp/bin.log; set @@session.sql_log_bin=ON; eof
增量備份
innodbbackupex --incremental --user=root --host=localhost --password=aaa incremental-basedir=/BACKUP/DIR 備份合併,把增量備份的數據合併到全量備份裏 innodbbackupex --apply-log --redo-only BASE-DIR incremental-basedir=/BACKUP/DIR
主從複製
只進行備份是遠遠不夠的,當mariadb故障的這就須要咱們提供高可用集羣;數據庫的讀請求量特別大的時候,咱們須要一個服務器分擔讀請求;寫請求也變大,這裏不討論。先說讀請求變大咱們能夠增長服務器,分擔壓力,通常使用主從,或者使用雙主。
主從
使用主從的話,當寫節點故障須要咱們提供遷移工具經常使用的mha
主服務器
vim /etc/my.cnf innodb_file_per_table=1 skip_name_resolve=1 server_id=# log_bin=log-bin
啓動服務,並受權 mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'USERNAME'@'HOST' IDENTIFIED BY 'YOUR_PASSWORD'; mysql> FLUSH PRIVILEGES;
從服務器
vim /etc/my.cnf innodb_file_per_table=1 skip_name_resolve=1 server_id=# relay_log=relay-log 啓動服務: 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
配置主服務器
建立證書文件 cd /etc/pki/CA/ touch index.txt echo 01 > serial (umask 066;openssl genrsa -out private/cakey.pem 2048) openssl req -new -x509 -key private/cakey.pem -out cacert.pem (umask 066;openssl genrsa -out mysql.key 2048; ) openssl req -new -key mysql.key -out mysql.csr -days 365 openssl ca -in mysql.csr -out mysql.crt -days 700 (umask 066;openssl genrsa -out client.key 2048; ) openssl req -new -key client.key -out client.csr -days 365 openssl ca -in client.csr -out client.crt -days 700 #複製證書文件,並更改屬組屬主 cp cacert.pem mysql.crt mysql.key client.key client.crt /etc/mysql/ chown -R mysql.mysql /etc/mysql #複製祕鑰證書,前提須要在slave上建立/etc/mysql目錄 scp -p client.key client.crt cacert.pem 172.16.29.10:/etc/mysql
vim /etc/my.cnf #在[mysqld]段中添加以下配置 ssl #開啓SSL功能 ssl-ca = /etc/mysql/cacert.pem #指定CA文件位置 ssl-cert = /etc/mysql/mysql.crt #指定證書文件位置 ssl-key = /etc/mysql/mysql.key #指定密鑰所在位置 #開啓服務器 systemctl restart mariadb.service #受權 mysql grant replication slave,replication client on *.* to 'tom'@'172.16.%.%' identified by 'tom' require ssl;
slave節點
#在slave上鍊接 cd /etc/mysql/ mysql --ssl-ca=cacert.pem --ssl-cert=client.crt --ssl-key=client.key -h172.16.29.2 -utom -ptom #查看鏈接狀態 \s quit
顯示以下一行使用ssl表明成功
配置從服務器
systemctl restart mariadb.service mysql change master to master_host='172.16.29.2',master_user='tom',master_password='tom',master_log_file='master-log.000008',master_log_pos=245,master_ssl=1,master_ssl_ca='/etc/mysql/cacert.pem',master_ssl_cert='/etc/mysql/client.crt',master_ssl_key='/etc/mysql/client.key'; start slave; show slave status\G
如圖表明配置成功
mha
安裝包下載地址https://code.google.com/p/mysql-master-ha/downloads/list
從服務器安裝
yum install mha4mysql-node-0.54-0.el6.noarch.rpm -y
主服務器
yum install mha4mysql-node-0.54-0.el6.noarch.rpm mha4mysql-manager-0.55-0.el6.noarch.rpm -y [root@manager ~]# cat /usr/local/mha/mha.cnf [server default] user=mha_rep #MHA管理mysql的用戶名 password=123456 #MHA管理mysql的密碼 manager_workdir=/usr/local/mha #MHA的工做目錄 manager_log=/usr/local/mha/manager.log #MHA的日誌路徑 ssh_user=root #免祕鑰登錄的用戶名 repl_user=backup #主從複製帳號,用來在主從之間同步數據 repl_password=backup ping_interval=1 #ping間隔時間,用來檢查master是否正常 [server1] hostname=192.168.253.241 master_binlog_dir=/data/mysql/ candidate_master=1 #master宕機後,優先啓用這臺做爲master [server2] hostname=192.168.253.242 master_binlog_dir=/data/mysql/ candidate_master=1 [server3] hostname=192.168.253.243 master_binlog_dir=/data/mysql/ no_master=1 #設置na_master=1,使服務器不能成爲master #檢查ssh是否暢通 masterha_check_ssh --conf=/usr/local/mha/mha.cnf #運行,這個腳本生效後就自動退出了 nohup masterha_manager --conf=/usr/local/mha/mha.cnf > /tmp/mha_manager.log 2>&1 &
雙主
互爲主從:兩個節點各自都要開啓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不相沖突,須要定義其自動增加方式;
服務啓動後執行以下兩步:
四、都受權有複製權限的用戶帳號;
五、各把對方指定爲主節點;
複製過濾器
僅複製有限一個或幾個數據庫相關的數據,而非全部;由複製過濾器進行;
有兩種實現思路:
(1) 主服務器
主服務器僅向二進制日誌中記錄有關特定數據庫相關的寫操做;
問題:其它庫的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=
總結
備份的數據有:數據,日誌,配置文件,程序,
怎麼備份:邏輯備份,藉助lvm備份,物理備份(全量備份,增量備份,變量備份)
高可用:主從,雙主,加密通訊,複製過濾