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

數據庫是什麼

數據庫管理系統,簡稱爲DBMS(Database Management System),是用來存儲數據的管理系統。php

DBMS 的重要性

  • 沒法多人共享數據
  • 沒法提供操做大量數據所需的格式
  • 實現讀取自動化須要編程技術能力
  • 沒法應對突發事故

DBMS 的種類

  • 層次性數據庫mysql

    • 最古老的數據庫之一,由於突出的缺點,因此不多使用了
  • 關係型數據庫面試

    • 採用行列二維表結構來管理數據庫,相似Excel的結構,使用專用的SQL語言對數據進行控制。
  • 關係數據庫管理系統的常見種類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 語句要以;結尾
  • 關鍵字不區分大小寫,可是表中數據區分大小寫
  • 關鍵字大寫
  • 表名的首字母大寫
  • 列明等小寫
  • 常數的書寫方式是固定的
  • 遇到字符串、日期等類型須要用到''
  • 單詞間須要使用空格分割
  • 命名規則
  • 數據庫和表的名稱可使用英文、數據以及下劃線
  • 名稱必須以英文做爲開頭
  • 名稱不能重複bash

    數據類型

  • 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(注意:等號與值之間有空格)

鏈接與斷開服務器

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] ...

更多相關的操做基礎知識點請參閱如下文章:

MySQL 多實例配置

MySQL數據庫入門——多實例配置

MySQL 主從同步複製

MySQL複製有兩種方法:
  • 傳統方式:基於主庫的bin-log將日誌事件和事件位置複製到從庫,從庫再加以 應用來達到主從同步的目的。
  • Gtid方式:global transaction identifiers是基於事務來複制數據,所以也就不 依賴日誌文件位置,同時又能更好的保證主從庫數據一致性。

MySQL數據庫主從同步實戰過程

MySQL 主從同步架構中你不知道的「坑」(上)

MySQL 主從同步架構中你不知道的「坑」(下)

MySQL複製有多種類型:
  • 異步複製:一個主庫,一個或多個從庫,數據異步同步到從庫。
  • 同步複製:在MySQL Cluster中特有的複製方式。
  • 半同步複製:在異步複製的基礎上,確保任何一個主庫上的事務在提交以前至 少有一個從庫已經收到該事務並日志記錄下來。
  • 延遲複製:在異步複製的基礎上,人爲設定主庫和從庫的數據同步延遲時間, 即保證數據延遲至少是這個參數。

MySQL主從複製延遲解決方案:高可用數據庫主從複製延時的解決方案

MySQL 數據備份與恢復

數據備份多種方式:
  • 物理備份是指經過拷貝數據庫文件的方式完成備份,這種備份方式適用於數據庫很大,數據重要且須要快速恢復的數據庫
  • 邏輯備份是指經過備份數據庫的邏輯結構(create database/table語句)和數據內容(insert語句或者文本文件)的方式完成備份。這種備份方式適用於數據庫不是很大,或者你須要對導出的文件作必定的修改,又或者是但願在另外的不一樣類型服務器上從新創建此數據庫的狀況
  • 一般狀況下物理備份的速度要快於邏輯備份,另外物理備份的備份和恢復粒度範圍爲整個數據庫或者是單個文件。對單表是否有恢復能力取決於存儲引擎,好比在MyISAM存儲引擎下每一個表對應了獨立的文件,能夠單獨恢復;但對於InnoDB存儲引擎表來講,可能每一個表示對應了獨立的文件,也可能表使用了共享數據文件
  • 物理備份一般要求在數據庫關閉的狀況下執行,但若是是在數據庫運行狀況下執行,則要求備份期間數據庫不能修改
  • 邏輯備份的速度要慢於物理備份,是由於邏輯備份須要訪問數據庫並將內容轉化成邏輯備份須要的格式;一般輸出的備份文件大小也要比物理備份大;另外邏輯備份也不包含數據庫的配置文件和日誌文件內容;備份和恢復的粒度能夠是全部數據庫,也能夠是單個數據庫,也能夠是單個表;邏輯備份須要再數據庫運行的狀態下執行;它的執行工具能夠是mysqldump或者是select … into outfile兩種方式

  • 生產數據庫備份方案:高逼格企業級MySQL數據庫備份方案
  • MySQL數據庫物理備份方式:Xtrabackup實現數據的備份與恢復

MySQL 高可用架構設計與實戰

先來了解一下MySQL高可用架構簡介:淺談MySQL集羣高可用架構
MySQL高可用方案:MySQL 同步複製及高可用方案總結
官方也提供一種高可用方案:官方工具|MySQL Router 高可用原理與實戰
MHA
  • 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

