天天看點

MySQL(三)之關系型資料庫基本特性

一、目前流行的開源RRDBMS

  • WebScaleSQL

   2015年1月20日,Facebook宣布阿裡巴巴旗下的阿裡雲RDS團隊正式加入WebScaleSQL。WebScaleSQL是Facebook、 Google、Twitter和Linkedin四家公司的MySQL團隊發起的MySQL開源組織,旨在改進MySQL在規模和性能等方面的問題。WebScaleSQL是基于MySQL 5.6 社群版本改編的MySQL通用分支,基于GPL開源協定釋出。WebScaleSQL目前已經做了很多性能改進工作,包括:用戶端異步協調、邏輯預讀、查詢限流、服務端線程池優化、InnoDB大頁支援等等。由于我們的分支上本身有一些定制化的需求,是以不會直接使用WebScaleSQL分支提供線上服務,但是這些改進對于我們都是很感興趣的,好的特性會被吸收進來。因為我們有各種各樣應用場景的使用者,對MySQL本身的要求也比較高。比如大并發連接配接的使用者,就需要線程池;存大量曆史資料的使用者,就要求高的壓縮比等等。通過這可以看出雖然WebScaleSQL誕生時間較晚,但是其維護力量可以說是很強大的,最後用一句話概括:這款資料庫就是專門為web服務設計的資料庫。

  • PostgreSQL

   PostgreSQL是以加州大學伯克利分校計算機系開發的 POSTGRES,現在已經更名為PostgreSQL,版本 4.2為基礎的對象關系型資料庫管理系統(ORDBMS)。PostgreSQL支援大部分 SQL标準并且提供了許多其他現代特性:複雜查詢、外鍵、觸發器、視圖、事務完整性、MVCC。同樣,PostgreSQL 可以用許多方法擴充,比如, 通過增加新的資料類型、函數、操作符、聚集函數、索引。免費使用、修改、和分發 PostgreSQL,不管是私用、商用、還是學術研究使用。

  • SQLite 

   SQLite,是一款輕型的資料庫,是遵守ACID的關系型資料庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域項目。它的設計目标是嵌入式的,而且目前已經在很多嵌入式産品中使用了它,它占用資源非常的低,在嵌入式裝置中,可能隻需要幾百K的記憶體就夠了。它能夠支援Windows/Linux/Unix等等主流的作業系統,同時能夠跟很多程式語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源的世界著名資料庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生于2000年5月。 至2015年已經有15個年頭,SQLite也迎來了一個版本 SQLite 3已經釋出。

  • MariaDB

   MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社群在維護,采用GPL授權許可 MariaDB的目的是完全相容MySQL,包括API和指令行,使之能輕松成為MySQL的代替品。在存儲引擎方面,使用XtraDB(英語:XtraDB)來代替MySQL的InnoDB。 MariaDB由MySQL的創始人Michael Widenius(英語:Michael Widenius)主導開發,他早前曾以10億美元的價格,将自己建立的公司MySQL AB賣給了SUN,此後,随着SUN被甲骨文收購,MySQL的所有權也落入Oracle的手中。MariaDB名稱來自Michael Widenius的女兒Maria的名字。

   MariaDB基于事務的Maria存儲引擎,替換了MySQL的MyISAM存儲引擎,它使用了Percona的 XtraDB,InnoDB的變體,分支的開發者希望提供通路即将到來的MySQL 5.4 InnoDB性能。這個版本還包括了 PrimeBase XT (PBXT) 和 FederatedX存儲引擎。

   說在最後,目前由于MySQL是屬于Oracle公司的一款産品,而Oracle有将MySQL閉源的潛在風險,現在有很多大公司已經棄用MySQL,而MariaDB就是由MySQL之父Michael領頭設計出來的一款開源資料庫。确切來講MariaDB是MySQL的分支版,而且整合了開源社群的很多東西,是以這款産品可以說就是MySQL的替代産品。由于其完全相容MySQL是以今後示範就用MariaDB進行示範,而所有理論上的概念還是以MySQL為基礎。

