1. 程式人生 > >Mysql數據庫介紹、安裝和配置文件

Mysql數據庫介紹、安裝和配置文件

username 存取 空閑 交互式 遠程登錄 現在 centos7 delet 取數

Mysql數據庫介紹、安裝和配置文件

MySQL數據庫介紹

    mysql是開源關系型數據庫,遵循GPL協議。
    mysql的特點是性能卓越且服務穩定,開源,無版本限制,成本低,單進程多線程,多用戶,基於C/S(客戶端/服務端)架構,安全可靠,插入式存儲引擎。
    mysql的另個版本為MariaDB,MariaDB是單進程,多線程的,提供了諸多擴展和新特性,提供了較多測試組件並且同樣開源。

mysql系統結構


    一.邏輯模塊組成    
        MySQL 可以看成是二層架構。
        第一層我們通常叫做SQL Layer,在MySQL 數據庫系統處理底層數據之前的所有工作都是在這一層完成的,包括權限判斷,sql 解析,執行計劃優化,querycache 的處理等等
        第二層就是存儲引擎層,我們通常叫做Storage Engine Layer,也就是底層數據存取操作實現部分,由多種存儲引擎共同組成。
        SQL Layer 中包含了多個子模塊。
        初始化模塊
            初始化模塊就是在MySQL Server 啟動的時候,對整個系統做各種各樣的初始化操作,比如各種buffer,cache 結構的初始化和內存空間的申請,各種系統變量的初始化設定,各種存儲引擎的初始化設置等。
        核心API
            核心API 模塊主要是為了提供一些需要非常高效的底層操作功能的優化實現,包括各種底層數據結構的實現,特殊算法的實現,字符串處理,數字處理等,小文件I/O,格式化輸出,以及最重要的內存管理部分。
            核心API 模塊的所有源代碼都集中在mysys和strings文件夾下面。
        網絡交互模塊
            底層網絡交互模塊抽象出底層網絡交互所使用的接口API,實現底層網絡數據的接收與發送,以方便其他各個模塊調用,以及對這一部分的維護,所有源碼都在vio 文件夾下面。
        Client& Server 交互協議模塊
            任何C/S 結構的軟件系統,都肯定會有自己獨有的信息交互協議,MySQL 也不例外。MySQL的Client & Server 交互協議模塊部分,實現了客戶端與MySQL 交互過程中的所有協議。當然這些協議都是建立在現有的OS 和網絡協議之上的,如TCP/IP 以及Unix Socket。
        用戶模塊
            用戶模塊所實現的功能,主要包括用戶的登錄連接權限控制和用戶的授權管理。
            他就像MySQL 的大門守衛一樣,決定是否給來訪者“開門”。
        
        訪問控制模塊
            需要訪問控制模塊實時監控用戶的每一個動作,給不同的用戶以不同的權限。
            訪問控制模塊實現的功能就是根據用戶模塊中各用戶的授權信息,以及數據庫自身特有的各種約束,來控制用戶對數據的訪問。
            用戶模塊和訪問控制模塊兩者結合起來,組成了MySQL 整個數據庫系統的權限安全管理的功能。
        連接管理、連接線程和線程管理
            連接管理模塊負責監聽對MySQL Server 的各種請求,接收連接請求,轉發所有連接請求到線程管理模塊。
            每一個連接上MySQL Server 的客戶端請求都會被分配(或創建)一個連接線程為其單獨服務。
            而連接線程的主要工作就是負責MySQL Server 與客戶端的通信,接受客戶端的命令請求,傳遞Server 端的結果信息等。
            線程管理模塊則負責管理維護這些連接線程,包括線程的創建,線程的cache 等。
        
        Query 解析和轉發模塊
            在MySQL 中我們習慣將所有Client端發送給Server 端的命令都稱為query,在MySQL Server 裏面,連接線程接收到客戶端的一個Query 後,會直接將該query 傳遞給專門負責將各種Query 進行分類然後轉發給各個對應的處理模塊,這個模塊就是query 解析和轉發模塊。
            其主要工作就是將query 語句進行語義和語法的分析,然後按照不同的操作類型進行分類,然後做出針對性的轉發。
        
        QueryCache 模塊
            Query Cache 模塊在MySQL 中是一個非常重要的模塊,他的主要功能是將客戶端提交給MySQL 的Select 類query 請求的返回結果集cache 到內存中,與該query 的一個hash 值做一個對應。
            該Query 所取數據的基表發生任何數據的變化之後,MySQL 會自動使該query 的Cache 失效。
            在讀寫比例非常高的應用系統中,Query Cache 對性能的提高是非常顯著的,當然它對內存的消耗也是非常大的。
        
        Query 優化器模塊
            Query 優化器,就是優化客戶端請求的query,根據客戶端請求的query 語句,和數據庫中的一些統計信息,在一系列算法的基礎上進行分析,得出一個最優的策略,告訴後面的程序如何取得這個query 語句的結果。
        
        表變更管理模塊
            表變更管理模塊主要是負責完成一些DML 和DDL 的query,如:update,delte,insert,create table,alter table 等語句的處理。
        
        表維護模塊
            表的狀態檢查,錯誤修復,以及優化和分析等工作都是表維護模塊需要做的事情。
        
        系統狀態管理模塊
            系統狀態管理模塊負責在客戶端請求系統狀態的時候,將各種狀態數據返回給用戶,像DBA 常用的各種showstatus 命令,showvariables 命令等,所得到的結果都是由這個模塊返回的。
        
        表管理器
            這個模塊從名字上看來很容易和上面的表變更和表維護模塊相混淆,但是其功能與變更及維護模塊卻完全不同。
            每一個MySQL 的表都有一個表的定義文件,也就是*.frm文件。
            表管理器的工作主要就是維護這些文件,以及一個cache,
            該cache 中的主要內容是各個表的結構信息,此外它還維護table 級別的鎖管理。
        
        日誌記錄模塊
            日誌記錄模塊主要負責整個系統級別的邏輯層的日誌的記錄,包括error log,binary log,slow query log 等。
        
        復制模塊
            復制模塊又可分為Master 模塊和Slave 模塊兩部分, Master 模塊主要負責在Replication 環境中讀取Master 端的binary 日誌,以及與Slave 端的I/O 線程交互等工作。
            Slave 模塊比Master 模塊所要做的事情稍多一些,在系統中主要體現在兩個線程上面。
            一個是負責從Master請求和接受binary 日誌,並寫入本地relay log 中的I/O 線程。
            另外一個是負責從relay log 中讀取相關日誌事件,然後解析成可以在Slave 端正確執行並得到和Master端完全相同的結果的命令並再交給Slave 執行的SQL 線程。
        
        存儲引擎接口模塊
            存儲引擎接口模塊可以說是MySQL 數據庫中最有特色的一點了。
            目前各種數據庫產品中,基本上只有MySQL 可以實現其底層數據存儲引擎的插件式管理。
            這個模塊實際上只是一個抽象類,但正是因為它成功地將各種數據處理高度抽象化,才成就了今天MySQL 可插拔存儲引擎的特色。
    
    二、各模塊工作配合   
        在了解了MySQL 的各個模塊之後,我們再看看MySQL各個模塊間是如何相互協同工作的。
        當我們執行啟動MySQL 命令之後,MySQL 的初始化模塊就從系統配置文件中讀取系統參數和命令行參數,並按照參數來初始化整個系統,如申請並分配buffer,初始化全局變量,以及各種結構等。
        同時各個存儲引擎也被啟動,並進行各自的初始化工作,當整個系統初始化結束後,由連接管理模塊接手。
        連接管理模塊會啟動處理客戶端連接請求的監聽程序,包括tcp/ip 的網絡監聽,還有unix 的socket,這時候,MySQL Server 就基本啟動完成,準備好接受客戶端請求了。
        當連接管理模塊監聽到客戶端的連接請求(借助網絡交互模塊的相關功能),雙方通過Client & Server 交互協議模塊所定義的協議“寒暄”幾句之後,連接管理模塊就會將連接請求轉發給線程管理模塊,去請求一個連接線程。
        線程管理模塊馬上又會將控制交給連接線程模塊,告訴連接線程模塊:現在我這邊有連接請求過來了,需要建立連接,你趕快處理一下。
        連接線程模塊在接到連接請求後,首先會檢查當前連接線程池中是否有被cache 的空閑連接線程,如果有,就取出一個和客戶端請求連接上,如果沒有空閑的連接線程,則建立一個新的連接線程與客戶端請求連接。
        當然,連接線程模塊並不是在收到連接請求後馬上就會取出一個連接線程連和客戶端連接,而是首先通過調用用戶模塊進行授權檢查,只有客戶端請求通過了授權檢查後,他才會將客戶端請求和負責請求的連接線程連上。
        在MySQL 中, uery,需要調用Parser 也就是Query 解析和轉發模塊的解析才能夠執行的請求。
            一種是command,不需要調用Parser 就可以直接執行的請求。
        如果我們的初始化配置中打開了Full QueryLogging 的功能,那麽Query 解析與轉發模塊會調用日誌記錄模塊將請求計入日誌,不管是一個Query 類型的請求還是一個command 類型的請求,都會被記錄進入日誌,所以出於性能考慮,一般很少打開Full QueryLogging 的功能。
        當客戶端請求和連接線程“互換暗號(互通協議)”接上頭之後,連接線程就開始處理客戶端請求發送過來的各種命令(或者query),接受相關請求。
        它將收到的query語句轉給Query 解析和轉發模塊,Query 解析器先對Query 進行基本的語義和語法解析,然後根據命令類型的不同,有些會直接處理,有些會分發給其他模塊來處理。
        如果是一個Query 類型的請求,會將控制權交給Query解析器,Query 解析器首先分析看是不是一個select 類型的query,如果是,則調用查詢緩存模塊,讓它檢查該query 在query cache 中是否已經存在。
        如果有,則直接將cache 中的數據返回給連接線程模塊,然後通過與客戶端的連接的線程將數據傳輸給客戶端。
        如果不是一個可以被cache 的query類型,或者cache 中沒有該query 的數據,那麽query 將被繼續傳回query 解析器,讓query解析器進行相應處理,再通過query 分發器分發給相關處理模塊。
        如果解析器解析結果是一條未被cache 的select 語句,則將控制權交給Optimizer,也就是Query 優化器模塊,如果是DML 或者是DDL 語句,則會交給表變更管理模塊,如果是一些更新統計信息、檢測、修復和整理類的query 則會交給表維護模塊去處理,復制相關的query 則轉交給復制模塊去進行相應的處理,請求狀態的query 則轉交給了狀態收集報告模塊。
        實際上表變更管理模塊根據所對應的處理請求的不同,是分別由insert 處理器、delete 處理器、update 處理器、create 處理器,以及alter 處理器這些小模塊來負責不同的DML和DDL 的。
        在各個模塊收到Query 解析與分發模塊分發過來的請求後,首先會通過訪問控制模塊檢查連接用戶是否有訪問目標表以及目標字段的權限,如果有,就會調用表管理模塊請求相應的表,並獲取對應的鎖。表管理模塊首先會查看該表是否已經存在於table cache 中,如果已經打開則直接進行鎖相關的處理,如果沒有在cache 中,則需要再打開表文件獲取鎖,然後將打開的表交給表變更管理模塊。
        當表變更管理模塊“獲取”打開的表之後,就會根據該表的相關meta 信息,判斷表的存儲引擎類型和其他相關信息。
        根據表的存儲引擎類型,提交請求給存儲引擎接口模塊,調用對應的存儲引擎實現模塊,進行相應處理。
        不過,對於表變更管理模塊來說,可見的僅是存儲引擎接口模塊所提供的一系列“標準”接口,底層存儲引擎實現模塊的具體實現,對於表變更管理模塊來說是透明的,他只需要調用對應的接口,並指明表類型,接口模塊會根據表類型調用正確的存儲引擎來進行相應的處理。
        當一條query 或者一個command 處理完成(成功或者失敗)之後,控制權都會交還給連接線程模塊。
        如果處理成功,則將處理結果(可能是一個Result set,也可能是成功或者失敗的標識)通過連接線程反饋給客戶端。
        如果處理過程中發生錯誤,也會將相應的錯誤信息發送給客戶端,然後連接線程模塊會進行相應的清理工作,並繼續等待後面的請求,重復上面提到的過程,或者完成客戶端斷開連接的請求。
        如果在上面的過程中,相關模塊使數據庫中的數據發生了變化,而且MySQL 打開了binlog 功能,則對應的處理模塊還會調用日誌處理模塊將相應的變更語句以更新事件的形式記錄到相關參數指定的二進制日誌文件中。
        在上面各個模塊的處理過程中,各自的核心運算處理功能部分都會高度依賴整個MySQL的核心API 模塊,比如內存管理,文件I/O,數字和字符串處理等等。

