數據庫管理系統,簡稱爲DBMS(Database Management System),是用來存儲數據的管理系統。php
層次性數據庫mysql
關係型數據庫面試
關係數據庫管理系統的常見種類sql
面向對象的數據庫數據庫
DDL(數據定義語言)編程
DML(數據操做語言)安全
DCL(數據控制語言)性能優化
名稱不能重複bash
integer服務器
char
varchar
data
以上內容是對通用數據庫以及sql語句相關的知識點介紹,本文不作過多的贅述,本文主要針對關係型數據庫:MySQL 來進行各方面的知識點總結。
MySQL 是最流行的關係型數據庫管理系統,在 WEB 應用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關係數據庫管理系統)應用軟件之一。
MySQL 是一個關係型數據庫管理系統,由瑞典 MySQL AB 公司開發,目前屬於 Oracle 公司。MySQL 是一種關聯數據庫管理系統,關聯數據庫將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫內,這樣就增長了速度並提升了靈活性。
在平常工做與學習中,不管是開發、運維、仍是測試,對於數據庫的學習是不可避免的,同時也是平常工做的必備技術之一。在互聯網公司,開源產品線比較多,互聯網企業所用的數據庫佔比較重的仍是MySQL。更多關於MySQL數據庫的介紹,有興趣的讀者能夠參考官方網站的文檔和這篇文章:多是全網最好的MySQL重要知識點
MySQL 8正式版8.0.11已發佈,官方表示MySQL8要比MySQL 5.7快2倍,還帶來了大量的改進和更快的性能!到底誰最牛呢?請看:MySQL 5.7 vs 8.0,哪一個性能更牛?
詳細的安裝步驟請參閱:CentOS 下 MySQL 8.0 安裝部署,超詳細!
Windows服務
-- 啓動MySQL net start mysql -- 建立Windows服務 sc create mysql binPath= mysqld_bin_path(注意:等號與值之間有空格)
鏈接與斷開服務器
mysql -h 地址 -P 端口 -u 用戶名 -p 密碼 SHOW PROCESSLIST -- 顯示哪些線程正在運行 SHOW VARIABLES -- 顯示系統變量信息
數據庫操做
-- 查看當前數據庫 SELECT DATABASE(); -- 顯示當前時間、用戶名、數據庫版本 SELECT now(), user(), version(); -- 建立庫 CREATE DATABASE[ IF NOT EXISTS] 數據庫名 數據庫選項 數據庫選項: CHARACTER SET charset_name COLLATE collation_name -- 查看已有庫 SHOW DATABASES[ LIKE 'PATTERN'] -- 查看當前庫信息 SHOW CREATE DATABASE 數據庫名 -- 修改庫的選項信息 ALTER DATABASE 庫名 選項信息 -- 刪除庫 DROP DATABASE[ IF EXISTS] 數據庫名 同時刪除該數據庫相關的目錄及其目錄內容
表的操做
-- 建立表 CREATE [TEMPORARY] TABLE[ IF NOT EXISTS] [庫名.]表名 ( 表的結構定義 )[ 表選項] 每一個字段必須有數據類型 最後一個字段後不能有逗號 TEMPORARY 臨時表,會話結束時表自動消失 對於字段的定義: 字段名 數據類型 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string'] -- 表選項 -- 字符集 CHARSET = charset_name 若是表沒有設定,則使用數據庫字符集 -- 存儲引擎 ENGINE = engine_name 表在管理數據時採用的不一樣的數據結構,結構不一樣會致使處理方式、提供的特性操做等不一樣 常見的引擎:InnoDB MyISAM Memory/Heap BDB Merge Example CSV MaxDB Archive 不一樣的引擎在保存表的結構和數據時採用不一樣的方式 MyISAM表文件含義:.frm表定義,.MYD表數據,.MYI表索引 InnoDB表文件含義:.frm表定義,表空間數據和日誌文件 SHOW ENGINES -- 顯示存儲引擎的狀態信息 SHOW ENGINE 引擎名 {LOGS|STATUS} -- 顯示存儲引擎的日誌或狀態信息 -- 自增起始數 AUTO_INCREMENT = 行數 -- 數據文件目錄 DATA DIRECTORY = '目錄' -- 索引文件目錄 INDEX DIRECTORY = '目錄' -- 表註釋 COMMENT = 'string' -- 分區選項 PARTITION BY ... (詳細見手冊) -- 查看全部表 SHOW TABLES[ LIKE 'pattern'] SHOW TABLES FROM 表名 -- 查看錶機構 SHOW CREATE TABLE 表名 (信息更詳細) DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN'] SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] -- 修改表 -- 修改表自己的選項 ALTER TABLE 表名 表的選項 eg: ALTER TABLE 表名 ENGINE=MYISAM; -- 對錶進行重命名 RENAME TABLE 原表名 TO 新表名 RENAME TABLE 原表名 TO 庫名.表名 (可將表移動到另外一個數據庫) -- RENAME能夠交換兩個表名 -- 修改表的字段機構(13.1.2. ALTER TABLE語法) ALTER TABLE 表名 操做名 -- 操做名 ADD[ COLUMN] 字段定義 -- 增長字段 AFTER 字段名 -- 表示增長在該字段名後面 FIRST -- 表示增長在第一個 ADD PRIMARY KEY(字段名) -- 建立主鍵 ADD UNIQUE [索引名] (字段名)-- 建立惟一索引 ADD INDEX [索引名] (字段名) -- 建立普通索引 DROP[ COLUMN] 字段名 -- 刪除字段 MODIFY[ COLUMN] 字段名 字段屬性 -- 支持對字段屬性進行修改,不能修改字段名(全部原有屬性也需寫上) CHANGE[ COLUMN] 原字段名 新字段名 字段屬性 -- 支持對字段名修改 DROP PRIMARY KEY -- 刪除主鍵(刪除主鍵前需刪除其AUTO_INCREMENT屬性) DROP INDEX 索引名 -- 刪除索引 DROP FOREIGN KEY 外鍵 -- 刪除外鍵 -- 刪除表 DROP TABLE[ IF EXISTS] 表名 ... -- 清空表數據 TRUNCATE [TABLE] 表名 -- 複製表結構 CREATE TABLE 表名 LIKE 要複製的表名 -- 複製表結構和數據 CREATE TABLE 表名 [AS] SELECT * FROM 要複製的表名 -- 檢查表是否有錯誤 CHECK TABLE tbl_name [, tbl_name] ... [option] ... -- 優化表 OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... -- 修復表 REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM] -- 分析表 ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
更多相關的操做基礎知識點請參閱如下文章:
Gtid方式:global transaction identifiers是基於事務來複制數據,所以也就不 依賴日誌文件位置,同時又能更好的保證主從庫數據一致性。
MySQL主從複製延遲解決方案:高可用數據庫主從複製延時的解決方案
邏輯備份的速度要慢於物理備份,是由於邏輯備份須要訪問數據庫並將內容轉化成邏輯備份須要的格式;一般輸出的備份文件大小也要比物理備份大;另外邏輯備份也不包含數據庫的配置文件和日誌文件內容;備份和恢復的粒度能夠是全部數據庫,也能夠是單個數據庫,也能夠是單個表;邏輯備份須要再數據庫運行的狀態下執行;它的執行工具能夠是mysqldump或者是select … into outfile兩種方式
MHA Manager會定時探測集羣中的master節點,當master出現故障時,它能夠自動將最新數據的slave提高爲新的master,而後將全部其餘的slave從新指向新的master。整個故障轉移過程對應用程序徹底透明。
MHA高可用方案實戰:MySQL集羣高可用架構之MHA
海量數據的存儲和訪問成爲了系統設計的瓶頸問題,日益增加的業務數據,無疑對數據庫形成了至關大的負載,同時對於系統的穩定性和擴展性提出很高的要求。隨着時間和業務的發展,數據庫中的表會愈來愈多,表中的數據量也會愈來愈大,相應地,數據操做的開銷也會愈來愈大;另外,不管怎樣升級硬件資源,單臺服務器的資源(CPU、磁盤、內存、網絡IO、事務數、鏈接數)老是有限的,最終數據庫所能承載的數據量、數據處理能力都將遭遇瓶頸。分表、分庫和讀寫分離能夠有效地減少單臺數據庫的壓力。
MySQL讀寫分離高可用架構實戰案例:
顧名思義,B-tree索引使用B-tree的數據結構存儲數據,不一樣的存儲引擎以不一樣的方式使用B-Tree索引,好比MyISAM使用前綴壓縮技術使得索引空間更小,而InnoDB則按照原數據格式存儲,且MyISAM索引在索引中記錄了對應數據的物理位置,而InnoDB則在索引中記錄了對應的主鍵數值。B-Tree一般意味着全部的值都是按順序存儲,而且每一個葉子頁到根的距離相同。
B-Tree索引驅使存儲引擎再也不經過全表掃描獲取數據,而是從索引的根節點開始查找,在根節點和中間節點都存放了指向下層節點的指針,經過比較節點頁的值和要查找值能夠找到合適的指針進入下層子節點,直到最下層的葉子節點,最終的結果就是要麼找到對應的值,要麼找不到對應的值。整個B-tree樹的深度和表的大小直接相關。
全鍵值匹配:和索引中的全部列都進行匹配,好比查找姓名爲zhang san,出生於1982-1-1的人
匹配最左前綴:和索引中的最左邊的列進行匹配,好比查找全部姓爲zhang的人
匹配列前綴:匹配索引最左邊列的開頭部分,好比查找全部以z開頭的姓名的人
匹配範圍值:匹配索引列的範圍區域值,好比查找姓在li和wang之間的人
精確匹配左邊列並範圍匹配右邊的列:好比查找全部姓爲Zhang,且名字以K開頭的人
MySQL 經常使用30種SQL查詢語句優化方法|MySQL太慢?試試這些診斷思路和工具
但當表中含有主鍵或惟⼀鍵時,則每一個被⽤做分區函數的字段必須是表中惟⼀鍵和主鍵的所有或⼀部分,不然就⽆法建立分區表。
查詢條件儘可能優化,儘可能避免Select * 的方式,大量數據結果集下,會消耗大量 帶寬和CPU資源,查詢儘可能避免返回大量結果集,而且儘可能爲頻繁使用的查詢語句創建索引。
數據庫分庫分表概述:數據庫分庫分表,什麼時候分?怎樣分?
Mysql分庫分表方案:MySQL 分庫分表方案,總結的很是好!
Mysql分庫分表的思路:解救 DBA—數據庫分庫分表思路及案例分析
MySQL性能監控的指標大致能夠分爲如下4大類:
緩衝池利用率
對於MySQL性能監控,官方也提供了相關的服務插件:MySQL-Percona,下面簡單介紹一下插件的安裝
[root@db01 ~]# yum -y install php php-mysql [root@db01 ~]# wget https://www.percona.com/downloads/percona-monitoring-plugins/percona-monitoring-plugins-1.1.8/binary/redhat/7/x86_64/percona-zabbix-templates-1.1.8-1.noarch.rpm [root@db01 ~]# rpm -ivh percona-zabbix-templates-1.1.8-1.noarch.rpm warning: percona-zabbix-templates-1.1.8-1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY Preparing... ################################# [100%] Updating / installing... 1:percona-zabbix-templates-1.1.8-1 ################################# [100%] Scripts are installed to /var/lib/zabbix/percona/scripts Templates are installed to /var/lib/zabbix/percona/templates
最後,能夠配合其它監控工具來實現對MySQL的性能監控。
MySQL服務器配置插件:
修改MySQL的sock文件路徑
[root@db01 ~]# sed -i '30c $mysql_user = "monitor";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php [root@db01 ~]# sed -i '31c $mysql_pass = "123456";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php [root@db01 ~]# sed -i '33c $mysql_socket = "/tmp/mysql.sock";' /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
測試是否可用( 能夠從MySQL中獲取到監控值 )
[root@db01 ~]# /usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg gg:12 # 確保當前文件的 屬主 屬組 是zabbix,不然zabbix監控取值錯誤。 [root@db01 ~]# ll -sh /tmp/localhost-mysql_cacti_stats.txt 4.0K -rw-rw-r-- 1 zabbix zabbix 1.3K Dec 5 17:34 /tmp/localhost-mysql_cacti_stats.txt
移動zabbix-agent配置文件到 /etc/zabbix/zabbix_agentd.d/目錄
[root@db01 ~]# mv /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/ [root@db01 ~]# systemctl restart zabbix-agent.service
導入並配置Zabbix模板與主機:
默認模板監控時間爲 5分鐘 ( 當前測試修改成 30s) 同時也要修改Zabbix模板時間
# 若是要修改監控獲取值的時間不但要在zabbix面板修改取值時間,bash腳本也要修改。 [root@db01 scripts]# sed -n '/TIMEFLM/p' /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh TIMEFLM=`stat -c %Y /tmp/$HOST-mysql_cacti_stats.txt` if [ `expr $TIMENOW - $TIMEFLM` -gt 300 ]; then # 這個 300 表明 300s 同時也要修改。
默認模板版本爲 2.0.9,沒法在4.0版本使用,能夠先從3.0版本導出,而後再導入4.0版本 。
其實,在實際生產過程當中,仍是有相關的專業監控數據庫的第三方開源軟件的,民工哥以前也寫過相關的文章,今天發出來供你們參考:強大的開源企業級數據庫監控利器Lepus
MySQL是最普遍使用和流行的開源數據庫之一,圍繞它有許多工具,可讓設計,建立和管理數據庫的過程變得更加容易和便捷。可是如何選擇最適合本身需求的工具,並不容易。這裏爲你們推薦:10款MySQL的GUI工具,它們對開發人員和DBA來講都是不錯的解決方案。
很早以前民工哥就給你們介紹過一款開源的SQL管理工具:自動補全、回滾!介紹一款可視化 sql 診斷利器。
今天,民工哥再給你們推薦一款SQL審覈利器: MySQL 自動化運維工具 goinception。
可視化管理工具,你們能夠試試這個:介紹一款免費好用的可視化數據庫管理工具
先給你們看幾個實例的錯誤分析與解決方案。
問題分析:多是數據庫沒有啓動或者是端口被防火牆禁止。
解決方法:啓動數據庫或者防火牆開放數據庫監聽端口。
問題分析:密碼不正確或者沒有權限訪問。
解決方法:
1)修改 my.cnf 主配置文件,在[mysqld]下添加 skip-grant-tables,重啓數據庫。最後修改密碼命令以下:
mysql> use mysql; mysql> update user set password=password("123456") where user="root";
再刪除剛剛添加的 skip-grant-tables 參數,再重啓數據庫,使用新密碼便可登陸。
2)從新受權,命令以下:
mysql> grant all on *.* to 'root'@'mysql-server' identified by '123456';
問題分析:鏈接數超出 Mysql 的最大鏈接限制。
解決方法:
二、臨時修改最大鏈接數,重啓後不生效。須要在 my.cnf 裏面修改配置文件,下次重啓生效。
set GLOBAL max_connections=10000;
問題分析:MySQL 的配置文件/etc/my.cnf 權限不對。
解決方法:
chmod 644 /et/my.cnf
問題分析:innodb 數據文件損壞。
解決方法:修改 my.cnf 配置文件,在[mysqld]下添加 innodb_force_recovery=4, 啓動數據庫後備份數據文件,而後去掉該參數,利用備份文件恢復數據。
問題分析:主庫和從庫的 server-id 值同樣.
解決方法:修改從庫的 server-id 的值,修改成和主庫不同,比主庫低。修改完後重啓,再同步便可!
問題分析:形成從庫線程爲 NO 的緣由會有不少,主要緣由是主鍵衝突或者主庫刪除或更新數據, 從庫找不到記錄,數據被修改致使。一般狀態碼報錯有 100七、103二、106二、1452 等。
解決方法一:
mysql> stop slave; mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; mysql> start slave;
解決方法二:設置用戶權限,設置從庫只讀權限
set global read_only=true; 8.Error initializing relay log position: I/O error reading the header from the binary log
分析問題:從庫的中繼日誌 relay-bin 損壞.
解決方法:手工修復,從新找到同步的 binlog 和 pos 點,而後從新同步便可。
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.xxx',MASTER_LOG_POS=xxx;
維護過MySQL的運維或DBA都知道,常常會遇到的一些錯誤信息中有一些相似10xx的代碼。
Replicate_Wild_Ignore_Table: Last_Errno: 1032 Last_Error: Could not execute Update_rows event on table xuanzhi.test; Can't find record in 'test', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000004, end_log_pos 3704
可是,若是不深究或者以前遇到過,還真不太清楚,這些代碼具體的含義是什麼?這也給咱們排錯形成了必定的阻礙。
因此,今天民工哥就把主從同步過程當中一些常見的錯誤代碼,它的具體說明給你們整理出來了:建議收藏備查!MySQL 常見錯誤代碼說明
1.庫名、表名、字段名必須使用小寫字母,並採用下劃線分割。
2.庫名、表名、字段名禁止超過32個字符。
3.使用INNODB存儲引擎。
4.庫名、表名、字段名禁止使用MySQL保留字。
5.禁止使用分區表。
6.建議使用UNSIGNED存儲非負數值。
7.建議使用INT UNSIGNED存儲IPV4。
例如:
SELECT INET_ATON('209.207.224.40'); 3520061480SELECT INET_NTOA(3520061480); 209.207.224.40
8.強烈建議使用TINYINT來代替ENUM類型。
9.使用VARBINARY存儲大小寫敏感的變長字符串或二進制內容。
10.INT類型固定佔用4字節存儲
11.區分使用DATETIME和TIMESTAMP。
如何使用TIMESTAMP的自動賦值屬性?
a)自動初始化,並且自動更新: column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP b)只是自動初始化: column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP c)自動更新,初始化的值爲0: column1 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP d)初始化的值爲0: column1 TIMESTAMP DEFAULT 0
12.索引字段均定義爲NOT NULL。
詳細的可參閱如下文章
學好知識,固然就得去面試,進大廠,拿高薪。可是進入面試以前,必要的準備是必須的,刷題是其中之一。
如下內容主要受衆爲開發人員,因此不涉及到MySQL的服務部署等操做,且內容較多,你們準備好耐心和瓜子礦泉水.
前一陣系統的學習了一下MySQL,也有一些實際操做經驗,偶然看到一篇和MySQL相關的面試文章,發現其中的一些問題本身也回答很差,雖然知識點大部分都知道,可是沒法將知識串聯起來.
所以決定搞一個MySQL靈魂100問,試着用回答問題的方式,讓本身對知識點的理解更加深刻一點.
此文不會事無鉅細的從select的用法開始講解mysql,主要針對的是開發人員須要知道的一些MySQL的知識點,主要包括索引,事務,優化等方面,以在面試中高頻的問句形式給出答案.