二、MySQL基本概念

1、語句結構

  • 資料定義語言(DDL:Data Definition Language): 

   其語句包括動詞CREATE和DROP。在資料庫中建立新表或删除表(CREAT TABLE 或 DROP TABLE);為表加入索引等。DDL包括許多與人資料庫目錄中獲得資料有關的保留字。它也是動作查詢的一部分。

  • 資料操作語言(DML:Data Manipulation Language): 

   其語句包括動詞INSERT,UPDATE和DELETE。它們分别用于添加,修改和删除表中的行。也可以稱為動作查詢語言,使用SELECT語句。

  • 資料控制語言(DCL:Data Control Language): 

   它的語句通過GRANT或REVOKE獲得許可,确定單個使用者和使用者組對資料庫對象的通路。某些RDBMS可用GRANT或REVOKE控制對表單個列的通路。

2、ACID特性

   ACID,指資料庫事務正确執行的四個基本要素的縮寫。包含:原子性(Atomicity)、一緻性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支援事務(Transaction)的,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證資料的正确性,交易過程極可能達不到交易方的要求。

  • 原子性:整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滞在中間某個環節。事務在執行過程中發生錯誤,會被復原(Rollback)到事務開始前的狀态,就像這個事務從來沒有執行過一樣。
  • 一緻性:在事務開始之前和事務結束以後,資料庫的完整性限制沒有被破壞。具體來說就是,比如表與表之間存在外鍵限制關系,那麼你對資料庫進行的修改操作就必需要滿足限制條件,即如果你修改了一張表中的資料,那你還需要修改與之存在外鍵限制關系的其他表中對應的資料,以達到一緻性。
  • 隔離性:隔離狀态執行事務,使它們好像是系統在給定時間内執行的唯一操作。如果有兩個事務,運作在相同的時間内,執行相同的功能,事務的隔離性将確定每一事務在系統中認為隻有該事務在使用系統。這種屬性有時稱為串行化,為了防止事務操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用于同一資料。
  • 持久性:在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,并不會被復原。 

3、隔離級别

   SQL标準定義了4類隔離級,包括了一些具體規則,用來限定事務内外的哪些改變時可見的,哪些是不可見的。低級别的隔離級一般支援更高的并發處理,并擁有更低的系統開銷。

  • READ UNCOMMITTED(讀取未送出内容) 

  在READ UNCOMMITTED隔離級,所有事務都可以“看到”未送出事務的執行結果。在這種級别上,可能會産生很多問題。本隔離級很少用于實際應用,因為它的性能也不比其他級别好多少,而别的級别還有其他更多的優點。讀取未送出資料,也被稱之為“髒讀(Dirty Read)”

  • READ COMMITTED(讀取送出内容) 

  大多數資料庫系統的預設隔離級是READ COMMITTED(但這不是MYSQL預設的)。它滿足了隔離的早先簡單定義:一個事務在開始時,隻能“看見”已經送出事務所做的改變,一個事務從開始到送出前,所做的任何資料改變都是不可見的,除非已經送出。這種隔離級别也支援所謂的“不可重複讀(Nonrepeatable Read)”。這意味着使用者運作同一語句兩次,看到的結果是不同的。

  • REPEATABLE READ(可重讀) 

  REPEATABLE READ 隔離級解決了READ UNCOMMITTED隔離級導緻的問題。它確定同一事務的多個執行個體在并發讀取資料時,會“看到相同的”資料行。不過理論上,這會導緻另一個棘手問題:幻讀(Phantom Read)。簡單來說,幻讀指當使用者讀取某一範圍的資料行時,另一個事務又在該範圍内插入了新行,當使用者再讀取該範圍的資料行時,另一個事務又在該範圍内插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的“幻影”行。InnoDB和Falcon存儲引擎通過多版本并發控制機制解決了幻讀問題。 REPEATABLE READ 是MYSQL的預設事務隔離級。InnoDB和Falcon存儲引擎都遵循這種設定。

  • SERIALIZABLE(可串行化) 

  SERIALIZABLE是最進階别的隔離級,它通過強制事務排斥,使之不可能互相沖突,進而解決幻讀問題。簡言之,SERIALIZABLE是在每個讀的資料行上加鎖。在這個級别,可能導緻大量的逾時現象和鎖競争現象。很少看到有使用者選擇這種隔離級。

   注:不可重複讀與幻讀:不可重複讀的重點是修改(同樣的查詢條件,你讀取過的資料,再次讀取出來發現值不一樣了);幻讀的重點在于新增或者删除(同樣的查詢條件,第1次和第2次讀出來的記錄數不一樣)