mysql安裝方式

    1 、源代碼:編譯安裝
    2 、二進制格式的程序包:
        展開至特定路徑,並經過簡單配置後即可使用
    3 、程序包管理器管理的程序包
        CentOS 安裝光盤
        項目官方:
        https://downloads.mariadb.org/mariadb/repositories/

通用二進制格式安裝過程

    安裝mariadb
        1)準備用戶
            groupadd -r  mysql
            useradd -r -g -u 306 -m -d /app/data -s /sbin/nologin mysql
        2)準備數據目錄
            以/app/data 為例, 建議使用邏輯卷
            chown mysql:mysql /app/data
        3)準備二進制程序
            tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local
            cd /usr/local
            ln -sv mariadb-VERSION mysql
            chown -R root:mysql /usr/local/mysql/
        4)準備配置文件
            配置格式:類ini格式,各程序由單個配置文件提供配[prog_name]
            配置文件查找次序:後面覆蓋前面的配置文件
            /etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf
            mkdir /etc/mysql/
            cp /usr/local/mysql/support-files/my-large.cnf /etc/mysql/my.cnf
            [mysqld] 中添加三個選項:
                datadir = /app/data
                innodb_file_per_table = on
                skip_name_resolve = on  禁止主機名解析
        5)創建數據庫文件
            cd /usr/local/mysql/
            ./scripts/mysql_install_db --datadir=/app/data --user=mysql
            
                    To start mysqld at boot time you have to copy
                    support-files/mysql.server to the right place for your system
                    
                    PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER !
                    To do so, start the server, then issue the following commands:
                    
                    ‘./bin/mysqladmin‘ -u root password ‘new-password‘
                    ‘./bin/mysqladmin‘ -u root -h centos7 password ‘new-password‘
                    
                    Alternatively you can run:
                    ‘./bin/mysql_secure_installation‘
                    
                    You can start the MariaDB daemon with:
                    cd ‘.‘ ; ./bin/mysqld_safe --datadir=‘/app/data‘
                    
                    You can test the MariaDB daemon with mysql-test-run.pl
                    cd ‘./mysql-test‘ ; perl mysql-test-run.pl
                    
        6)準備日誌文件
            mkdir /var/log/mariadb/
            touch /var/log/mariadb/mariadb.log
            setfacl -R  -m u:mysql:rwx /var/log/mariadb
        
        7)準備服務腳本,並啟動服務
            cp ./support-files/mysql.server /etc/init.d/mysqld
            chkconfig --add mysqld
            service mysqld start
        8)添加PATH路徑
            vim /etc/profile.d/mysql.sh
                export PATH=/usr/local/mysql/bin:$PATH
                
        9)安全初始化
            /user/local/mysql/bin/mysql_secure_installation
                mysql_secure_installation
                設置數據庫管理員root 口令
                禁止root 遠程登錄
                刪除anonymous用戶帳號
                刪除test 數據庫

