最新、最全、最詳細的 MySQL 數據庫學習筆記總結(2021最新版)
數據庫是什么

數據庫管理系統,簡稱為DBMS(Database Management System),是用來存儲數據的管理系統。
無法多人共享數據
無法提供操作大量數據所需的格式
實現讀取自動化需要編程技術能力
無法應對突發事故
層次性數據庫
最古老的數據庫之一,因為突出的缺點,所以很少使用了
關系型數據庫
采用行列二維表結構來管理數據庫,類似Excel的結構,使用專用的SQL語言對數據進行控制。
關系數據庫管理系統的常見種類
Oracle ==> 甲骨文
SQL Servce ==> 微軟
DB2 ==> IBM
PostgreSQL ==> 開源
MySQL ==> 開源
面向對象的數據庫
XML數據庫
鍵值存儲系統
DB2
Redis
MongoDB
SQL 語句及其種類
DDL(數據定義語言)
create ==> 創建數據庫或者表等對象
drop ==> 刪除數據庫或者表等對象
alter ==> 修改數據庫或者表等對象的結構
DML(數據操作語言)
select ==> 查詢表中數據
insert ==> 向表中插入數據
update ==> 更新表中數據
delete ==> 刪除表中數據
DCL(數據控制語言)
commit ==> 決定對數據庫中的數據進行變更
rollback ==> 取消對數據庫中的數據進行變更
grant ==> 賦予用戶操作權限
revoke ==> 取消用戶的操作權限
SQL 的基本書寫規則
SQL 語句要以;結尾
關鍵字不區分大小寫,但是表中數據區分大小寫
關鍵字大寫
表名的首字母大寫
列明等小寫
常數的書寫方式是固定的
遇到字符串、日期等類型需要用到’’
單詞間需要使用空格分割
命名規則
數據庫和表的名稱可以使用英文、數據以及下劃線
名稱必須以英文作為開頭
名稱不能重復
數據類型
integer
數字型,但是不能存放小數
char
定長字符串類型,指定最大長度,不足使用空格填充
varchar
可變長度字符串類型,指定最大長度,但是不足不填充
data
存儲日期,年/月/日
以上內容是對通用數據庫以及sql語句相關的知識點介紹,本文不做過多的贅述,本文主要針對關系型數據庫:MySQL 來進行各方面的知識點總結。
MySQL 數據庫簡介
MySQL 是最流行的關系型數據庫管理系統,在 WEB 應用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關系數據庫管理系統)應用軟件之一。
MySQL 是一個關系型數據庫管理系統,由瑞典 MySQL AB 公司開發,目前屬于 Oracle 公司。MySQL 是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性。
MySQL 是開源的,目前隸屬于 Oracle 旗下產品。
MySQL 支持大型的數據庫。可以處理擁有上千萬條記錄的大型數據庫。
MySQL 使用標準的 SQL 數據語言形式。
MySQL 可以運行于多個系統上,并且支持多種語言。這些編程語言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
MySQL 對PHP有很好的支持,PHP 是目前最流行的 Web 開發語言。
MySQL 支持大型數據庫,支持 5000 萬條記錄的數據倉庫,32 位系統表文件最大可支持 4GB,64 位系統支持最大的表文件為8TB。
MySQL 是可以定制的,采用了 GPL 協議,你可以修改源碼來開發自己的 MySQL 系統。
在日常工作與學習中,無論是開發、運維、還是測試,對于數據庫的學習是不可避免的,同時也是日常工作的必備技術之一。在互聯網公司,開源產品線比較多,互聯網企業所用的數據庫占比較重的還是MySQL。更多關于MySQL數據庫的介紹,有興趣的讀者可以參考官方網站的文檔和這篇文章:可能是全網最好的MySQL重要知識點
MySQL 安裝
MySQL 8正式版8.0.11已發布,官方表示MySQL8要比MySQL 5.7快2倍,還帶來了大量的改進和更快的性能!到底誰最牛呢?請看:MySQL 5.7 vs 8.0,哪個性能更牛?
詳細的安裝步驟請參閱:CentOS 下 MySQL 8.0 安裝部署,超詳細!
MySQL基礎入門操作
Windows服務
-- 啟動MySQL net start mysql -- 創建Windows服務 sc create mysql binPath= mysqld_bin_path(注意:等號與值之間有空格)
1
2
3
4
5
連接與斷開服務器
mysql -h 地址 -P 端口 -u 用戶名 -p 密碼 SHOW PROCESSLIST -- 顯示哪些線程正在運行 SHOW VARIABLES -- 顯示系統變量信息
1
2
3
4
數據庫操作
-- 查看當前數據庫 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] 數據庫名 同時刪除該數據庫相關的目錄及其目錄內容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
表的操作
-- 創建表 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] ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
更多相關的操作基礎知識點請參閱以下文章:
MySQL數據庫入門———常用基礎命令
1047 行 MySQL 詳細學習筆記(值得學習與)
MySQL基礎入門之常用命令介紹
MySQL 多實例配置
MySQL數據庫入門——多實例配置
MySQL 主從同步復制
傳統方式:基于主庫的bin-log將日志事件和事件位置復制到從庫,從庫再加以 應用來達到主從同步的目的。
Gtid方式:global transaction identifiers是基于事務來復制數據,因此也就不 依賴日志文件位置,同時又能更好的保證主從庫數據一致性。
MySQL數據庫主從同步實戰過程
MySQL 主從同步架構中你不知道的“坑”(上)
MySQL 主從同步架構中你不知道的“坑”(下)
異步復制:一個主庫,一個或多個從庫,數據異步同步到從庫。
同步復制:在MySQL Cluster中特有的復制方式。
半同步復制:在異步復制的基礎上,確保任何一個主庫上的事務在提交之前至 少有一個從庫已經收到該事務并日志記錄下來。
延遲復制:在異步復制的基礎上,人為設定主庫和從庫的數據同步延遲時間, 即保證數據延遲至少是這個參數。
MySQL主從復制延遲解決方案:高可用數據庫主從復制延時的解決方案
MySQL 數據備份與恢復
物理備份是指通過拷貝數據庫文件的方式完成備份,這種備份方式適用于數據庫很大,數據重要且需要快速恢復的數據庫
邏輯備份是指通過備份數據庫的邏輯結構(create database/table語句)和數據內容(insert語句或者文本文件)的方式完成備份。這種備份方式適用于數據庫不是很大,或者你需要對導出的文件做一定的修改,又或者是希望在另外的不同類型服務器上重新建立此數據庫的情況
通常情況下物理備份的速度要快于邏輯備份,另外物理備份的備份和恢復粒度范圍為整個數據庫或者是單個文件。對單表是否有恢復能力取決于存儲引擎,比如在MyISAM存儲引擎下每個表對應了獨立的文件,可以單獨恢復;但對于InnoDB存儲引擎表來說,可能每個表示對應了獨立的文件,也可能表使用了共享數據文件
物理備份通常要求在數據庫關閉的情況下執行,但如果是在數據庫運行情況下執行,則要求備份期間數據庫不能修改
邏輯備份的速度要慢于物理備份,是因為邏輯備份需要訪問數據庫并將內容轉化成邏輯備份需要的格式;通常輸出的備份文件大小也要比物理備份大;另外邏輯備份也不包含數據庫的配置文件和日志文件內容;備份和恢復的粒度可以是所有數據庫,也可以是單個數據庫,也可以是單個表;邏輯備份需要再數據庫運行的狀態下執行;它的執行工具可以是mysqldump或者是select … into outfile兩種方式
生產數據庫備份方案:高逼格企業級MySQL數據庫備份方案
MySQL數據庫物理備份方式:Xtrabackup實現數據的備份與恢復
MySQL 高可用架構設計與實戰
MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,該軟件由兩部分組成:MHA Manager(管理節點)和MHA Node(數據節點。
MHA Manager: 可以單獨部署在一臺獨立的機器上管理多個master-slave集群,也可以部署在一臺slave節點上。
MHA Node: 行在每臺MySQL服務器上。
MHA Manager會定時探測集群中的master節點,當master出現故障時,它可以自動將最新數據的slave提升為新的master,然后將所有其他的slave重新指向新的master。整個故障轉移過程對應用程序完全透明。
MHA高可用方案實戰:MySQL集群高可用架構之MHA
Mysql Group Replication(MGR)是從5.7.17版本開始發布的一個全新的高可用和高擴張的MySQL集群服務。
高一致性,基于原生復制及paxos協議的組復制技術,以插件方式提供一致數據安全保證;
高容錯性,大多數服務正常就可繼續工作,自動不同節點檢測資源征用沖突,按順序優先處理,內置動防腦裂機制;
高擴展性,自動添加移除節點,并更新組信息;
高靈活性,單主模式和多主模式。單主模式自動選主,所有更新操作在主進行;多主模式,所有server同時更新。
MySQL 數據庫讀寫分離高可用
海量數據的存儲和訪問成為了系統設計的瓶頸問題,日益增長的業務數據,無疑對數據庫造成了相當大的負載,同時對于系統的穩定性和擴展性提出很高的要求。隨著時間和業務的發展,數據庫中的表會越來越多,表中的數據量也會越來越大,相應地,數據操作的開銷也會越來越大;另外,無論怎樣升級硬件資源,單臺服務器的資源(CPU、磁盤、內存、網絡IO、事務數、連接數)總是有限的,最終數據庫所能承載的數據量、數據處理能力都將遭遇瓶頸。分表、分庫和讀寫分離可以有效地減小單臺數據庫的壓力。
MySQL讀寫分離高可用架構實戰案例:
ProxySQL+Mysql實現數據庫讀寫分離實戰
Mysql+Mycat實現數據庫主從同步與讀寫分離
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開頭的人
只訪問索引的查詢:查詢結果完全可以通過索引獲得,也叫做覆蓋索引,比如查找所有姓為zhang的人的姓名
MySQL 常用30種SQL查詢語句優化方法|MySQL太慢?試試這些診斷思路和工具
可以允許在?個表?存儲更多的數據,突破磁盤限制或者?件系統限制。
對于從表?將過期或歷史的數據移除在表分區很容易實現,只要將對應的分區移除即可
對某些查詢和修改語句來說,可以?動將數據范圍縮?到?個或?個表分區上,優化語句執?效率。?且可以通過顯示指定表分區來執?語句,?如 select * from temp partition(p1,p2) where store_id < 5;
表分區是將?個表的數據按照?定的規則?平劃分為不同的邏輯塊,并分別進?物理存儲,這個規則就叫做分區函數,可以有不同的分區規則。
MySQL5.7版本可以通過show plugins語句查看當前MySQL是否?持表分區功能。
MySQL8.0版本移除了show plugins?對partition的顯示,但社區版本的表分區功能是默認開啟的。
但當表中含有主鍵或唯?鍵時,則每個被?作分區函數的字段必須是表中唯?鍵和主鍵的全部或?部分,否則就?法創建分區表。
MySQL分庫分表
能不分就不分,1000萬以內的表,不建議分片,通過合適的索引,讀寫分離等方式,可以很好的解決性能問題。
分片數量盡量少,分片盡量均勻分布在多個DataHost上,因為一個查詢SQL跨分片越多,則總體性能越差,雖然要好于所有數據在一個分片的結果,只在必要的時候進 行擴容,增加分片數量。
分片規則需要慎重選擇,分片規則的選擇,需要考慮數據的增長模式,數據的訪 問模式,分片關聯性問題,以及分片擴容問題,最近的分片策略為范圍分片,枚舉分片, 一致性Hash分片,這幾種分片都有利于擴容。
盡量不要在一個事務中的SQL跨越多個分片,分布式事務一直是個不好處理的問題。
查詢條件盡量優化,盡量避免Select * 的方式,大量數據結果集下,會消耗大量 帶寬和CPU資源,查詢盡量避免返回大量結果集,并且盡量為頻繁使用的查詢語句建立索引。
數據庫分庫分表概述:數據庫分庫分表,何時分?怎樣分?
Mysql分庫分表方案:MySQL 分庫分表方案,總結的非常好!
Mysql分庫分表的思路:解救 DBA—數據庫分庫分表思路及案例分析
MySQL性能監控
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
1
2
3
4
5
6
7
8
9
10
最后,可以配合其它監控工具來實現對MySQL的性能監控。
MySQL服務器配置插件:
修改php腳本連接MySQL的monitor@localhost用戶
修改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
1
2
3
測試是否可用( 可以從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
1
2
3
4
5
6
移動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
1
2
導入并配置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 同時也要修改。
1
2
3
4
5
默認模板版本為 2.0.9,無法在4.0版本使用,可以先從3.0版本導出,然后再導入4.0版本 。
Zabbix自帶模板監控MySQL服務
其實,在實際生產過程中,還是有相關的專業監控數據庫的第三方開源軟件的,民工哥之前也寫過相關的文章,今天發出來供大家參考:強大的開源企業級數據庫監控利器Lepus
MySQL 管理工具
MySQL是最廣泛使用和流行的開源數據庫之一,圍繞它有許多工具,可以讓設計,創建和管理數據庫的過程變得更加容易和便捷。但是如何選擇最適合自己需求的工具,并不容易。這里為大家推薦:10款MySQL的GUI工具,它們對開發人員和DBA來說都是不錯的解決方案。
很早之前民工哥就給大家介紹過一款開源的SQL管理工具:自動補全、回滾!介紹一款可視化 sql 診斷利器。
今天,民工哥再給大家推薦一款SQL審核利器: MySQL 自動化運維工具 goinception。
可視化管理工具,大家可以試試這個:介紹一款免費好用的可視化數據庫管理工具
MySQL 常見錯誤代碼說明
先給大家看幾個實例的錯誤分析與解決方案。
1.ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/data/mysql/mysql.sock’
問題分析:可能是數據庫沒有啟動或者是端口被防火墻禁止。
解決方法:啟動數據庫或者防火墻開放數據庫監聽端口。
2.ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO)
問題分析:密碼不正確或者沒有權限訪問。
解決方法:
1)修改 my.cnf 主配置文件,在[mysqld]下添加 skip-grant-tables,重啟數據庫。最后修改密碼命令如下:
mysql> use mysql; mysql> update user set password=password("123456") where user="root";
1
2
再刪除剛剛添加的 skip-grant-tables 參數,再重啟數據庫,使用新密碼即可登錄。
2)重新授權,命令如下:
mysql> grant all on *.* to 'root'@'mysql-server' identified by '123456';
1
3.客戶端報 Too many connections
問題分析:連接數超出 Mysql 的最大連接限制。
解決方法:
1、在 my.cnf 配置文件里面增加連接數,然后重啟 MySQL 服務。max_connections = 10000
2、臨時修改最大連接數,重啟后不生效。需要在 my.cnf 里面修改配置文件,下次重啟生效。
set GLOBAL max_connections=10000;
1
4.Warning: World-writable config file ‘/etc/my.cnf’ is ignored ERROR! MySQL is running but PID file could not be found
問題分析:MySQL 的配置文件/etc/my.cnf 權限不對。
解決方法:
chmod 644 /et/my.cnf
1
5.InnoDB: Error: page 14178 log sequence number 29455369832 InnoDB: is in the future! Current system log sequence number 29455369832
問題分析:innodb 數據文件損壞。
解決方法:修改 my.cnf 配置文件,在[mysqld]下添加 innodb_force_recovery=4, 啟動數據庫后備份數據文件,然后去掉該參數,利用備份文件恢復數據。
6.從庫的 Slave_IO_Running 為 NO
問題分析:主庫和從庫的 server-id 值一樣.
解決方法:修改從庫的 server-id 的值,修改為和主庫不一樣,比主庫低。修改完后重啟,再同步即可!
7.從庫的 Slave_IO_Running 為 NO問題
問題分析:造成從庫線程為 NO 的原因會有很多,主要原因是主鍵沖突或者主庫刪除或更新數據, 從庫找不到記錄,數據被修改導致。通常狀態碼報錯有 1007、1032、1062、1452 等。
解決方法一:
mysql> stop slave; mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; mysql> start slave;
1
2
3
解決方法二:設置用戶權限,設置從庫只讀權限
set global read_only=true; 8.Error initializing relay log position: I/O error reading the header from the binary log
1
2
分析問題:從庫的中繼日志 relay-bin 損壞.
解決方法:手工修復,重新找到同步的 binlog 和 pos 點,然后重新同步即可。
mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.xxx',MASTER_LOG_POS=xxx;
1
維護過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
1
2
3
但是,如果不深究或者之前遇到過,還真不太清楚,這些代碼具體的含義是什么?這也給我們排錯造成了一定的阻礙。
所以,今天民工哥就把主從同步過程中一些常見的錯誤代碼,它的具體說明給大家整理出來了:建議備查!MySQL 常見錯誤代碼說明
MySQL 開發規范與使用技巧
1.庫名、表名、字段名必須使用小寫字母,并采用下劃線分割。
a)MySQL有配置參數lower_case_table_names,不可動態更改,Linux系統默認為 0,即庫表名以實際情況存儲,大小寫敏感。如果是1,以小寫存儲,大小寫不敏感。如果是2,以實際情況存儲,但以小寫比較。
b)如果大小寫混合使用,可能存在abc,Abc,ABC等多個表共存,容易導致混亂。
c)字段名顯示區分大小寫,但實際使?用不區分,即不可以建立兩個名字一樣但大小寫不一樣的字段。
d)為了統一規范, 庫名、表名、字段名使用小寫字母。
2.庫名、表名、字段名禁止超過32個字符。
庫名、表名、字段名支持最多64個字符,但為了統一規范、易于辨識以及減少傳輸量,禁止超過32個字符。
3.使用INNODB存儲引擎。
INNODB引擎是MySQL5.5版本以后的默認引擘,支持事務、行級鎖,有更好的數據恢復能力、更好的并發性能,同時對多核、大內存、SSD等硬件支持更好,支持數據熱備份等,因此INNODB相比MyISAM有明顯優勢。
4.庫名、表名、字段名禁止使用MySQL保留字。
當庫名、表名、字段名等屬性含有保留字時,SQL語句必須用反引號引用屬性名稱,這將使得SQL語句書寫、SHELL腳本中變量的轉義等變得?非常復雜。
5.禁止使用分區表。
分區表對分區鍵有嚴格要求;分區表在表變大后,執?行DDL、SHARDING、單表恢復等都變得更加困難。因此禁止使用分區表,并建議業務端手動SHARDING。
6.建議使用UNSIGNED存儲非負數值。
同樣的字節數,非負存儲的數值范圍更大。如TINYINT有符號為 -128-127,無符號為0-255。
7.建議使用INT UNSIGNED存儲IPV4。
用UNSINGED INT存儲IP地址占用4字節,CHAR(15)則占用15字節。另外,計算機處理整數類型比字符串類型快。使用INT UNSIGNED而不是CHAR(15)來存儲IPV4地址,通過MySQL函數inet_ntoa和inet_aton來進行轉化。IPv6地址目前沒有轉化函數,需要使用DECIMAL或兩個BIGINT來存儲。
例如:
SELECT INET_ATON('209.207.224.40'); 3520061480SELECT INET_NTOA(3520061480); 209.207.224.40
1
2
8.強烈建議使用TINYINT來代替ENUM類型。
ENUM類型在需要修改或增加枚舉值時,需要在線DDL,成本較高;ENUM列值如果含有數字類型,可能會引起默認值混淆。
9.使用VARBINARY存儲大小寫敏感的變長字符串或二進制內容。
VARBINARY默認區分大小寫,沒有字符集概念,速度快。
10.INT類型固定占用4字節存儲
例如INT(4)僅代表顯示字符寬度為4位,不代表存儲長度。數值類型括號后面的數字只是表示寬度而跟存儲范圍沒有關系,比如INT(3)默認顯示3位,空格補齊,超出時正常顯示,Python、Java客戶端等不具備這個功能。
11.區分使用DATETIME和TIMESTAMP。
存儲年使用YEAR類型。存儲日期使用DATE類型。存儲時間(精確到秒)建議使用TIMESTAMP類型。
DATETIME和TIMESTAMP都是精確到秒,優先選擇TIMESTAMP,因為TIMESTAMP只有4個字節,而DATETIME8個字節。同時TIMESTAMP具有自動賦值以及?自動更新的特性。注意:在5.5和之前的版本中,如果一個表中有多個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
1
2
3
4
5
6
7
8
9
10
11
12.索引字段均定義為NOT NULL。
a)對表的每一行,每個為NULL的列都需要額外的空間來標識。
b)B樹索引時不會存儲NULL值,所以如果索引字段可以為NULL,索引效率會下降。
c)建議用0、特殊值或空串代替NULL值。
詳細的可參閱以下文章
值得:一份非常完整、詳細的MySQL規范
MySQL開發規范與使用技巧總結
MySQL 高頻企業面試題
學好知識,當然就得去面試,進大廠,拿高薪。但是進入面試之前,必要的準備是必須的,刷題是其中之一。
以下內容主要受眾為開發人員,所以不涉及到MySQL的服務部署等操作,且內容較多,大家準備好耐心和瓜子礦泉水.
前一陣系統的學習了一下MySQL,也有一些實際操作經驗,偶然看到一篇和MySQL相關的面試文章,發現其中的一些問題自己也回答不好,雖然知識點大部分都知道,但是無法將知識串聯起來.
因此決定搞一個MySQL靈魂100問,試著用回答問題的方式,讓自己對知識點的理解更加深入一點.
此文不會事無巨細的從select的用法開始講解mysql,主要針對的是開發人員需要知道的一些MySQL的知識點,主要包括索引,事務,優化等方面,以在面試中高頻的問句形式給出答案.
MySQL 高頻面試題,都在這了
史上最全的大廠Mysql面試題在這里
MySQL用戶行為安全
假設這么一個情況,你是某公司mysql-DBA,某日突然公司數據庫中的所有被人為刪了。
盡管有數據備份,但是因服務停止而造成的損失上千萬,現在公司需要查出那個做刪除操作的人。
但是擁有數據庫操作權限的人很多,如何排查,證據又在哪?
是不是覺得無能為力?
mysql本身并沒有操作審計的功能,那是不是意味著遇到這種情況只能自認倒霉呢?
MySQL 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。