三、MySQL安裝後初始化

   前面我已經将MySQL資料庫進行通用二進制安裝,而把MariaDB進行源碼安裝,在安裝好資料庫後我們首要的任務就是初始好資料庫,下面就是介紹如何初始化資料庫。

1、初始化第一步提供配置檔案

   首先mysql的資料庫配置檔案可分為三段及:[mysqld]、[mysql]、[client],這三段配置所對應的意思為:

  • [mysqld] :對應與mysql服務端
  • [mysqld_safe] :對應與指定的safe端
  • [client]:對應于所有的用戶端

通過下面的指令的輸出結果我們可以知道mysql是如何讀取配置檔案的:

[[email protected] ~]# /usr/local/mysql/bin/mysqld --help --verbose |head -20
  Default options are read from the following files in the given order:
    /etc/mysql/my.cnf  /etc/my.cnf  ~/.my.cnf      

 使用配置檔案的方式:

  • 它依次查找每個需要查找的檔案,結果是所有檔案并集; 
  • 如果某參數在多個檔案中出現多次,後讀取的最終生效; 

然而上面的指令輸出結果并不是隻輸出讀取配置檔案資訊的,還有以下輸出資訊:

  • 顯示mysqld程式啟動時可用的選項,通常都是長選項 
  • 顯示mysqld的配置檔案中可用的服務變量 

我們還可以通過在mysql的互動式接口檢視配置資訊:

  • mysql> SHOW GLOBAL VARIABLES;   //全局有效的配置
  • mysql> SHOW SESSION VARIABLES;  //目前會話級别有效的配置

2、初始化第二步設定使用者資訊

删除所有匿名使用者

mysql> DROP USER ''@'localhost'; 
mysql> DROP USER ''@'example.com';      

    mysql使用者帳号由兩部分組成:username@'host' 

       host還可以使用通配符:

        %: 任意長度的任意字元

        _: 比對任意單個字元

在mysql互動式接口給所有的root使用者設定密碼:

mysql> SET PASSWORD FOR username@'host' = PASSWORD('your_passwrod'); 
mysql> UPDATE user SET password = PASSWORD('your_password') WHERE user = 'root'; 
mysql> FLUSH PRIVILEGES;      

在shell指令行給所有的root使用者設定密碼:

   # mysqladmin -uUserName -hHost password 'new_password' -p
   # mysqladmin -uUserName -hHost -p FLUSH-PRIVILEGES      

四、連接配接MySQL

1、mysql client 和mysqld之間的傳輸會有下面兩種狀況

  • 本地通信:用戶端與伺服器端位于同一主機,而且還要基于127.0.0.1(localhost)位址或lo接口進行通信; 

            Linux OR Unix: Unix Sock,

            Windows: memory, pipe

  • 遠端通信:用戶端與伺服器位于不同的主機,或在同一主機而使用非回環位址通信。 

            TCP socket

2、用戶端/非用戶端工具

mysql用戶端工具有:mysql, mysqladmin, mysqldump, mysqlcheck這些工具的配置資訊都可以在配置檔案的[client]中定義。

  • 通用的選項: 

    -u, --user=

    -h, --host=

    -p, --password=

    --protocol={tcp|socket|memory|pipe}

    --port=   

    --socket=    例如:/tmp/mysql.sock

