mariadb簡單入門

     數據庫對於互聯網公司來講是一個公司的心臟,沒有了它這個公司絕對只是一堆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表明成功

spacer.gifwKioL1iy53TAtcisAAAVhobocTc960.png

配置從服務器

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


     如圖表明配置成功

spacer.gifwKiom1iy54jhnkXXAABlk3SV_4Y191.png


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備份,物理備份(全量備份,增量備份,變量備份)

     高可用:主從,雙主,加密通訊,複製過濾

相關文章
相關標籤/搜索