mysql、mariadb關係型數據庫

MariaDB or MySQL:php

    RDBMS:html

        範式:第一範式、第二範式、第三範式;前端

        表:row, column;node

        關係運算:mysql

        選擇git

        投影github

        數據庫:表、索引、視圖(虛表)、SQL、存儲過程、存儲函數、觸發器、事件調度器;sql

        DDL:CREATE,ALTER,DROPshell

        DML:INSERT/UPDATE/DELETE/SELECT數據庫

    約束:

        主鍵約束:唯1、非空;一張表只能有一個;

        唯一鍵約束:唯一,能夠存在多個;

        外鍵約束:參考性約束;

        檢查性約束:check;


    三層模型:

        物理層 --> SA

        邏輯層 --> DBA

        視圖層 --> Coder

    實現:

        Oracle, DB2, Sybase, Infomix, SQL Server;

        MySQL, MariaDB, PostgreSQL, SQLite;

        MySQL:

            5.1 --> 5.5 --> 5.6 --> 5.7 --> 8.0

        MariaDB:5.5.x --> 10.x


    特性:

        插件式存儲引擎

        單進程多線程


    安裝MySQL:

        OS Vendor:rpm 

        MySQL:

            source code:cmake

            binary package:

                        i686, x86_64; 

                        glibc VERSION

            prepackage:rpm, deb

                        os, arch, 


    服務端程序:

            mysqld, mysqld_safe, mysqld_multi

    客戶端程序:

            mysql, mysqldump, mysqlbinlog, mysqladmin, ...

    非客戶端類管理程序:

            myisamchk, myisampack, ...


        mysqld-5.7

            建立數據目錄,屬主屬組屬於運行者用戶身份mysql;

            初始化:

                mysqld  --initilize-insecure --basedir=/usr/local/mysql --datadir=/data/mysql --user=mysql

            查看配置文件路徑,修改配置文件:/usr/local/mysql/etc/my.cnf

                datadir

                socket

                includedir

                pid

            準備錯誤日誌文件:

            複製啓動腳本:/usr/local/mysql/support-files/mysql.server --> /etc/init.d/mysqld


        配置文件:

                讀取多處的多個配置文件,並且會以指定的次序的進行; 

            # my_print_defaults

                    Default options are read from the following files in the given order:

                    /etc/mysql/my.cnf  /etc/my.cnf ~/.my.cnf 

                    不一樣的配置文件中出現同一參數且擁有不一樣值時,後讀取將爲最終生效值; 


            修改默認讀取的配置文件(mysqld_safe命令):

                    --defaults-file=file_name

            於讀取的默認配置文件以外再加載一個文件:

                    --defaults-extra-file=path


        程序文件:

                服務端程序:mysqld_safe, mysqld_multi

                客戶端程序:mysql, mysqldump, mysqladmin

                工具程序:myisampack, ...


        mysql --> mysql protocol --> mysqld 

                mysql:交互式CLI工具;

                mysql [options] db_name

                    經常使用選項:

                        --host=host_name, -h host_name:服務端地址;

                        --user=user_name, -u user_name:用戶名;

                        --password[=password], -p[password]:用戶密碼; 

                        --port=port_num, -P port_num:服務端端口; 

                        --protocol={TCP|SOCKET|PIPE|MEMORY}:

                            本地通訊:基於本地迴環地址進行請求,將基於本地通訊協議;

                                    Linux:SOCKET

                                    Windows:PIPE,MEMORY

                            非本地通訊:使用非本地迴環地址進行的請求; TCP協議;

                                    --socket=path, -S path

                                    --database=db_name, -D db_name:

                                    --compress, -C:數據壓縮傳輸

                                    --execute=statement, -e statement:非交互模式執行SQL語句;

                                    --vertical, -E:查詢結果縱向顯示;


            命令:

                    客戶端命令:於客戶端執行;

                    服務端命令:SQL語句,須要一次性完整地發往服務端;語句必須有結束符;


                        ?         (\?) Synonym for `help'.

                        clear     (\c) Clear the current input statement.

                        connect   (\r) Reconnect to the server. Optional arguments are db and host.

                        delimiter (\d) Set statement delimiter.

                        edit      (\e) Edit command with $EDITOR.

                        ego       (\G) Send command to mysql server, display result vertically.

                        exit      (\q) Exit mysql. Same as quit.

                        go        (\g) Send command to mysql server.

                        help      (\h) Display this help.

                        nopager   (\n) Disable pager, print to stdout.

                        notee     (\t) Don't write into outfile.

                        pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.

                        print     (\p) Print current command.

                        prompt    (\R) Change your mysql prompt.

                        quit      (\q) Quit mysql.

                        rehash    (\#) Rebuild completion hash.

                        source    (\.) Execute an SQL script file. Takes a file name as an argument.

                        status    (\s) Get status information from the server.

                        system    (\!) Execute a system shell command.

                        tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.

                        use       (\u) Use another database. Takes database name as argument.

                        charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.

                        warnings  (\W) Show warnings after every statement.

                        nowarning (\w) Don't show warnings after every statement.

                    

            mysql命令的使用幫助:

                    # man mysql

                    # mysql  --help  --verbose


            sql腳本運行:

                    mysql [options] [DATABASE] < /PATH/FROM/SOME_SQL_SCRIPT


        mysqld服務器程序:工做特性的定義方式

                    命令行選項

                    配置文件參數


                        SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]


                    服務器參數/變量:設定MySQL的運行特性;

                        mysql> SHOW GLOBAL|[SESSION] VARIABLES [LIKE clause];

                    狀態(統計)參數/變量:保存MySQL運行中的統計數據或狀態數據;

                        mysql> SHOW GLOBA|[SESSION] STATUS [LIKE clause];

                    顯示單個變量設定值的方法:

                        mysql> SELECT @@[global.|session.]system_var_name


                            %:匹配任意長度的任意字符;

                            _:匹配任意單個字符;


        變量/參數級別:

                全局:爲全部會話設定默認; 

                會話:跟單個會話相關;會話創建會從全局繼承;

            服務器變量的調整方式:

                運行時修改:

                    global:僅對修改後新創建的會話有效;

                    session:僅對當前會話有效,且當即生效;

                啓動前經過配置文件修改:

                    重啓後生效;

                運行時修改變量值操做方法:

                    mysql> HELP SET

                    SET [GLOBAL | SESSION] system_var_name = expr

                    SET [@@global. | @@session. | @@]system_var_name = expr

                    注:GLOBAL值的修改要求用戶擁有管理權限;


            安裝完成後的安全初始化:

                    mysql_secure_installation


            運行前常修改的參數:

                    innodb_file_per_table=ON

                    skip_name_resolve=ON

                    ...



        MySQL的數據類型:

                字符型

                數值型

                日期時間型

                內建類型

                字符型:

                        CHAR(#), BINARY(#):定長型;CHAR不區分字符大小寫,而BINARY區分;

                        VARCHAR(#), VARBINARY(#):變長型

                        TEXT:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT

                        BLOB:TINYBLOB,BLOB,MEDIUMBLOB, LONGBLOB

               數值型:

                    浮點型:近似

                        FLOAT

                        DOUBLE

                        REAL

                        BIT

                   整型:精確

                        INTEGER:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT

                        DECIMAL

                   日期時間型:

                        日期:DATE

                        時間:TIME

                        日期j時間:DATETIME

                        時間戳:TIMESTAMP

                        年份:YEAR(2), YEAR(4)

                   內建:

                        ENUM:枚舉

                        ENUM('Sun','Mon','Tue','Wed')

                    SET:集合


            類型修飾符:

                        字符型:NOT NULL,NULL,DEFALUT ‘STRING’,CHARACET SET ‘CHARSET’,COLLATION ‘collocation'

                        整型:NOT NULL, NULL, DEFALUT value, AUTO_INCREMENT, UNSIGNED

                        日期時間型:NOT NULL, NULL, DEFAULT 


            SQL MODE:定義mysqld對約束等違反時的響應行爲等設定;

                    經常使用的MODE:

                            TRADITIONAL

                            STRICT_TRANS_TABLES

                            STRICT_ALL_TABLES              

                    修改方式:

                            mysql> SET GLOBAL sql_mode='MODE';

                            mysql> SET @@global.sql_mode='MODE';



            SQL:DDL,DML

                      DDL:

                               mysql> HELP Data Definition

                                

                               CREATE, ALTER, DROP

                                            DATABASE, TABLE

                                            INDEX, VIEW, USER

                                            FUNCTION, FUNCTION UDF, PROCEDURE, TABLESPACE, TRIGGER, SERVER 

                                

                     DML:

                                mysql> HELP Data Manipulation

                                

                                INSERT/REPLACE, DELETE, SELECT, UPDATE

                                

                     數據庫:

                                CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name CHARACTER SET [=] charset_name  COLLATE [=] collation_name

                                

                                ALTER {DATABASE | SCHEMA} [db_name] CHARACTER SET [=] charset_name  COLLATE [=] collation_name

                                

                                DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

                                

                       表:

                           CREATE 

                                (1) CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

                                        (create_definition,...)

                                        [table_options]

                                        [partition_options]

                                

                                        CREATE TABLE [IF NOT EXISTS] tble_name (col_name  data_typ|INDEX|CONSTRAINT);

                                

                                table_options:

                                        ENGINE [=] engine_name

                                

                                查看支持的全部存儲引擎:

                                        mysql> SHOW ENGINES;

                                

                                查看指定表的存儲引擎:

                                        mysql> SHOW TABLE STATUS LIKE clause;

                                

                                        ROW_FORMAT [=] {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}

                                

                                (2) CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

                                        [(create_definition,...)]

                                        [table_options]

                                        [partition_options]

                                        select_statement

                                            直接建立表,並將查詢語句的結果插入到新建立的表中;

                                

                                (3) CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name

                                { LIKE old_tbl_name | (LIKE old_tbl_name) }

                                           複製某存在的表的結構來建立新的空表;

                                

                          DROP:

                                DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name]; 

                                

                          ALTER:

                                ALTER  TABLE tbl_name

                                [alter_specification [, alter_specification] ...]

                                

                                可修改內容:

                                        (1) table_options

                                        (2) 添加定義:ADD

                                                字段、字段集合、索引、約束

                                        (3) 修改字段:

                                                CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST|AFTER col_name]

                                                MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]

                                        (4) 刪除操做:DROP

                                                字段、索引、約束

                                

                                    表重命名:

                                        RENAME [TO|AS] new_tbl_name

                                

                                查看錶結構定義:

                                        DESC tbl_name;

                                

                                查看錶定義:

                                        SHOW CREATE TABLE tbl_name

                                

                                查看錶屬性信息:

                                            SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]


                       

                   索引類型:

                            彙集索引、非彙集索引:索引是否與數據存在一塊兒;

                            主鍵索引、輔助索引

                            稠密索引、稀疏索引:是否索引了每個數據項;

                            BTREE(B+)、HASH、R Tree、FULLTEXT

                            BTREE:左前綴;

                            

                            EXPLAIN:分析查詢語句的執行路徑;

                    索引:

                            建立:

                            CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...)

                            

                            查看:

                            SHOW {INDEX | INDEXES | KEYS} {FROM | IN} tbl_name [{FROM | IN} db_name] [WHERE expr]

                            

                            刪除:

                            DROP  INDEX index_name ON tbl_name

                            

                            

                    視圖:VIEW

                            虛表:存儲下來的SELECT語句;

                            

                            建立:

                            CREATE  VIEW view_name [(column_list)] AS select_statement

                            

                            修改:

                            ALTER  VIEW view_name [(column_list)] AS select_statement

                            

                            刪除:

                            DROP VIEW [IF EXISTS] view_name [, view_name] ...



DML:

                INSERT/REPLACE,DELETE,UPDATE,SELECT

                

                INSERT:

                單行插入

                批量插入

                

                INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

                [INTO] tbl_name [(col_name,...)]

                {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

                [ ON DUPLICATE KEY UPDATE

                col_name=expr

                [, col_name=expr] ... ]

                

                Or:

                

                INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]

                [INTO] tbl_name

                SET col_name={expr | DEFAULT}, ...

                [ ON DUPLICATE KEY UPDATE

                col_name=expr

                [, col_name=expr] ... ]

                

                Or:

                

                INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

                [INTO] tbl_name [(col_name,...)]

                SELECT ...

                [ ON DUPLICATE KEY UPDATE

                col_name=expr

                [, col_name=expr] ... ]

                

                DELETE:

                

                DELETE  FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]

                

                注意:必定要有限制條件,不然將清空整個表;

                限制條件:

                [WHERE where_condition]

                 [ORDER BY ...] [LIMIT row_count]

                 

                UPDATE:

                

                UPDATE table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...

                [WHERE where_condition]

                [ORDER BY ...]

                [LIMIT row_count]

                

                注意:必定要有限制條件,不然將修改整個表中指定字段的數據;

                限制條件:

                [WHERE where_condition]

                 [ORDER BY ...] [LIMIT row_count]

                 

                

                注意:sql_safe_updates變量可阻止不帶條件更新操做;

                

                SELECT:

                

                Query Cache:緩存查詢的執行結果;

                key:查詢語句的hash值; 

                value:查詢語句的執行結果;

                

                SQL語句的編寫方式:

                SELECT name FROM tbl2;

                select name from tbl2;

                

                查詢執行路徑:

                請求-->查詢緩存

                請求-->查詢緩存-->解析器-->預處理器-->優化器-->查詢執行引擎-->存儲引擎-->緩存-->響應

                

                

                SELECT語句的執行流程:

                FROM  --> WHERE --> Group By --> Having --> Order BY --> SELECT --> Limit 

                

                單表查詢:

                        SELECT

                        [ALL | DISTINCT | DISTINCTROW ]

                        [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]

                        select_expr [, select_expr ...]

                        [FROM table_references

                        [WHERE where_condition]

                        [GROUP BY {col_name | expr | position}

                        [ASC | DESC], ... [WITH ROLLUP]]

                        [HAVING where_condition]

                        [ORDER BY {col_name | expr | position}

                        [ASC | DESC], ...]

                        [LIMIT {[offset,] row_count | row_count OFFSET offset}]

                                    用法:

                                    SELECT col1, col2, ... FROM tble_name;   極其危險,慎用;

                                    SELECT col1, col2, ... FROM tble_name WHERE clause;

                                    SELECT col1, col2, ... FROM tble_name  [WHERE clause] GROUP BY col_name [HAVING clause]; 

                                    

                                    DISTINCT:數據去重;

                                    SQL_CACHE:顯式指定緩存查詢語句的結果;

                                    SQL_NO_CACHE:顯式指定不緩存查詢語句的結果;

                                    

                                    query_cache_type服務器變量有三個值:

                                    ON:啓用; 

                                    SQL_NO_CACHE:不緩存;默認符合緩存條件都緩存;

                                    OFF:關閉;

                                    DEMAND:按需緩存;

                                    SQL_CACHE:緩存;默認不緩存;

                                    

                                    字段可使用別名 :

                                    col1 AS alias1, col2 AS alias2, ...

                                    

                                    WHERE子句:指明過濾條件以實現「選擇」功能;

                                    過濾條件:布爾型表達式;

                                    

                                    [WHERE where_condition]

                                    算術操做符:+, -, *, /, %

                                    比較操做符:=, <>, !=, <=>, >, >=, <, <=

                                    

                                    IS NULL, IS NOT NULL

                                    區間:BETWEEN min AND max 

                                    IN:列表;

                                    LIKE:模糊比較,%和_;

                                    RLIKE或REGEXP

                                    

                                    邏輯操做符:

                                    AND, OR, NOT

                                    

                                    GROUP BY:根據指定的字段把查詢的結果進行「分組」以用於「聚合」運算;

                                    avg(), max(), min(), sum(), count()

                                    

                                    HAVING:對分組聚合後的結果進行條件過濾;

                                    

                                    ORDER BY:根據指定的字段把查詢的結果進行排序;

                                    升序:ASC

                                    降序:DESC 

                                    

                                    LIMIT:對輸出結果進行數量限制

                                    [LIMIT {[offset,] row_count | row_count OFFSET offset}]



            多表查詢:

            鏈接操做:

                        交叉鏈接(cross join):笛卡爾乘積;沒有任何條件限制的鏈接方式

                                示例:select * from tb1,tb2;

                                          select * from tb1 cross join tb2;

                        內鏈接(inner join):多張表中同時符合某種條件的數據記錄的組合;官方建議標準寫法:select * from tb1 inner join tb2 on tb1.tid=tb2.bid;

                                等值鏈接:使用「=」做爲鏈接條件鏈接兩張表;

                                    示例:select * from tb1,tb2 where tb1.tid=tb2.bid;

                                不等值鏈接:沒有使用「=」做爲鏈接條件鏈接兩張表;

                                    示例:select * from tb1,tb2 where tb1.tid>tb2.bid;

                                    示例:select * from tb1,tb2 where tb1.tid<tb2.bid;

                                自鏈接:鏈接的表爲一張表,即本身鏈接本身;

                                    示例:select * from tb1,tb1 where tb1.tid=tb1.id;

                                天然鏈接(natural join):經過MySql本身的判斷完成鏈接過程,不須要指定鏈接條件。MySql會使用表內的,相同的字段,做爲鏈接條件

                                    示例:select * from tb1 natural join tb2;   


                      外鏈接:

                                左外鏈接:以左表爲基準鏈接兩表,即左表的全部數據都展現出來,符合條件的相互鏈接,不符合條件記錄跟右側的「空記錄」鏈接

                                FROM tb1 LEFT JOIN tb2 ON tb1.col = tb2.col 

                                右外鏈接:以右表爲基準鏈接兩表,即右表的全部數據都展現出來,符合條件的相互鏈接,不符合條件記錄跟左側的「空記錄」鏈接

                                FROM tb1 RIGHT JOIN tb2 ON tb1.col = tb2.col 


                        全鏈接(full join):會把兩個表全部的行都顯示在結果表中mariadb不能直接使用full join實現全鏈接;變相實現方式爲left join、union、right join組合來實現;

                                示例:select * from tb1 left join tb2 on tb1.tid=tb2.id union select * from tb1 right join tb2 on tb1.tid=tb2.id;

            

            子查詢:在查詢中嵌套查詢;

                    用於WHERE子句中的子查詢;

                    (1) 用於比較表達式中的子查詢:子查詢僅能返回單個值; 

                    (2) 用於IN中的子查詢:子查詢能夠返回一個列表值; 

                    (3) 用於EXISTS中的子查詢:

                    用於FROM子句中的子查詢;

                    SELECT tb_alias.col1, ... FROM (SELECT clause) AS tb_alias WHERE clause; 

            

            聯合查詢:將多個查詢語句的執行結果相合並;

                        UNION:重複的數據會被合併爲一條;

                                    SELECT clause UNION SELECT cluase;                       

                        UNION ALL:不合並重復的數據;

                                    SELECT clause UNION ALL SELECT cluase;



      MySQL用戶和權限管理 

                用戶帳號:user@host

                user:帳戶名稱;

                host:此帳戶可經過哪些客戶端主機請求建立鏈接線程; 

                %:任意長度牟任意字符;

                _:任意單個字符;

                

                skip_name_resolve=ON

        MySQL權限類別:

        庫級別:

        表級別:

        字段級別:

        管理類:

        程序類:

                        管理類:

                        CREATE USER

                        RELOAD

                        LOCK TABLES

                        REPLICATION CLIENT, REPLICATION SLAVE

                        SHUTDOWN

                        FILE

                        SHOW DATABASES

                        PROCESS 

                        SUPER

                        

                        程序類:

                        FUNCTION,PROCEDURE,TRIGGER

                        

                        操做:CREATE,ALTER,DROP,EXECUTE

                        

                        庫和表級別:

                        CREATE,ALTER,DROP

                        INDEX

                        CREATE VIEW

                        SHOW VIEW

                        GRANT:可以把本身得到的權限生成一個副本轉贈給其它用戶;

                        OPTION

            數據操做:

            表:

            INSERT/DELETE/UPDATE/SELECT 

            

            字段:

            SELECT(col1,col2,...)

            UPDATE(col1,col2,...)

            INSERT(col1,col2,...)

            

            全部權限:ALL, ALL PRIVILEGES

            

            元數據數據庫(數據字典):mysql

            受權:

            db, host, user

            tables_priv, column_priv, procs_priv, proxies_priv

            

            

            MySQL用戶管理:

            'user'@'host';

            host:

            IP

            主機名

            NETWORK

            %, _

            

            skip_name_resolve={ON|OFF}


        建立用戶:

        CREATE USER  'user'@'host' [IDENTIFIED BY [PASSWORD] 'password'] [,'user'@'host' [IDENTIFIED BY [PASSWORD] 'password']...]

        

        重命名:RENAME USER

        RENAME USER old_user TO new_user[, old_user TO new_user] ...

        

        刪除用戶:

        DROP USER 'user'@'host' [, 'user'@'host'] ...

        

        讓MySQL從新加載受權表:

        FLUSH PRIVILEGES

        

        修改用戶密碼:

        (1) SET PASSWORD [FOR 'user'@'host'] = PASSWORD('cleartext password');

        (2) UPDATE mysql.user SET Password=PASSWORD('cleartext password')  WHERE User='USERNAME' AND Host='HOST';

        (3) mysqladmin -uUSERNAME -hHOST -p  password 'NEW_PASS'

        

        生效:FLUSH PRIVILEGES

        

        忘記管理員密碼的解決辦法:

        (1) 啓動mysqld進程時,使用--skip-grant-tables和--skip-networking選項;

        CentOS 7:mariadb.service

        CentOS 6:/etc/init.d/mysqld

        (2) 經過UPDATE命令修改管理員密碼; 

        (3) 以正常 方式啓動mysqld進程;

        

        受權:GRANT

        GRANT  priv_type [(column_list)] [, priv_type [(column_list)]] ...

        ON [object_type] priv_level

        TO user_specification [, user_specification] ...

        [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]

        [WITH with_option ...]

        

        object_type:

                TABLE

                | FUNCTION

                | PROCEDURE

        

        priv_level:

                *

                | *.*

                | db_name.*

                | db_name.tbl_name

                | tbl_name

                | db_name.routine_name

        

        

        ssl_option:

                SSL

                | X509

                | CIPHER 'cipher'

                | ISSUER 'issuer'

                | SUBJECT 'subject'

        

        with_option:

                GRANT OPTION

                | MAX_QUERIES_PER_HOUR count

                | MAX_UPDATES_PER_HOUR count

                | MAX_CONNECTIONS_PER_HOUR count

                | MAX_USER_CONNECTIONS count

        

        查看受權:SHOW GRANTS

                SHOW GRANTS [FOR 'user'@'host']

        

        取消受權:REVOKE

                REVOKE  priv_type [(column_list)][, priv_type [(column_list)]] ...

                ON [object_type] priv_level

                FROM  'user'@'host' [,  'user'@'host'] ...

                

                REVOKE ALL PRIVILEGES, GRANT OPTION

                FROM user [, user] ...

        


        查詢緩存:徹底存儲於內存中;

                緩存:k/v 

                key:查詢語句的hash值

                value:查詢語句的執行結果

        

        

        如何判斷緩存是否命中:

                經過查詢語句的哈希值判斷:哈希值考慮的因素包括

                        查詢自己、要查詢數據庫、客戶端使用的協議版本、...

                        查詢語句在任何字符上的不一樣,都會致使緩存不命中;

                

        哪些查詢可能不會被緩存?

                查詢語句中包含UDF

                存儲函數

                用戶自定義變量

                臨時表

                mysql系統表或者是包含列級別權限的查詢

                有着不肯定結果值的函數(now());

        

        查詢緩存相關的服務器變量:

                query_cache_limit:可以緩存的最大查詢結果;(單語句結果集大小上限)

                        有着較大結果集的語句,建議在SELECT中顯式使用SQL_NO_CACHE,以免先緩存再移出; 

                query_cache_min_res_unit:內存塊的最小分配單位;緩存太小的查詢結果集會浪費內存空間;

                        較小的值會減小空間浪費,但會致使更頻繁地內存分配及回收操做; 

                        較大值的會帶來空間浪費,致使碎片過多;

                query_cache_size:查詢緩存空間的總共可用的大小;單位是字節,必須是1024的整數倍;

                query_cache_strip_comments

                query_cache_type:緩存功能啓用與否;

                        ON:啓用;

                        OFF:禁用;

                        DEMAND:按需緩存,僅緩存SELECT語句中帶SQL_CACHE的查詢結果;

                query_cache_wlock_invalidate:若是某表被其它鏈接鎖定,是否仍然能夠從查詢緩存中返回查詢結果;默認爲OFF,表示能夠;ON則表示不能夠;

        

        狀態變量:

                mysql> SHOW GLOBAL STATUS LIKE 'Qcache%';

                +-------------------------+----------+

                | Variable_name           | Value    |

                +-------------------------+----------+

                | Qcache_free_blocks      | 1        |

                | Qcache_free_memory      | 16759688 |

                | Qcache_hits             | 0        |

                | Qcache_inserts          | 0        |

                | Qcache_lowmem_prunes    | 0        |

                | Qcache_not_cached       | 0        |

                | Qcache_queries_in_cache | 0        |

                | Qcache_total_blocks     | 1        |

                +-------------------------+----------+

        

                命中率:

                        Qcache_hits/(Qcache_hits+Com_select) 



        MySQL中的索引:

                基本法則:索引應該構建在被用做查詢條件的字段上;

                

                索引類型:B+ TREE,HASH

                        B+ TREE:順序存儲,每個葉子結點到根結點的距離相同;左前綴索引,適合於範圍類型的數據查詢;


                        適用於B+ TREE索引的查詢類型:全鍵值、鍵值範圍或鍵前綴;

                                全值匹配:精確匹配某個值;

                                        WHERE COLUMN = 'value';

                                匹配最左前綴:只精確起頭的部分;

                                        WEHRE COLUMN LIKE 'PREFIX%';

                                匹配範圍值:

                                精確匹配某一列,範圍匹配另外一列;

                                只用訪問索引的查詢:覆蓋索引;

                                            index(Name)

                                            SELECT Name FROM students WHERE Name LIKE 'L%';


                    不適用B+ TREE索引:

                            若是查條件不是從最左側列開始,索引無效;

                                    index(age,Fname), WHERE Fname='Jerry';    , WHERE age>30 AND Fname='Smith';

                            不能跳過索引中的某列;

                                    index(name,age,gender)

                                    WHERE name='black' and age > 30;

                                    WHERE name='black' AND gender='F';

                            若是查詢中的某個列是爲範圍查詢,那麼其右側的列都沒法再使用索引優化查詢;

                                    WHERE age>30 AND Fname='Smith';


            Hash索引:基於哈希表實現,特別適用於值的精確匹配查詢;

            

            適用場景:

            只支持等值比較查詢,例如=, IN(), <=>

            

            不用場景:

            全部非精確值查詢;MySQL僅對memory存儲引擎支持顯式的hash索引;

            

            索引優勢:

            下降須要掃描的數據量,減小IO次數;

            能夠幫助避免排序操做,避免使用臨時表; 

            幫助將隨機IO轉爲順序IO;

            

            高性能索引策略:

            (1) 在WHERE中獨立使用列,儘可能避免其參與運算;

            WHERE age+2 > 32 ; 

            (2) 左前綴索引:索引構建於字段的最左側的多少個字符,要經過索引選擇性來評估

            索引選擇性:不重複的索引值和數據表的記錄總數的比值;

            (3) 多列索引:

            AND鏈接的多個查詢條件更適合使用多列索引,而非多個單鍵索引;

            (4) 選擇合適的索引列次序:選擇性最高的放左側;

            

            EXPLAIN來分析索引有效性:

            

            EXPLAIN [explain_type] SELECT select_options

            

            explain_type:

            EXTENDED

            | PARTITIONS

            

            輸出結果:

            id: 1

            select_type: SIMPLE

            table: students

            type: const

            possible_keys: PRIMARY

            key: PRIMARY

            key_len: 4

            ref: const

            rows: 1

            Extra: 

            

            id:當前查詢語句中,第個SELECT語句的編號;

            

            複雜的查詢的類型主要三種:

            簡單子查詢

            用於FROM中的子查詢

            聯合查詢

            

            注意:聯合查詢的分析結果會出現一個額外的匿名臨時表;

            

            select_type:查詢類型:

            簡單查詢:SIMPLE

            複雜查詢:

            簡單子查詢:SUBQUERY

            用於FROM中的子查詢:DERIVED

            聯合查詢中的第一個查詢:PRIMARY

            聯合查詢中的第一個查詢以後的其它查詢:UNION

            聯合查詢生成的臨時表:UNION RESULT

            

            table:查詢針對的表;

            

            type:關聯類型,或稱爲訪問類型,即MySQL如何去查詢表中的行

            ALL:全表掃描;

            index:根據索引的順序進行的全表掃描;但同時若是Extra列出現了"Using index」表示使用了覆蓋索引;

            range:有範圍限制地根據索引實現範圍掃描;掃描位置始於索引中的某一項,結束於另外一項;

            ref:根據索引返回的表中匹配到某單個值的全部行(匹配給定值的行不止一個);

            eq_ref:根據索引返回的表中匹配到某單個值的單一行,僅返回一個行,但須要與某個額外的參考值比較,而不是常數;

            const,system:與某個常數比較,且只返回一行;

            

            possiable_keys:查詢中可能會用到的索引;

            

            key:查詢中使用的索引;

            

            key_len:查詢中用到的索引長度;

            

            ref:在利用key字段所顯示的索引完成查詢操做時所引用的列或常量值; 

            

            rows:MySQL估計出的爲找到全部的目標項而須要讀取的行數;

            

            Extra:額外信息

            Using index:使用了覆蓋索引進行的查詢;

            Using where:拿到數據後還要再次進行過濾; 

            Using temporary:使用了臨時表以完成查詢;

            Using filesort:對結果使用了一個外部索引排序;



存儲引擎:

表類型:也稱爲「表類型」,表級別概念,不建議在同一個庫中的表上使用不一樣的ENGINE;

CREATE TABLE ... ENGINE[=]STORAGE_ENGINE_NAME ...

SHOW TABLE STATUS 

常見的存儲引擎:

MyISAM, Aria, InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE, FEDERATED

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,間隙鎖,行級鎖;

索引:彙集索引、輔助索引;

性能:預讀操做、內存數據緩衝、內存索引緩存、自適應Hash索引、插入操做緩存區;

備份:支持熱備;

SHOW ENGINE INNODB STATUS;

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]


事務:

事務:一組原子性的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,持久性;事務一旦提交,其所作出的修改會永久保存;


自動提交:單語句事務   autocommit={0|1};


mysql> SELECT @@autocommit;

+------------------------+

| @@autocommit |

+------------------------+

|            1               |

+------------------------+

mysql> SET @@session.autocommit=0;


手動控制事務:

啓動:START TRANSACTION 

提交:COMMIT

回滾:ROLLBACK


事務支持savepoints:

SAVEPOINT identifier               設置一個保存點

ROLLBACK [WORK] TO [SAVEPOINT] identifier         回滾到特定保存點

RELEASE SAVEPOINT identifier                                刪除特定保存點     


事務隔離級別:

READ-UNCOMMITTED:讀未提交 --> 髒讀;

READ-COMMITTED:讀提交--> 不可重複讀;

REPEATABLE-READ:可重複讀 --> 幻讀;     mysql默認事務隔離級別;

SERIALIZABLE:串行化;


mysql> SELECT @@session.tx_isolation;

+----------------------------------+

| @@session.tx_isolation |

+----------------------------------+

| REPEATABLE-READ         |

+----------------------------------+

查看InnoDB存儲引擎的狀態信息:

SHOW ENGINE innodb STATUS; 





centos 7:手動編譯安裝mariadb

            開發環境:

                # yum groupinstall "development tools" -y 

            1、安裝其餘所需;

                # yum install ncurses-devel openssl-devel libevent-devel jemalloc-devel cmake

            2、下載mariadb源碼包,編譯安裝      

                # groupadd -r mysql

                # useradd -g mysql -r -d /mydata/data mysql

                # tar xf mysql-5.5.33.tar.gz 

                # cd mysql-5.5.33

                # cmake   .  -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

                                  -DMYSQL_DATADIR=/mydata/data \

                                  -DSYSCONFDIR=/etc \

                  -DWITH_INNOBASE_STORAGE_ENGINE=1 \

                                  -DWITH_ARCHIVE_STORAGE_ENGINE=1 \

                                  -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

                  -DWITH_READLINE=1 \

                  -DWITH_SSL=system \

                  -DWITH_ZLIB=system \

                  -DWITH_LIBWRAP=0 \

                  -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \

                  -DDEFAULT_CHARSET=utf8 \

                                  -DDEFAULT_COLLATION=utf8_general_ci

                # make 

                # make install

            3、手動建立systemv文件,樣例以下:/usr/lib/systemd/system/mariadb.service

                            [Unit]

                            Description=MariaDB database server

                            After=syslog.target

                            After=network.target

                            

                            [Service]

                            Type=simple

                            User=mysql

                            Group=mysql

                            

                            ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n

                            # Note: we set --basedir to prevent probes that might trigger SELinux alarms,

                            # per bug #547485

                            ExecStart=/usr/bin/mysqld_safe --basedir=/usr

                            ExecStartPost=/usr/libexec/mariadb-wait-ready $MAINPID

                            

                            # Give a reasonable amount of time for the server to start up/shut down

                            TimeoutSec=300

                            

                            # Place temp files in a secure directory, not /tmp

                            PrivateTmp=true

                            

                            [Install]

                            WantedBy=multi-user.target


                        4、手動執行# systemctl daemon-reload加載;

                            

                

        指定安裝文件的安裝路徑時經常使用的選項:

        -DCMAKE_INSTALL_PREFIX=/usr/local/mysql

        -DMYSQL_DATADIR=/data/mysql

        -DSYSCONFDIR=/etc


        默認編譯的存儲引擎包括:csv、myisam、myisammrg和heap。若要安裝其它存儲引擎,可使用相似以下編譯選項:

        -DWITH_INNOBASE_STORAGE_ENGINE=1

        -DWITH_ARCHIVE_STORAGE_ENGINE=1

        -DWITH_BLACKHOLE_STORAGE_ENGINE=1

        -DWITH_FEDERATED_STORAGE_ENGINE=1

        

        若要明確指定不編譯某存儲引擎,可使用相似以下的選項:

        -DWITHOUT_<ENGINE>_STORAGE_ENGINE=1

        好比:

        -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1

        -DWITHOUT_FEDERATED_STORAGE_ENGINE=1

        -DWITHOUT_PARTITION_STORAGE_ENGINE=1

        

        如若要編譯進其它功能,如SSL等,則可以使用相似以下選項來實現編譯時使用某庫或不使用某庫:

        -DWITH_READLINE=1

        -DWITH_SSL=system

        -DWITH_ZLIB=system

        -DWITH_LIBWRAP=0

        

        其它經常使用的選項:

        -DMYSQL_TCP_PORT=3306

        -DMYSQL_UNIX_ADDR=/tmp/mysql.sock

        -DENABLED_LOCAL_INFILE=1

        -DEXTRA_CHARSETS=all

        -DDEFAULT_CHARSET=utf8

        -DDEFAULT_COLLATION=utf8_general_ci

        -DWITH_DEBUG=0

        -DENABLE_PROFILING=1

        

        若是想清理此前的編譯所生成的文件,則須要使用以下命令:

        make clean

        rm CMakeCache.txt



    mariadb日誌:

            查詢日誌:query log;

                    記錄查詢操做; 記錄於文件file、表table;

                    general_log=on | off                    日誌開啓與否

                    log_output=file | table                日誌保存格式

                    general_log_file=HOSTNAME.log       日誌文件位置及名稱

                    

            慢查詢日誌:slow query log;

                    執行時長超過指定時長的查詢操做;long_query_time以秒爲單位

                    slow_query_log=on | off

                    log_slow_queries

                    slow_query_log_file=HOSTNAME-slow.log

                    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                    慢查詢記錄的詳細程度


            錯誤日誌:error log;

                    記錄mysqld啓動和關閉過程當中輸出的事件信息、mysqld運行中產生的錯誤信息、event scheduler運行一個event時產生的日誌信息、在主從複製架構中的從服務器上啓動從                      服務器線程產生的信息;

                    log_error=/var/log/mariadb/mariadb.log

                    log_warnings=1 | 0            是否記錄警告信息至錯誤日誌文件中

 

            二進制日誌:binary log;

                    記錄致使數據改變或潛在致使數據改變的sql語句;

                    功能:用於經過「重放」日誌文件中的事件來生成數據副本;

                    相關內置查詢命令:

                            SHOW {BINARY | MASTER} LOGS       查看使用的二進制日誌文件列表

                            SHOW MASTER STATUS                    查看正在使用中的二進制日誌文件

                            SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]      查看具體二進制文件中的事件

                    二進制日誌記錄格式:

                            基於「語句」記錄:statement

                            基於「行」記錄:row

                            混合模式:mixed,讓系統自行斷定該基於哪一種方式進行;

                    二進制日誌文件構成:兩類文件:

                            日誌文件:mysql-bin.文件名後綴

                            索引文件:mysql-bin.index

                    服務器變量:

                            sql_log_bin=ON | OFF      是否記錄二進制日誌;

                            log_bin=/PATH/TO/BIN_LOG_FILE         二進制日誌記錄文件位置;建議設置爲mysql-bin

                            binlog_format=STATEMENT                  二進制日誌文件的格式

                            max_binlog_size           單個二進制日誌文件的最大致積;默認爲1G;注意:(1)到達最大值會自動滾動;(2)文件達到上限時的大小未必爲精確值;

                            sync_binlog= 1 | 0               是否啓用二進制日誌同步功能;

                            expire_logs_days                多久自動刪除

                    二進制日誌查看命令:   mysqlbinlog [options] log_file ...



            中繼日誌:reley log;

                    複製架構中,從服務器用於保存從主服務器的二進制中讀取到事件;                    

                    relay_log                    

                    relay_log_index                

                    relay_log_info_file        

                    relay_log_purge              

                    relay_log_recovery             

                    relay_log_space_limit         

                    sync_relay_log                

                    sync_relay_log_info        


            事務日誌:transaction log;

                    事務型存儲引擎自行管理和使用;

                    innodb_log_group_home_dir        事務日誌文件位置

                    innodb_log_files_in_group            組內文件數量

                    innodb_log_file_size                     文件大小



        


            備份和恢復

                    數據備份通常備份:數據、二進制日誌、innodb事務日誌、服務器的配置文件、代碼(存儲過程、存儲函數、觸發器、事件調度器);

                    

                    備份:徹底備份、增量備份、差別備份;

                            熱備:讀寫操做都可進行;

                            溫備:讀操做可執行,但不可寫操做;

                            冷備:讀寫操做均不可進行;


                    設計備份方案:

                            數據集:徹底+增量;

                            備份手段:物理,邏輯;

                       

                    備份工具的選擇:

                            mysqldump+複製binlog:

                                    mysqldump:徹底備份;

                                    複製binlog中指定時間範圍的event:增量備份;

                            lvm2快照+複製binlog:

                                    lvm2快照:使用cp或tar等作物理備份;徹底備份;

                                    複製binlog中指定時間範圍的event:增量備份;

                            xtrabackup:

                                    由percona提供的支持對innodb作熱備份(物理備份)的工具;徹底備份、增量備份;


                

                                    

                    邏輯備份工具:mysqldump、mydumper、phpMyAdmin

                        mysqldump:通常適用於G級別如下的備份;

                                   shell> mysqldump [options] db_name [tbl_name ...]         區別:不會建立數據庫自己,只是備份數據庫信息,還原時需自行建立該數據庫;

                                   shell> mysqldump [options] --databases db_name ...

                                   shell> mysqldump [options] --all-databases


                            MyISAM引擎:支持溫備:鎖定備份庫,然後啓動備份操做;對innodb引擎的表同樣生效,實現溫備;

                                        鎖定方法:

                                               --lock-all-tables:鎖定全部庫的全部表;

                                               --lock-tables:對於每一個單獨的數據庫,在啓動備份以前鎖定全部表,非同時鎖定全部庫的全部表;


                            InnoDB:支持熱備;

                                        --single-transaction


                            其餘選項:

                                        -E,--events:備份指定數據庫相關的全部event scheduler;

                                        -R,--routines:備份指定數據庫相關的全部存儲函數和存儲過程;

                                        --triggers:備份表相關的觸發器;

                                        --master-data=2:記錄爲註釋的CHANGE MASTER TO語句;

                                        --flush-logs:鎖定表完成後,執行flush logs命令;


                            注意:二進制日誌文件不該該與數據文件放在同一磁盤;



            基於lvm2的數據庫備份:

                        (1)請求鎖定全部表:

                                    mysql>  flush tables with read lock;

                        (2)記錄二進制日誌文件及事件位置;

                                    mysql> flush logs;

                                    mysql -e  'show master status'   >   /root/pos.`date +%F`

                        (3)建立快照

                                    lvcreate -L 10G -s -n data-snap -p r    /dev/mydata/data

                        (4)釋放全局鎖;

                                    mysql>  unlock tables;

                        (5)掛載快照卷,執行數據備份;

                                    mount -r  /dev/mydata/data-snap /mnt

                                    cp   -a   /mnt/*   /tmp

                        (6)備份完成後,刪除快照卷;

                        (7)制定好策略,經過原卷備份二進制日誌(建議備份前滾動下二進制日誌);

                                    


            基於lvm2的數據庫還原:

                        (1)建議還原前臨時關閉二進制日誌:

                                    mysql> SET sql_bin_log=0;

                        (2)恢復數據庫文件,除二進制日誌文件;

                                    cp  -a /tmp/mysql/*     /data/mysql

                        (3)啓動數據庫,並查找對應的二進制日誌文件的記錄位置,進行選擇性重放;

                                    systemctl start mariadb

                                    cat /root/pos            查看得知具體position

                                    mysqlbinlog    --start-position=245   mysql-bin.000004



            xtrabackup備份:最小權限的備份用戶只需擁有reload,lock tables,replication client權限便可;

                        注意:僅對innodb引擎支持徹底、增量備份,且不少功能須要開啓innodb_file_per_table;

                        一、徹底備份;BASEDIR爲徹底備份路徑;

                                innobackupex    --user=DBUSER    --password=SECRET     BASEDIR

                        

                        二、增量備份;需指明針對一個徹底備份或者增量備份作備份;即--incremental-basedir

                                innobackupex    --user=DBUSER    --password=SECRET    --incremental    /backup   --incremental-basedir=BASEDIR 


                        三、還原備份步驟:

                                a、準備(prepare),需合併增量到徹底備份上,先合併第一個增量,而後遞歸一直到最後一個;BASEDIR爲徹底備份路徑;

                                        innobackupex     --apply-log    --redo-only     BASEDIR

                                        innobackupex     --apply-log    --redo-only     BASEDIR   --incremental-dir=INCREMENTAL-DIR-1

                                        innobackupex     --apply-log    --redo-only     BASEDIR   --incremental-dir=INCREMENTAL-DIR-2        ......

                                b、中止mysql,並還原備份

                                        systemctl    stop   mariadb

                                        innobackupex     --copy-back    /path/to/backup/dir

                                c、確保數據庫文件屬主屬組正確,並啓動數據庫

                                       

            


            mysql主從複製架構:

                    複製的功用:

                        數據分佈

                        負載均衡

                        備份

                        高可用和故障切換

                        mysql升級測試

                

            主從複製:

                        從節點:

                                I/O  thread:從master請求二進制日誌事件,並保存於中繼日誌中:

                                SQL thread:從中繼日誌中讀取日誌事件,在本地完成重發;


                        主節點:

                                DUMP thread:爲每一個slave的I/O thread啓動一個dump線程,用於向其發送二進制日誌事件;


                        特色:

                                一、異步複製;

                                二、主從數據不一致比較常見;

                    

                        複製架構:

                                M/S,M/M

                                一主多從:從服務器還能夠再有從服務器;


                        二進制日誌事件格式:

                                statement、row、mixed


           主從複製配置:

                    主節點:

                            (1)啓動二進制日誌;

                                    # vim /etc/my.cnf

                                        log_bin=master-bin

                            (2)爲當前節點設置一個全局惟一的ID號;

                                        server_id=1

                            (3)建立有複製權限(replication slave、replication client)的用戶帳號;

                                    # systemctl start mariadb

                                    # mysql -uroot -p

                                    mysql> grant replication slave,replication client on *.*  to 'repluser'@'172.20.120.%'  identified by 'replpass';

                                    mysql> flush privileges;

                    從節點:

                            (1)啓動中繼日誌;

                                    # vim /etc/my.cnf

                                        relay_log=relay-log

                                        relay_log_index=relay_log.index

                            (2)爲當前節點設置一個全局惟一的ID號;

                                        server_id=3

                            (3)使用有複製權限的用戶帳號鏈接至主服務器,並啓動複製線程;

                                    # mysql -uroot -p

                                    mysql> change master to master_host='172.20.120.10',master_user='repluser',master_password='replpass', master_log_file='master-bin.000003',master_log_pos=245;

                                    mysql> start slave;

                                    查看slave信息:mysql> show slave status\G;

                                    

                 複製架構中應該注意的問題:

                            一、限制從服務器爲只讀;read_only=ON;此限制對擁有super權限的用戶均無效;

                                    阻止全部用戶:mysql> flush tables with read lock; 

                            二、如何保證主從複製的事務安全?

                                    在master節點啓用參數:sync_binlog=ON、sync_master_info=ON

                                        若是用到的爲innodb存儲引擎:

                                            innodb_flush_logs_at_trx_commit=ON

                                            innodb_support_xa=ON

                                    在slave節點啓用參數:skip_slave_start=ON、sync_relay_log=ON、sync_relay_log_info=ON


                若是主節點已經運行一段時間,且有大量數據時,如何配置並啓動從節點?

                    一、經過備份恢復數據到從服務器;

                    二、複製起始位置爲備份時的二進制日誌文件及其pos。即

                                    mysql> change master to master_host='172.20.120.10',master_user='repluser',master_password='replpass', master_log_file='master-bin.000003',master_log_pos=245;

                                    mysql> start slave;

                                                                        

           主主複製配置:

                互爲主從:

                    一、數據不一致:所以,慎用;

                    二、自動增加id:

                            配置一個節點使用奇數id,auto_increment_offset=1,auto_increment_increment=2

                            另外一節點使用偶數id,auto_increment_offset=2,auto_increment_increment=2

                配置步驟:

                    一、各節點使用一個惟一server_id;

                    二、都啓用log_bin和relay_log;

                    三、都得建立擁有複製權限(replication slave、replication client)的用戶帳號;

                    四、自定義自動增加id;

                    五、均把對方指定爲主節點,並啓動複製線程;


               半同步複製     相關查看命令:show global variables like '%semi%';      show global status like '%semi%';

                   master:

                        一、mysql> install  plugin rpl_semi_sync_master soname 'semisync_master.so';

                        二、mysql> set global variables rpl_semi_sync_master_enabled=1; 

                             mysql> start slave;

                   slave:

                       一、mysql> install  plugin rpl_semi_sync_slave soname 'semisync_slave.so';      

                       二、mysql> set global variables rpl_semi_sync_slave_enabled=1; 

                            mysql> start slave;                


            複製過濾器:

                        讓從節點僅複製指定的數據庫,或指定數據庫的指定表;

                有兩種實現方式:

                        一、主服務器僅向二進制日誌中記錄與特定數據庫(特定表)相關的事件; 

                                問題:時間點還原沒法實現,不建議使用;

                                具體實施方案:

                                binlog_do_db=                  :數據庫白名單列表,逗號隔開  

                                binlog_ignore_db=                  :數據庫黑名單列表,逗號隔開           

                        二、從服務器SQL_THREAD在replay中繼日誌中的事件時,僅讀取特定的數據庫(特定表)相關的事件並應用於本地;

                                問題:會形成網絡及磁盤IO浪費;

                                具體實施方案:

                                replicate_do_db=

                                replicate_ignore_db=

                                replicate_do_table=

                                replicate_ignore_table=

                                replicate_wild_do_table=

                                replicate_wild_ignore_table=



            基於ssl複製:

                        前提:支持ssl;

                        (1)master端配置證書和私鑰:而且建立一個要求必須使用ssl鏈接的複製帳號;

                                    grant replication slave,replication client on *.*  to 'repluser'@'172.20.120.%'  identified by 'replpass' require ssl;

                        (2)slave端使用change master to 命令時指明ssl相關選項;                                        


                

            跟複製功能相關的文件:

                        master.info:用於保存slave鏈接至master時的相關信息;例如帳號、密碼、服務器地址等等;

                        relay-log.info:保存在當前slave節點上已經複製的當前二進制日誌和本地replay log日誌的對應關係;


            複製的監控和維護:

                        (1)清理日誌:請保證已備份;

                                MySQL>   purge binary log to  'mysql-bin.000002';             清理具體某個二進制日誌以前的全部

                                MySQL>   purge binary log before '2018-04-12 10:00:00';

                        (2)複製監控;

                                MySQL>   show master status;

                                MySQL>   show binlog events;

                                MySQL>   show binary logs;

                                MySQL>   show slave status;

                                MySQL>   show processlist;

                        (3)從服務器是否落後於主服務器;

                                從服務器:MySQL>   show slave status;      ----------> Seconds_Behind_Master: 0     具體查看指標

                        (4)如何肯定主從節點數據是否一致;

                                安裝percona-tools包

                        (5)數據不一致如何修復;

                                肯定以主節點爲準,從新複製;


            


            

            mysql分佈式系統:

                    cap:一致性,可用性、網絡分區容錯性;      


                    切分:cobar、gizzard

                        一、垂直切分:俗稱分庫;

                        二、水平切分: 分表,sharding                                 


            主節點高可用方案:

                    MMM:多主

                    MHA:master HA:經過對主節點進行監控,可實現自動故障轉移至其餘從節點;經過提高某一從節點爲新的主節點;

                    galera cluster:wresp;經過wresp協議,在全局實現複製,任何一節點均可讀寫;        

                   

                    高可用mysql常見方案:

                                heartbeat+drbd

                                mysql cluster

                                半同步複製

                                全局事務ID




                    MHA:master HA:開源的mysql的高可用程序;爲mysql主從複製架構提供automating master failover功能;

                                MHA服務的兩種角色:

                                        MHA manager:一般單獨部署在一個獨立機器上管理多個master/slave集羣;

                                        MHA node:運行在每臺mysql服務器上(master/slave/manager),經過監控具有解析和清理logs功能的腳原本加快故障轉移;



                    MHA環境中主機ssh互信:

                                ssh-keygen -t rsa -P ''

                                cat .ssh/id_rsa.pub >>  .ssh/authorized_keys

                                chmod 600   .ssh/authorized_keys

                                scp -p  .ssh/id_rsa   .ssh/authorized_keys     node2:/root/.ssh

                                scp -p  .ssh/id_rsa   .ssh/authorized_keys     node3:/root/.ssh

                                scp -p  .ssh/id_rsa   .ssh/authorized_keys     node4:/root/.ssh


                    MHA配置文件:

                                global配置,爲各application提供默認配置;

                                application配置:

                                        server


                    centos7下mha環境搭建:

                                mha4mySQL-manager和mha4mysql-node    
                                       https://github.com/yoshinorim/mha4mysql-manager
                                       https://github.com/yoshinorim/mha4mysql-node

                                使用版本分別是:mha4mysql-manager-0.58-0.el7.centos.noarch.rpm、mha4mysql-node-0.58-0.el7.centos.noarch.rpm

                    步驟:

                            1:MHA環境中主機ssh互信;

                            2:搭建好mysql的主從複製;

                            3:配置好配置文件;


                    具體操做可查閱馬哥教育的MHA.PDF文檔;



            複製的問題和解決方案:

                    一、數據損壞或丟失:

                            master:MHA + SEMI repl(半同步複製)

                            slave:從新複製

                    二、混合使用存儲引擎:

                            myisam:不支持事務

                            innodb:支持事務

                    三、不惟一的server id

                            從新複製

                    四、複製延遲

                           須要額外的監控工具輔助

                      

 

           數據庫服務衡量指標:測試工具:sysbench  

                    qps:query per second:每秒查詢量                          

                                use information_schema;

                                select VARIABLE_VALUE into @num_queries from GLOBAL_STATUS where VARIABLE_NAME ='QUESTIONS';

                                select VARIABLE_VALUE into @uptime from GLOBAL_STATUS where VARIABLE_NAME ='UPTIME';

                                select @num_queries/@uptime;


                    tps:transaction per second:每秒事務量                               

                                use information_schema;

                                select VARIABLE_VALUE into @num_com from GLOBAL_STATUS where VARIABLE_NAME ='COM_COMMIT';

                                select VARIABLE_VALUE into @num_roll from GLOBAL_STATUS where VARIABLE_NAME ='COM_ROLLBACK';

                                select VARIABLE_VALUE into @uptime from GLOBAL_STATUS where VARIABLE_NAME ='UPTIME';

                                select (@num_com+@num_roll)/@uptime;


            基於galera cluster構建多主模型的複製集羣:無需前端動靜分離,可直接負載均衡便可;動靜分離(mysql-proxy等目前不成熟),不少時候需自研工具;

                    wresp協議;                    

                        percona-cluster

                        mariadb-cluster:對應的軟件由https://downloads.mariadb.org官網提供下載                    

                                優勢:網絡狀態可用狀況下,節點間基本實時數據同步,完勝MHA的日誌可能不一樣步;

                                特色:分擔讀操做,前端不必讀寫分離、只需作負載均衡便可。

                                條件:一、至少要三個節點;二、不能安裝mariadb-server。

                                配置文件參數解釋:注意配置文件需節點都設置;

                                # cat /etc/my.cnf.d/server.cnf

                                [galera]

                                # Mandatory settings

                                wsrep_provider= "/usr/lib64/galera/libgalera_smm.so"#插件;

                                wsrep_cluster_address="gcomm://172.20.120.67,172.20.120.68,172.20.120.69"

                                wsrep_cluster_name=my_galera_cluster

                                #wsrep_node_address=#節點地址,可省略;

                                #wsrep_node_name=#節點名,可省略;

                                binlog_format=row#二進制日誌格式;

                                default_storage_engine=InnoDB

                                innodb_autoinc_lock_mode=2#鎖格式;

                                bind-address=0.0.0.0#工做時監聽的地址;

                                

                                首次啓動時,須要初始化集羣,在其中任意節點上執行以下命令:

                                /etc/init.d/mysql start --wsrep-new-cluster [--wsrep_cluster_name=my_galera_cluster]

                                

                                然後正常啓動其餘節點:

                                /etc/init.d/mysql start

                                                        

                    


            中間件實現mysql讀寫分離:                        

                    mysql-proxy----->atlas(奇虎)

                    amoeba

相關文章
相關標籤/搜索