1. 程式人生 > >MySQL運維進階-MySQL雙主(master-master)+半同步(Semisync Repl

MySQL運維進階-MySQL雙主(master-master)+半同步(Semisync Repl

MySQL運維進階-MySQL雙主(ma

MySQL --> MariaDB --> Percona-Server

MySQL: oracle ,
commutity : 社區版 5.5 5.6 5.7 8.0
MariaDB:
5.5 10.x
Percona:
Percona-Server
InnoDB --> XtraDB
Xtrabackup
percona-tools:

存儲引擎:
引擎:也稱為表類型,表級別概念,不建議在同一個庫中的表上使用不同的ENGINE;
CREATE TABLE ... ENGINE STORAGE_ENGINE_NAME ...
SHOW TABLE STATUS

                常見的存儲引擎: SHOW ENGINES;
                            MyISAM,  Aria, InnoDB,  MRG_MYISAM, CSV, BLACKHOLE,...

                InnoDB : InnoBase
                            Percona-XtraDB,Supports  transactions , row-level  locking,  and foreign  keys

              數據存儲於“表空間” 中:
                        (1)所有數據庫中的所有類型為InnoDB的表的數據和索引存儲於同一個表空間中;
                                            表空間文件:datadir定義的目錄中,文件 ibdata1,ibdata2...
                            (2)  innodb_file_per_table=ON,意味著每表使用單獨的表空間文件;  每表的數據文件(數據和索引,存儲於數據庫目錄)存儲於自己專用的表空間文件中,並存儲於數據庫目錄下:tablename.ibd
                            表結構的定義:在數據庫目錄,tablename.frm

 事務型存儲引擎,適合對事物要求較高的場景中;但較適用於處理大量短期事務;
     基於MVCC(Mutil Version Concurrency Control)支持高並發;支持四個隔離級別,默認級別為 REPETABLE-READ(可重讀-幻讀);  間隙鎖以防止幻讀:(MVCC多版本控制就是解決了幻讀問題)
     使用聚集索引(主鍵索引);支持“自適應Hash索引”;
     鎖粒度: 行級鎖,間隙鎖

     總結:
                     數據存儲:表空間;
                     並發:MVCC,間隙鎖,行級鎖
                     索引:聚集索引、輔助索引;
                     性能:預讀操作、內存數據緩沖、內存索引緩存、自適應Hash索引、插入操作緩存區;
                     備份:支持熱備;
            SHOW   ENGINE  INNODB  STATUS;

MyISAM:-> Aria

        支持全文索引(FULLTEXT index)、壓縮、空間函數(GIS);
        不支持事務
        鎖粒度:表級鎖
        崩潰後無法保證表安全恢復

        適用場景:只讀或讀多寫少的場景、較小的表(以保證崩潰後恢復的時間較短);

        文件:每個表有三個文件,存儲於數據庫目錄中
            tbl_name.frm:表格式定義;
            tbl_name.MYD:數據文件; 
            tbl_name.MYI:索引文件;

        特性:
            加鎖和並發:表級鎖;
            修復:手動或自動修復、但可能會丟失數據;
            索引:非聚集索引;
            延遲索引更新;
            表壓縮;

顯示鎖的使用:
            1)LOCK TABLES
                        LOCK TABLES  tb1_name  read|write...
                        UNLOCK   TABLES;
            2)FLUSH TABLES;
                  FLUSH TABLES  tb1_name,.... [WITH READ LOCK];
                        UNLOCK TABLES;
            3) SELECT  cluase   
                 [FOR UPDATE | LOCK IN SHARE MODE]

事務:
             事務:一組原子性的SQL查詢、或者是一個或多個SQL語句組成的獨立工作
             單元:
                                 事務日誌:
                                             innodb_log_files_in_group
                                             innodb_log_group_home_dir
                                             innodb_log_file_size
                                             innodb_mirrored_log_groups
                ACID測試:
                            A:AUTOMICITY,原子性,整個事務中的所有操作要麽全部成功執行,要麽失敗後回滾;
                            C:CONSISTENCY,一致性,數據庫總是應該從一個一致性狀態轉為另一個一致性狀態;
                            I:ISOLATION ,隔離性, 一個事務所做出的操作在提交之前,是否能為其他事務可見;處於保證並發操作之目的,隔離有多種級別;
                            D:DURABILITY,  持久性; 事務一旦提交,其所做出的修改會永久保存;

自動提交;單語句事務
            mysql > SELECT  @@autocommit;
            mysql > SET @@session.autocommit=0; 關閉當前會話自動提交

手動控制事務:
            啟動:START  TRANSACTION
            提交:COMMIT
            回滾:ROLLBACK

            事務支持savepoints:
                        SAVEPOINT  identifier 
                        ROLLBACK  [WORK]  TO  [SAVEPOINT]  identifier
                        RELEASE  SAVEPOINT  identifier

事務隔離級別:完全理解
            READ-UNCOMMITIED :讀未提交 --> 臟讀問題
            READ-COMMITIED: 讀提交 -->不可重復讀;
            REPEATABLE-READ : 可重復度 --> 幻讀問題;  默認級別
            SERIALIZABLE :串行化;

            mysql > SELECT @@session.tx_isolation;
            mysql > SHOW ENGINE  innodb  STATUS;

    MySQL用戶和權限管理
                    用戶賬號: user@host
                            user  :  賬戶名稱;
                                    host :   此賬戶可通過哪些客戶端主機請求創建連接線程;
                                    %    :  任意長度的任意字符;
                                    _       :   任意單個字符;

                                    skip_name_resolve=ON

        重命名:RENAME   USER
                        RENAME  USER  old_user  TO new_user [,old_user TO new_user] ...

         刪除用戶:
                      DROP  USER  ‘username‘@‘host‘  [,‘username1‘@‘host‘]...
                        FLUSH  PRIVILEGES;

            修改用戶密碼:
                        1)SET PASSWORD  [FOR ‘username‘@‘host‘]  =PASSWORD(‘string‘);
                        2)  UPDATE  mysql.user  SET password=PASSWORD(‘string‘)   WHERE user=‘username‘  AND host=‘HOST‘;
                        3)  mysqladmin  -uUSERNAME  -hHOST  -p password  ‘NEW_PASS‘
                        4)  FLUSH PRIVILEGES;