mysql的非用戶端類的管理工具:myisamchk, myisampack

3、一些小知識

  • 擷取mysql幫助資訊:

   mysql> help contents    //擷取所有指令子產品

   mysql> help Keryword   //擷取相關指令的幫助資訊

  •  mysql指令行選項:

  --compress     //用戶端與服務端壓縮傳輸

  --database=, -D    //設定進入mysql指令行時預設的庫

  -H, --html:       輸出結果為html格式的文檔

  -X, --xml:            輸出格式為xml

  --sate-updates:  拒絕使用無where子句的update或delete指令;

            --ssl-ca=/path/to/ssl_ca_file       //擷取ca證書後傳輸

            --ssl-capath=/path/to/ssl_ca_dir   //證書有多個時

  • mysql指令提示符:

  mysql> 等待輸入指令

  ->    //續行符

  '>    

  ">

  `>

  /*>   //注釋資訊

  • mysql的快捷鍵:

  Ctrl + w: 删除光标之前的單詞

  Ctrl + u: 删除光标之前至指令行首的所有内容

  Ctrl + y: 粘貼使用Ctrl+w或Ctrl+u删除的内容

  Ctrl + a: 移動光标至行首

  Ctrl + e: 移動光标至行尾

4、mysqldmin工具使用

文法:mysqladmin [options] command [arg] [command [arg]] ...

  • command

create  DB_NAME:建立資料庫

舉例:# mysqladmin -uroot CREATE testdb -p

drop   DB_NAME:删除資料量

舉例:# mysqladmin -uroot DROP testdb -p

 debug:打開調試日志并記錄于mysql的error log中;

 status:顯示簡要狀态資訊

     --sleep #: 間隔時長

     --count #: 顯示的批次

使用舉例:

[[email protected] ~]# mysqladmin -uroot status -p
Enter password: 
Uptime: 18616  Threads: 2  Questions: 70  Slow queries: 0  Opens: 5  Flush tables: 1  Open tables: 68  Queries per second avg: 0.003      

extended-status: 輸出mysqld的各狀态變量及其值,相當于執行“mysql> SHOW GLOBAL STATUS”

舉例:# mysqladmin -uroot extended-status -p 

variables: 輸出mysqld的各伺服器變量

flush-hosts: 清空主機相關的緩存:DNS解析緩存,此前因為連接配接錯誤次數過多而被拒絕通路mysqld的主機清單。

flush-logs:日志滾動,關閉目前日志打開新日志,主要是打開二進制日志和中繼日志。

flush-privileges:讓伺服器重讀授權表。

flush-status: 重置狀态變量的值。

flush-tables: 關閉目前打開的表檔案句柄,當伺服器還在讀寫時不能進行此操作。

flush-threads:清空線程緩存。

reload: 功能同flush-privileges

refresh: 相當于同時使用flush-logs和flush-hosts

kill:殺死指定的線程,可以一次殺死多個線程,以逗号分隔,但不能有多餘空格。

password:修改目前使用者的密碼;

ping:探測伺服器是否線上。

processlist:顯示mysql線程清單

舉例:

[[email protected] ~]# mysqladmin -uroot processlist -p
Enter password: 
+----+------+-----------+-------+---------+------+-------+------------------+----------+
| Id | User | Host      | db    | Command | Time | State | Info             | Progress |
+----+------+-----------+-------+---------+------+-------+------------------+----------+
| 14 | root | localhost | mysql | Sleep   | 925  |       |                  | 0.000    |
| 32 | root | localhost |       | Query   | 0    | init  | show processlist | 0.000    |
+----+------+-----------+-------+---------+------+-------+------------------+----------+      

shutdown: 關閉mysqld程序;

start-slave:啟動從伺服器線程

stop-slave:關閉從伺服器線程

5、mysql的GUI用戶端工具

  • Navicat for mysql
  • Toad for mysql
  • mysql front