MGR
  • Mysql Group Replication(MGR)是從5.7.17版本開始發佈的一個全新的高可用和高擴張的MySQL集羣服務。
  • 高一致性,基於原生複製及paxos協議的組複製技術,以插件方式提供一致數據安全保證;
  • 高容錯性,大多數服務正常就可繼續工做,自動不一樣節點檢測資源徵用衝突,按順序優先處理,內置動防腦裂機制;
  • 高擴展性,自動添加移除節點,並更新組信息;
  • 高靈活性,單主模式和多主模式。單主模式自動選主,全部更新操做在主進行;多主模式,全部server同時更新。

MySQL 數據庫讀寫分離高可用

海量數據的存儲和訪問成爲了系統設計的瓶頸問題,日益增加的業務數據,無疑對數據庫形成了至關大的負載,同時對於系統的穩定性和擴展性提出很高的要求。隨着時間和業務的發展,數據庫中的表會愈來愈多,表中的數據量也會愈來愈大,相應地,數據操做的開銷也會愈來愈大;另外,不管怎樣升級硬件資源,單臺服務器的資源(CPU、磁盤、內存、網絡IO、事務數、鏈接數)老是有限的,最終數據庫所能承載的數據量、數據處理能力都將遭遇瓶頸。分表、分庫和讀寫分離能夠有效地減少單臺數據庫的壓力。

MySQL讀寫分離高可用架構實戰案例:

ProxySQL+Mysql實現數據庫讀寫分離實戰

Mysql+Mycat實現數據庫主從同步與讀寫分離

MySQL性能優化

史上最全的MySQL高性能優化實戰總結!
MySQL索引原理: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太慢?試試這些診斷思路和工具

MySQL表分區介紹:一文完全搞懂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

最後,能夠配合其它監控工具來實現對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

    測試是否可用( 能夠從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版本 。

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";

再刪除剛剛添加的 skip-grant-tables 參數,再重啓數據庫,使用新密碼便可登陸。

2)從新受權,命令以下:

mysql> grant all on *.* to 'root'@'mysql-server' identified by '123456';
  • 3.客戶端報 Too many connections

問題分析:鏈接數超出 Mysql 的最大鏈接限制。

解決方法:

  • 一、在 my.cnf 配置文件裏面增長鏈接數,而後重啓 MySQL 服務。max_connections = 10000
  • 二、臨時修改最大鏈接數,重啓後不生效。須要在 my.cnf 裏面修改配置文件,下次重啓生效。

    set GLOBAL max_connections=10000;
  • 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
  • 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 的緣由會有不少,主要緣由是主鍵衝突或者主庫刪除或更新數據, 從庫找不到記錄,數據被修改致使。一般狀態碼報錯有 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 常見錯誤代碼說明

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
  • 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
  • 12.索引字段均定義爲NOT NULL。

    • a)對錶的每一行,每一個爲NULL的列都須要額外的空間來標識。
    • b)B樹索引時不會存儲NULL值,因此若是索引字段能夠爲NULL,索引效率會降低。
    • c)建議用0、特殊值或空串代替NULL值。

詳細的可參閱如下文章

MySQL 高頻企業面試題

學好知識,固然就得去面試,進大廠,拿高薪。可是進入面試以前,必要的準備是必須的,刷題是其中之一。

Linux運維必會的100道MySql面試題之(一)
Linux運維必會的100道MySql面試題之(二)
Linux運維必會的100道MySql面試題之(三)
Linux運維必會的100道MySql面試題之(四)

如下內容主要受衆爲開發人員,因此不涉及到MySQL的服務部署等操做,且內容較多,你們準備好耐心和瓜子礦泉水.

前一陣系統的學習了一下MySQL,也有一些實際操做經驗,偶然看到一篇和MySQL相關的面試文章,發現其中的一些問題本身也回答很差,雖然知識點大部分都知道,可是沒法將知識串聯起來.

所以決定搞一個MySQL靈魂100問,試着用回答問題的方式,讓本身對知識點的理解更加深刻一點.

此文不會事無鉅細的從select的用法開始講解mysql,主要針對的是開發人員須要知道的一些MySQL的知識點,主要包括索引,事務,優化等方面,以在面試中高頻的問句形式給出答案.

MySQL 高頻面試題,都在這了

史上最全的大廠Mysql面試題在這裏

MySQL用戶行爲安全

  • 假設這麼一個狀況,你是某公司mysql-DBA,某日忽然公司數據庫中的全部被人爲刪了。
  • 儘管有數據備份,可是因服務中止而形成的損失上千萬,如今公司須要查出那個作刪除操做的人。
  • 可是擁有數據庫操做權限的人不少,如何排查,證據又在哪?
  • 是否是以爲無能爲力?
  • mysql自己並無操做審計的功能,那是否是意味着遇到這種狀況只能自認倒黴呢?
相關文章
相關標籤/搜索