忘記管理員密碼的解決辦法:
1) 啟動mysqld進程時,使用 --skip-grant-tables和--skip-networking選項
Centos 7 : mariadb.service
Centos 6 : /etc/init.d/mysqld
2) 通過UPDATE命令修改管理員密碼;
3) 以正常方式啟動mysqld進程;

查看授權: SHOW  GRANTS;
                SHOW  GRANTS  [FOR  ‘username‘@‘host‘ ];
取消授權: REVOKE
       REVOKE   priv_type  on   priv_level   FROM ‘user‘@‘host‘ ...
             REVOKE  ALL PRIVILEGES ,GRNAT OPTION  FROM user..

查詢緩存相關的服務器變量:
query_cache_limit : 能夠緩存的最大查詢結果;(單語句結果集大小上限)
有著較大結果集的語句:顯示使用SQL_NO_CACHE,以避免先緩存再移出;
query_cache_min_res_unit :內存緩存塊的最小分配單位;緩存過小的查詢結果集會浪費內存空間;
較小的值會減少空間浪費,但是會導致更頻繁的內存分配以及回收操作; 較大值的會帶來空間浪費;
query_cache_size : 查詢緩存空間的總共可用的大小;單位是字節, 必須是1024的整數倍;
query_cache_type: 緩存功能啟用與否;
ON:啟用; OFF :禁用
DEMAND: 按需緩存,僅緩存SELECT語句中帶SQL_CACHE的查詢結果;
query_cache_wlock_invalidate : 如果某表被其他連接鎖定,是否仍然可以從查詢緩存中返回查詢結果;默認為 OFF,表示可以;ON則表示不可以;

狀態變量:

            mysql>SHOW GLOBAL STATUS LIKE ‘Qcache%‘;
        命中率: Qcache_hits/Com_select

MySQL日誌:

  1)二進制日誌
                    用於記錄引起數據改變或存在引起數據改變的潛在可能性的語句或改變後的結果,也可能是二者混合;  
                    功用:重放

        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 |OFF
                   session.sql_log_bin={ON | OFF}
                          控制某會話中的“寫‘’操作語句是否會被記錄到二進制日誌文件中;
                        max_binlog_size=
                        sync_binlog={1|0}  :默認是0,此時mysql性能最好,但是也是最危險的,一旦發生崩潰,存在內存緩存中的語句信息將丟失,1是最安全的也是最慢的,幾乎將二進制內存緩存信息與磁盤實時同步刷新;  可以定義N次,每執行多少次事務後刷新緩存到磁盤中

mysqlbinlog: 客戶端程序
                    YYYY-MM-DD   hh:mm:ss

            --start-datetime=
            --stop-datetime=

            -j,  --start-position=
              --stop-position=

                --user, --host, --password

中繼日誌:從服務器上記錄下來從主服務器的二進制日誌文件同步過來的事件;

事務日誌:事務型存儲引擎innodb用於保證事務特性的日誌文件
redo log
undo log

備份策略:
xtrabackup:
全量+差異+binlog
全量+增量+binlog
mysqldump:
全量+binlog

基於lvm2的備份:
前提:要求數據文件和事務日誌位於同一個邏輯卷:
1)請求鎖定所有表:
mysql > FLUSH TABLES WITH READ LOCK;
2) 記錄二進制文件事件位置:
mysql > FLUSH LOGS;
mysql > SHOW MASTER STATUS;
mysql -e ‘SHOW MASTER STATUS;‘ >> /PATH/TO/SOME_POS_FILE

             3)創建快照卷
                 lvcreate  -s  -L 100M  -p r  -n SNAP-NAME  /dev/VG-name/lv-name
                4) 釋放鎖
                    mysql > UNLOCK  TABLES;
                5) 掛載快照卷,並執行備份,備份完成後刪除快照卷;
                6) 周期性備份二進制日誌;

Xtrabackup:

        備份 --> 應用日誌  --> 還原
                        應用日誌: --apply-log
                        還原: --copy-back

        完全備份: 完全+binlog(總結):

                     備份: 完全+增量+binlog...
                     準備:
                                        innobackupex   --apply-log  --redo-only  BASEDIR
                                        innobackupex   --apply-log   --redo-only  BASEDIR  --incremental-dir=INCREMENTTAL-DIR
                        恢復:
                                        innobackupex    --copy-back   BASEDIR

         備份單庫:
                         --databases;

    總結:
                    mysqldump+binlog
                    lvm2+cp/tar+binlog
                    xtrabackup(innodb)+binlog

實驗【mysql主從復制架構與進階】:

MySQL雙主(master-master)+半同步(Semisync Replication)

一、環境
主機名 主機IP

mysqlA 172.18.252.221

mysqB 172.18.252.222

操作系統: CentOS 6.5 2.6.32-431.el6.x86_64

MySQL版本 mysql-community-server-5.7.5-0.6.m15.el6.x86_64

二、架構

1.mysqlA和mysqlB互為主備,即雙主架構Master-Master

MySQL運維進階-MySQL雙主(master-master)+半同步(Semisync Repl