一、mysql簡介 優點 簡單易用:MySQL 是一個高性能且相對簡單的數據庫系統,與一些更大系統的設置和管理相比,其複雜程度較低。 價格:MySQL 對多數我的用戶來講是免費的。 小巧:安裝包占用的磁盤空間小 支持查詢語言:MySQL 能夠利用 SQL(結構化查詢語言),SQL 是一種全部現代數據庫系統都選用的語言。也能夠利用支持 ODBC(開放式數據庫鏈接)的應用程序,ODBC 是 Microsoft 開發的一種數據庫通訊協議。 性能:許多客戶機可同時鏈接到服務器。MySQL數據庫沒有用戶數的限制,多個客戶機可同時使用同一個數據庫。可利用幾個輸入查詢並查看結果的界面來交互 式地訪問 MySQL。這些界面爲:命令行客戶機程序、Web 瀏覽器或 X Window System 客戶機程序。此外,還有由各類語言(如C, C++, Eiffel, Java, Perl, PHP, Python, Ruby, and Tcl)編寫的界面。所以,能夠選擇使用已編好的客戶機程序或編寫本身的客戶機應用程序。 鏈接性和安全性:MySQL 是徹底網絡化的,其數據庫可在因特網上的任何地方訪問,所以,能夠和任何地方的任何人共享數據庫。並且 MySQL 還能進行訪問控制,能夠控制哪些人不能看到您的數據。 可移植性:MySQL 可運行在各類版本的 UNIX 以及其餘非 UNIX 的系統(如 Windows 和 OS/2)上。MySQL 可運行在從家用 PC 到高級的服務器上。 開放式的分發:MySQL 容易得到;只要使用 Web 瀏覽器便可。若是不能理解某樣東西是如何起做用的,或者對某個算法感到好奇,能夠將其源代碼取來,對源代碼進行分析。若是不喜歡某些東西,則能夠更改它。 速度:MySQL 運行速度很快。開發者聲稱 MySQL 多是目前能獲得的最快的數據庫。 適用場景 web網站系統 日誌倉庫系統 數據倉庫系統 二、mysql5.7版本特性 支持systemd 更好的性能:對於多核心CPU、固態硬盤、鎖有更好的優化 更好的innodb存儲引擎 更好的複製功能 三、mysql鎖的概念 一、分類 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的機率最高,併發度最低;MyISAM,MEMORY,CSV 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的機率最低,併發度也最高;InnoDB 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度通常;BerkeleyDB 二、死鎖 產生緣由: 互斥條件:資源是獨佔的且排他使用,進程互斥使用資源,即任意時刻一個資源只能給一個進程使用,其餘進程若申請一個資源,而該資源被另外一進程佔有時,則申請者等待直到資源被佔有者釋放。 不可剝奪條件:進程所得到的資源在未使用完畢以前,不被其餘進程強行剝奪,而只能由得到該資源的進程資源釋放。 請求和保持條件:進程每次申請它所須要的一部分資源,在申請新的資源的同時,繼續佔用已分配到的資源。 循環等待條件:在發生死鎖時必然存在一個進程等待隊列{P1,P2,…,Pn},其中P1等待P2佔有的資源,P2等待P3佔有的資源,…,Pn等待P1佔有的資源,造成一個進程等待環路,環路中每個進程所佔有的資源同時被另外一個申請,也就是前一個進程佔有後一個進程所深情地資源。 解決方法:(原則:經過破壞死鎖產生的4個必要條件來預防死鎖) 破壞不可剝奪條件:一個進程不能得到所須要的所有資源時便處於等待狀態,等待期間他佔有的資源將被隱式的釋放從新加入到系統的資源列表中,能夠被其餘的進程使用,而等待的進程只有從新得到本身原有的資源以及新申請的資源才能夠從新啓動,執行。 破壞請求與保持條件:第一種方法靜態分配即每一個進程在開始執行時就申請他所須要的所有資源。第二種是動態分配即每一個進程在申請所須要的資源時他自己不佔用系統資源。 破壞循環等待條件:採用資源有序分配其基本思想是將系統中的全部資源順序編號,將緊缺的,稀少的採用較大的編號,在申請資源時必須按照編號的順序進行,一個進程只有得到較小編號的進程才能申請較大編號的進程。 四、mysql文件 mysql日誌文件 一、分類 錯誤日誌(error log) 二進制日誌(binary log) 事務日誌(repo log) 慢查詢日誌(slow log) 查詢日誌(query log) 二、詳解 錯誤日誌: my.cnf: log-error: 服務器啓動和關閉產生的信息、服務器運行中的錯誤、事件調度器運行一個事件產生的信息、在從服務器上啓動服務器進程產生的信息 log-warnings:警告信息 刷新錯誤日誌: mv host_name.err host_name.err-old mysqladmin flush-logs mv host_name.err-old backup-directory 二進制日誌: my.cnf: log-bin:打開二進制日誌,並設置位置 max_binlog_size:設置binlog最大存儲上限,單位爲M binlog-do-db:指定記錄哪一個庫的binlog,忽略其餘的 binlog-ignore-db:指定不記錄哪一個庫的binlog mysql-bin.index:用於記錄binlog的路徑的文件 binlog_cache_size:默認32768,一個事務沒提交的時候產生的日誌緩存,建議2M到4M。若是大的事務較多時,應適當提升該值的大小 binlog_stmt_cache_size:當非事務語句使用二進制日誌緩存,超出該值會使用一個臨時文件來存儲 binlog-format:{row|SQL|mixed}三種方式,分別對應主從複製的三種方式 sync_binlog:設定多久同步一次二進制日誌到硬盤,0表示不一樣步 expire_log_days:設置日誌的過時時間 查看二進制日誌: show binary logs; show master status; 更新二進制日誌: flush logs; 重啓mysql數據庫 查看某一個二進制日誌: show binlog events\G; show binlog events in 'mysql-bin.000001'\G; show binlog events in 'mysql-bin.000001' from 727\G; mysqlbinlog mysql-bin.000001 刪除二進制日誌: purge binary logs to 'mysql-bin.000010'(刪除000010以前的全部) purge binary logs before '2016-08-29 20:30:00';(刪除這個時間以前的) reset master;(全刪,慎用) 事務日誌: 特色: innodb特有的日誌,能夠提升事務的效率。 使用事務日誌,存儲引擎在修改數據時只須要修改其內存拷貝,在把修改持久化到事務日誌,而不是每次修改都直接持久化修改的數據。 若是,數據尚未持久化,系統崩潰,可是事務日誌已經持久化;在重啓後可根據事務日誌進行回覆 查看當前存儲引擎: show engines; 查看默認的存儲引擎: show variables like '%storage_engine%'; 查看事務日誌定義: show global variables like '%log%'; my.cnf文件: innodb_flush_log_at_timeout=1 innodb_flush_log_at_trx_commit=1 1:每次事務提交都會寫事務日誌,並寫數據;安全性最高,性能最差 2:每次事務提交會寫事務日誌,每秒定時寫數據;安全性和性能中 0:每秒定時寫事務日誌和數據;安全性最差,性能最高 慢查詢日誌: my.cnf文件: slow_query_log=1 slow_qurey_log_file=/usr/local/mysql/data/mysql.slow long_query_time=1 :查詢時長,默認10s,超過則記日誌 slow_launch_time=1 設置: set global slow_query_log=1 :開啓慢查詢 set session long_query_time=1s :設置慢查詢時間 或者 set global long_query_time=1s :全局下設置 查看慢查詢: show variables like '%slow%'; show variables like 'long%'; 分析工具: mysqldumpslow mysql.slow 三、補充: 查看系統設置/運行狀態: show global|session variables like %% show global|session status like %% 修改數據庫系統配置: 修改my.cnf文件 set global binlog_cache_size = 1048576; 查看mysql版本: mysql -V status; select version(); mysql數據文件 一、innodb數據文件 test.ibd:獨佔數據文件 特色:方便單表在數據庫中的移動,空間可回收,性能稍微強於共享表空間 test.ibdata:共享表空間數據文件 特色:管理方便,但容易產生空間空隙,對統計分析、日值系統這類應用不適用 test.frm:元數據文件 二、MyISAM test.MYI:存儲表的索引的文件 test.MYD:存儲表的真實數據的文件 test.frm:元數據文件 replication文件(備份文件,存於slave端) 一、master.info 存放master的信息的文件 二、relay log 中繼日誌 三、relay log index 用於記錄relay log的絕對路徑 四、relay-log.info 用於存放I/O線程寫入到本地的relay log的信息 其餘文件 一、系統配置文件 /etc/my.cnf文件 [client] 客戶端鏈接時可讀取的文件 [mysqld] mysqld的初始化時的參數 二、pid file pid存放文件,可在my.cnf中定義 三、socket file unix socket文件存放位置 五、mysql引擎 一、存儲引擎 分類: innodb MyISAM NDB Cluster 主要用於分佈式集羣中 Maria MyISAM的升級版 Falcon 由MySQL開發爲了替代innodb的存儲引擎 Memory 存儲數據和索引在內存,保存元數據在磁盤,追求高性能 Archive 僅支持insert、select語句,會對數據進行壓縮 二、MySQL經常使用引擎詳解 MyISAM 特色: 支持三種類型的索引:b-tree、r-tree、Full-text(全文) 它是5.1以前的默認存儲引擎 不支持事務 只支持表級鎖 數據存放方式: 靜態(fixed) 動態(dynamic) 可變長壓縮(compressed) 統計數據大小方法: 先統計一行的長度 再統計每一個表有多少條數據 最後全部表相加得出庫的數據大小 而後除以1024*1024得出爲多少M的數據,在除以1024也就多少G的數據 innodb 特色: 支持事務 行級鎖 外鍵引用 數據和索引在同一個文件存放 可以使用獨佔表空間或共享表空間 innodb和MyISAM對比: 一、innodb支持事務,且默認開啓自動提交 二、innodb支持行級鎖,MyISAM使用表級鎖。MyISAM的讀鎖和寫鎖互斥,不適用於大量讀寫並存的狀況 三、innodb支持外鍵 四、innodb不支持全文索引 六、mysql命令工具 一、mysql命令 提供接口管理MySQL數據庫 -u:指定用戶 -p:指定密碼 -h:指定主機地址,主機名 -e:接要執行的sql語句,經常使用於腳本編寫,關閉交互 --prompt="\\u@\\h:\\d\\r:\\m:\\s>":建議使用,會出現你當前所處的環境 二、mysqladmin命令 管理相關的功能的命令 mysqladmin -uroot -p123456 -h localhost ping 檢測主機存活 mysqladmin status 查看mysql的基本狀態 uptime:運行的時間 threads:活躍的進程數 questions:查詢次數 slow queries:慢查詢次數 opens:打開的數據表的數量 flush tables:執行的flush、refresh、reload次數 queries per second avg:平均查詢時間 memory in use:分配的內存(編譯時加--with-debug參數) max memory used:分配的最大內存(編譯時加--with-debug參數) 三、mysqldump mysql備份工具,可將mysql的sql語句dump成爲文本 四、mysqlbinlog 分析mysql的binlog的做用 五、mysql的show命令 show databases; show tables; show table status from DB like TABLE; show columns from TABLE like DB; show index from TABLE; show variables; show processlist; show grant for USER; 六、mysqlslap 性能測試工具,可生成圖表 七、mysql的系統數據庫 一、INFORMAtION_SCHEMA 存儲了數據庫的元數據信息 TABLES表:提供數據庫中表和視圖的信息 COLUMNS表:表中的列的信息 TABLE_CONSTRAINTS表:存儲主鍵約束、外鍵約束、惟一約束、check約束等 STATISTICS:索引信息 二、PERFORMANCE__SCHEMA 存儲了提供數據庫性能優化的參考信息 三、MYSQL庫 存儲用戶的權限和幫助信息 四、sys庫 存儲過程、自定義函數、視圖的存儲,結合了INFORMAtION_SCHEMA和PERFORMANCE__SCHEMA的信息