yum 安裝

        需要安裝的包有:
            mariadb
            mariadb-libs
            mariadb-server
            mariadb-test(可選)
            mariadb-bench
        安裝完成後也要安全初始化

配置文件

    mysql讀取多處的多個配置文件,而且會以指定的次序的進行;  
        # 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   
            於讀取的默認配置文件之外再加載一個文件(mysqld_safe命令):     
                --defaults-extra-file=path  
    
    配置文件格式: 
        ini風格的配置文件,能夠為mysql的各種應用程序提供配置信息:   
            [mysqld]    
            [mysqld_safe]   
            [mysqld_multi]  
            [server]    
                [mysql] 
            [mysqldump] 
            [client]    
            ... 
                parameter = value   
                parameter:  
                    innodb_file_per_table   
                    innodb-file-per-table   
        
    程序文件:   
        服務端程序:mysqld_safe, mysqld_multi 
        客戶端程序:mysql, mysqldump, mysqladmin  
        工具程序:myisampack, ...    
            
    mysql --> mysql protocol --> mysqld     
        mysql:交互式cli工具; 
            mysql [options] db_name 
            
        mysqld服務器程序:工作特性的定義方式   
            顯示配置文件參數    
            服務器參數/變量:設定mysql的運行特性;  
            狀態(統計)參數/變量:保存mysql運行中的統計數據或狀態數據;   
                mysql>show [global | session] variables [like_or_where];    
                MariaDB [(none)]> show global variables like ‘%ssl%‘;   
            顯示單個變量設定值的方法:   
                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    
            max_connections = 20000 
            
    MariaDB配置文件和配置:
        /etc/my.cnf 
        /etc/my.cnf.d/ *.cnf
        偵聽3306/tcp 端口可以在綁定有一個或全部接口IP上 
            Vim /etc/my.cnf
                [mysqld]加一行:
                skip-networking=1
                只偵聽本地客戶端,所有和服務器的交互都通過一個socket實現,socket 的配置存放在/var/lib/mysql/mysql.sock,可在/etc/my.cnf 修改
        firewall-cmd --permanent --add-service=mysql
        firewall-cmd --reload
        
    MariaDB 的程序組成:
        Client:
            mysql:CLI 交互式客戶端程序
            mysqldump, mysqladmin...
        Server:
            mysqld_safe
            mysqld
            mysqld_multi :多實例
    
    服務器監聽的兩種socket地址:
        ip socket: 監聽在tcp的3306 端口,支持遠程通信
        unix sock: 監聽在sock文件上(/tmp/mysql.sock,/var/lib/mysql/mysql.sock),僅支持本機通信
        server: localhost, 127.0.0.1 自動使用unix sock
    
    客戶端工具
        命令行交互式客戶端程序:mysql
        mysql 選項:
            -uUSERNAME: 用戶名;默認為root
            -hHOST: 服務器主機; 默認為localhost
            -pPASSWORD:用戶的密碼; 建議使用-p,默認為空密碼
        mysql 用戶賬號由兩部分組成:
            ‘USERNAME‘@‘HOST‘
             HOST用於限制此用戶可通過哪些遠程主機連接mysql服務
            支持使用通配符:
                %  匹配任意長度的任意字符
                    172.16.0.0/16或 172.16.%.%
                _  匹配任意單個字符

Mysql數據庫介紹、安裝和配置文件