數據庫基礎概述
大部分互聯網公司都選擇MySQL做爲業務數據存儲數據庫,除了MySQL目前還有不少公司使用Oracle(甲骨文)、SQLserver(微軟)、MongoDB等。
從使用成原本區分能夠將數據庫分爲企業版數據庫(商業化)及社區版開源數據庫:企業版數據庫屬於收費型軟件,須要購買License或者Key,不然會在使用中受限於用戶或數據大小的控制;開源數據庫屬於免費公開的類型,使用者不用花錢購買許可就可使用。
像Oracle(甲骨文)企業版、SQL server(微軟)、MySQL(甲骨文)企業版、DB2(IBM)屬於企業版,MySQL社區版爲開源版本。一般商業版本擁有更多的功能,同時擁有軟件供應商的技術支持(可是一般技術支持很昂貴),因此銀行以及壟斷行業國企(電信行業)通常使用企業版數據庫。互聯網行業興起後,對於數據的使用量需求增大,同時因爲不少社區版數據庫功能逐步豐富和性能的提升,互聯網公司逐步從優先選擇企業版數據庫的思路轉換嘗試免費的社區版本,這樣可以下降可觀的使用成本(像通常中大型互聯網公司的數據需求量,若是使用企業版本數據庫則須要花費千萬甚至上億的資金購買企業正版認證和服務),相比較一個數據庫工程師或者一個數據庫工程師團隊的人力成本要低不少。
前面大部分說的都是傳統關係型數據庫,關係型數據庫的官方定義爲:「創建在關係模型基礎上的數據庫,藉助於集合代數等數學概念和方法來處理數據庫中的數據」。其中重點在於「創建在關係模型基礎上的數據庫」,後面會形象解釋區別;針對關係型數據庫還有非關係型數據庫,非關係型數據庫被人們統稱NoSQL,像經常使用的Redis、MongoDB、Memcached等。關係型和非關係型數據庫在數據存儲是都是遵循Key-Value對應的,例如「用戶名=張三,性別=男,年齡=20」,其中用戶名、性別、年齡就是Key,對應的張3、男和20就是Value,這樣就能夠利用對應條件例如「用戶名」是「張三」找到對應的「張三」的屬性「性別=男,年齡=20」。
一般能夠把關係型數據庫中的Table(表)想象成一個標準的Excel文件中的sheet(頁下籤),在頁面的第一行中是各個列的屬性(列屬性實際是表結構定義好的,列屬性不單有列名,還包含其餘屬性,且在真正使用中列屬性一般是隱式的),例如上面說的用戶名、性別、年齡,列屬性下面的全部內容就是全部數據,每一行的內容都是按照列屬性定義好的,例如第一行是「張三,男,20」,第二行是「李四,男,21」。
非關係型數據庫其實也是遵循Key-Value的,利用MongoDB舉例(MongoDB是文檔型數據庫,其中的文檔能夠理解爲數據行,數據表叫做集合),在MongoDB的集合中不規定你必須存儲什麼樣的數據,既能夠存儲文檔爲「用戶名=張三,性別=男,年齡=20」,也能夠存儲文檔爲「國家=中國,城市=北京」,列屬性和列數量沒有關係型數據庫的表結構定義限制。關係型數據庫與非關係型數據庫沒有好與壞的區分,他們須要根據不一樣業務場景和業務功能須要來使用。(簡單瞭解便可)
MySQL的社區版又有不少分支,例如官方MySQL社區版、Percona社區版、MariaDB版本等,雖然他們軟件提供方不同,但實際都是在MySQL主要代碼基礎上封裝了一些特有功能特色,例如MySQL 5.5版本、Percona 5.5版本和MariaDB 5.5版本基本功能是同樣的。在實際工做中須要每一個公司出的小版本都有哪些特性和新功能。
若是咱們只須要維護一個簡單的數據關係且數據量很小,那麼可能一個Excel表格就能知足需求,可是若是數據量達到千萬,數據文件幾個G,那麼就沒法經過一個簡單文本進行維護了。數據庫的性能來自於數據結構和內存的使用,由於內存隨機讀速度比傳統機械硬盤隨機讀速度高不少倍(暫時不引入固態硬盤討論),因此若是能將數據庫數據所有加載到內存中查詢數據會很快,這也就是爲何數據庫服務器的內存一般都很大,固然數據庫內存大隻是提供一個優良的平臺,若是不進行合理的設計以及性能的調優,那麼數據庫使用的效率也會下降,後面會逐步說明。
數據庫工程師英文全稱是Database Administator,簡稱DBA,根據不一樣的數據庫能夠分爲Oracle DBA、SQL Server DBA、MySQL DBA等。
MySQL 5.5官網功能說明索引:http://dev.mysql.com/doc/refman/5.5/en/
目前MySQL官方大版本爲5.7。
mysql
搭建環境
互聯網公司的服務器一般使用Linux系統做爲服務端和數據庫的操做系統平臺,因此咱們學習MySQL也須要先學會搭建一個本身實驗的Linux平臺環境。
在搭建實驗環境以前應該先了解實體機和虛擬機的區別。像通常家用臺式機、筆記本,公司機房的服務器(機架服務器、刀片服務器或中大型服務器等)都屬於實體機,實體機能夠理解爲現實存在的實體主機;反之虛擬機是虛構出來的沒有實物存在的主機,虛擬機運行在實體主機內經過軟件層面實現的虛構主機。一臺實體主機能夠虛擬多個虛擬機,也能夠經過多臺實體主機的羣集虛擬更多的虛擬機實現虛擬化和雲的概念。
在Windows系統中咱們使用VMware Workstation軟件搭建Linux虛擬機,根據咱們臺式機或者筆記本硬件配置做爲指標,實驗項目爲需求來構建虛擬機。
下載VMware Workstation和Linux系統鏡像(iso文件),而後進行安裝,我使用的是VMware Workstation 9和Centos6.3(互聯網公司通常使用Redhat或者Centos發佈的Linux系統,具體區別可自行查詢)。linux
「文件」->「新建虛擬機」c++
「新建虛擬機」嚮導第一步: 選擇「標準」方式安裝便可sql
「新建虛擬機」嚮導第二步:「安裝盤鏡像文件」中選擇電腦中已經下好的Linux鏡像文件,例如我電腦中的是一個Centos6.3 64位的鏡像文件shell
「新建虛擬機」嚮導第三步:「Easy安裝信息」這一步驟是設置主機名(和虛擬機內部的主機名沒有關係)、默認用戶和最高權限用戶密碼,注意這裏密碼是最高權限用戶即root用戶的密碼數據庫
「新建虛擬機」嚮導第四步:在「虛擬機名稱」中輸入的是在VMware Workstation中顯示這臺虛擬機的名稱,能夠看到第一個VMware Workstation截圖中左側「個人電腦」中已經有兩個正在運行的虛擬機「Centos6.3.1」和「Centos6.3.2」。「位置」中選擇這臺虛擬機在Windows中保存的位置,由於虛擬機通常使用比較大的磁盤空間,因此都不會默認使用系統盤,我習慣在一個大磁盤中分配一個獨立的空間給虛擬機使用安全
「新建虛擬機」嚮導第五步:在「最大磁盤空間」中設置這臺虛擬機磁盤大小,這個磁盤就像實體機的硬盤同樣,提供給虛擬機操做系統和數據存儲使用服務器
「新建虛擬機」嚮導第六步:完成第五步就基本完成了虛擬機的配置,在第六步的「虛擬機將按一下設置被建立」中是你設置好的虛擬機的基本信息包括虛擬的硬件部分,好比虛擬的「硬盤」、「內存」等網絡
「新建虛擬機」嚮導第六步:能夠再次「定製硬件」,好比搭建一個測試某個軟件功能的實驗環境實際不須要大內存,咱們能夠經過「定製硬件」將虛擬機分配的內存調小,通常512MB便可數據結構
「新建虛擬機」嚮導第七步:在第六步最下面點擊「完成」後,虛擬機基本上都會自動進行安裝,有的版本會在中間須要點擊一次「OK」
「新建虛擬機」安裝過程:Linux(不光Centos發佈的,其餘公司發行版本或社區版也是)實際是由不少功能塊組成,在安裝過程當中咱們能夠看到安裝的軟件包
進入系統「登陸」:注意這時須要選擇「other」,而後用root用戶和虛擬機安裝時設置的root密碼進入
進入系統「打開命令行」:由於Linux一般不使圖形界面來進行操做(Ubuntu的圖形界面仍是很不錯的),大部分工做都是經過命令行來完成的,因此咱們要學會打開命令行,學會修改主機名和IP地址。進入系統後,在圖形界面的桌面鼠標右鍵打開菜單選擇「Open In Terminal」
進入系統「查看IP地址」:在虛擬機的命令行中輸入「ifconfig」命令能夠查看到目前虛擬機的網絡鏈接情況
進入系統「查看IP地址」:若是使用「ifconfig」命令獲取不到IP地址,例如沒有出現上圖中「inet addr:192.168.1.105」的信息,而是以下圖的狀態,能夠調整虛擬機的鏈接設置
設置虛擬機的「網絡鏈接」:將虛擬機的「網絡鏈接」從「NAT」調整爲「橋接」,過一下子就會發如今虛擬機圖形界面右上角時間左側的電腦網絡狀態變爲正常,紅色叉子消失,而後在使用「ifconfig」命令獲取虛擬機的IP地址
實驗環境的使用
搭建實驗環境能夠測試軟件功能,同時也能夠模擬一些場景,例如公司在真實環境中的服務器結構(一般所說的生產環境架構)。
生產環境指的是互聯網公司面向用戶搭建的平臺,就像工廠向用戶提供產品同樣,生產環境要求高安全高可靠,通常不會輕易調整生產環境。在軟件開發過程當中須要模擬真實場景對軟件進行測試,那麼就有測試環境(有的公司還有功能環境,比測試環境更接近生產環境)。
咱們搭建的虛擬機實驗環境能夠理解爲一個測試環境,能夠形象的認爲VMware Workstation是一個虛擬的機房,而其中的虛擬機是虛擬機房機架上的服務器。
一般公司的服務器都在大型機房中,咱們沒法直接經過圖形界面登陸服務器,咱們只能經過網絡鏈接這些服務器,那麼就須要SecureCRT或者Xshell這類遠程ssh登陸軟件。
在上面搭建環境時咱們已經查看到了虛擬機的IP地址,若是咱們把VMware Workstation認爲是虛擬機房,那麼咱們就能夠經過機房的網絡端口與機房中的虛擬服務器進行鏈接,以下圖:
下載並打開SecureCRT,「文件」->「快速鏈接」在主機名中輸入剛纔Centos6.3.3圖形界面的命令行中使用ifconfig命令獲取到的IP地址,用戶名root,點擊「鏈接」
在初次鏈接時會有提示「新建主機密鑰」,選擇「接受並保存」(我使用了Centos6.3.2的鏈接,因此顯示的IP是192.168.1.104)
輸入root用戶密碼,並勾選「保存密碼」後肯定就模擬遠程登陸進入了虛擬機
在開始使用SecureCRT時會發現Linux本身的一些顏色方案沒法顯示(好比文件夾藍色字體、可執行文件綠色、連接的文/件目錄淺藍色),在會話選項中的「終端」選擇Linux,同時勾選「ANSI顏色」和「使用顏色方案」
一、安裝
源碼、分發包、rpm安裝的區別和適用場景
源碼包:
源碼包就是程序源代碼包,其中包含程序代碼文件,這些代碼文件是文本型,能夠直接經過編輯器打開閱讀內容,這裏的程序還不能直接使用,由於操做系統和電腦沒法直接調用文本代碼,須要語言編譯器將文本代碼編譯成二進制文件,編譯完成的輸出就是分發包。Windows系統安裝軟件時常常會出現一個自定義安裝的選項,用戶能夠自主選擇軟件部分功能安裝,取消安裝不須要的組件,增長安裝默認組件外的可選功能,在Linux系統上是經過編譯參數控制軟件自帶功能的安裝,稍後在編譯安裝MySQL時會舉例說明。
分發包:
分發包是經過源碼包編譯完成的軟件,能夠直接使用。因爲在公司生產環境中可能會出現Linux服務器版本不一樣、底層c和c++等語言庫版本不一樣,能夠根據系統環境版本及穩定性的須要選擇源碼包編譯安裝,或直接使用分發包。源碼包編譯安裝能夠根據本身須要選擇開啓或關閉一些功能,分發包因爲是已經編譯好的,沒法再進行選擇和調整,除非從新修改編譯參數再編譯。
rpm安裝:
Linux系統提供yum命令的簡單快捷軟件安裝方式,當Linux系統聯網且yum源配置完成後,使用「yum install」加軟件包名就能夠安裝該軟件以及相關所須要的環境。
若是Linux系統主機未聯網也能夠在其餘主機上登陸軟件官網下載rpm包,而後上傳到該主機上使用rpm命令進行安裝,可是系統會校驗所須要的環境。
熟悉MySQL的三種安裝方式:源碼、分發包、rpm
MySQL官方下載地址:http://dev.mysql.com/downloads/mysql/
在下載頁面中「Select Platform」的「Source Code」是源碼包,「Linux - Generic」是官方分發包,「Red Hat EnterPrise Linux/Oracle Linux」中下載rpm包。
源碼包安裝:
#須要安裝cmake,若是沒有配置yum源能夠編譯安裝 yum -y install cmake.x86_64 #解壓源碼包 tar -zxvf mysql-5.5.40.tar.gz #進入源碼包目錄 cd mysql-5.5.40 #cmake源碼參數 #注意參數「-DCMAKE_INSTALL_PREFIX=」控制MySQL源碼編譯完軟件放置的路徑,一般狀況用戶自主安裝的軟件放置在「/usr/local/」下 #參數「-DWITH_INNOBASE_STORAGE_ENGINE=1」說明開啓InnoDB引擎 #參數「-DDEFAULT_CHARSET=utf8」說明默認使用的字符集爲utf8(字符集後面解釋) cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_USER=mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all #編譯 make && make install #編譯完成後能夠查看安裝完成的軟件 [root@test1 ~]# cd /usr/local/mysql [root@test1 mysql]# ll total 200 drwxr-xr-x 2 root root 4096 Oct 21 15:19 bin -rw-r--r-- 1 root root 17987 Mar 15 2014 COPYING drwxr-xr-x 3 root root 4096 Sep 6 09:32 data drwxr-xr-x 2 root root 4096 Sep 6 09:32 docs drwxr-xr-x 3 root root 4096 Sep 6 09:32 include -rw-r--r-- 1 root root 133770 Mar 15 2014 INSTALL-BINARY drwxr-xr-x 3 root root 4096 Sep 6 09:32 lib drwxr-xr-x 4 root root 4096 Sep 6 09:32 man drwxr-xr-x 10 root root 4096 Sep 6 09:32 mysql-test -rw-r--r-- 1 root root 2496 Mar 15 2014 README drwxr-xr-x 2 root root 4096 Oct 22 17:57 scripts drwxr-xr-x 27 root root 4096 Sep 6 09:32 share drwxr-xr-x 4 root root 4096 Sep 6 09:32 sql-bench drwxr-xr-x 3 root root 4096 Sep 6 09:32 support-files #bin路徑下都是MySQL的命令,包含MySQL啓動、中止、備份等命令 #include、lib等路徑下都是MySQL底層編譯完成的類庫文件 #scripts下面有初始化MySQL的腳本,每一個MySQL都須要初始化創建最基礎的系統表及用戶表(也可使用相同版本的初始化文件在其餘未初始化實例中使用,就能夠省略執行初始化腳本)
分發包安裝:
#解壓分發包 tar -zxvf mysql-5.5.41-linux-x86_64.tar.gz #解壓完成之後就會像上面編譯安裝完後的樣子
yum/rpm包安裝:
#若是系統能夠聯網且配置yum源能夠直接yum安裝 yum install -y mysql* #若是未聯網的系統能夠下載好rpm包上傳,而後使用rpm -ivh安裝
安裝完成後生成的文件
編譯完成後生成的文件及文件夾如上面編譯示例,分發包解壓完成後也大體相同。可是編譯安裝後MySQL的路徑是由編譯前cmake參數控制的,編譯完成MySQL文件會拷貝至該路徑下。
分發包解壓就可使用。
yum和rpm安裝會將MySQL命令安裝到系統默認安裝路徑下。
二、啓動
初始化
在第一次啓動MySQL以前須要進行初始化,前面在介紹編譯完的MySQL目錄中提到了一個「scripts」目錄,其中包含初始化腳本。由於MySQL數據庫在啓動時會使用一些系統表和用戶表,這些表在初始狀態下是沒有的,都須要使用初始化腳本創建生成(也可使用相同版本的初始化文件在其餘未初始化實例中使用,就能夠省略執行初始化腳本)
[root@test ~]# mkdir -p /data1/mysql/3306_mysql
[root@test ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data1/mysql/3306_mysql Installing MySQL system tables... OK Filling help tables... OK ...
#執行命令後出現兩個OK表示初始化正常(「/data1/mysql/3306_mysql」路徑須要先創建),可能不一樣版本的MySQL輸出內容不徹底相同 #在上面mysql_install_db命令的參數中,「--basedir=/usr/local/mysql」是MySQL安裝目錄參數以及安裝目錄路徑,「--datadir=/data1/mysql/3306_mysql」是MySQL數據目錄參數及數據目錄路徑 #執行上面的命令後會在「/data1/mysql/3306_mysql」目錄中創建幾個目錄和文件 [root@test ~]# ll /data1/mysql/3306_mysql/ total 1092 -rw-rw---- 1 root root 0 Feb 3 17:42 log-error.log drwx------ 2 root root 4096 Feb 3 17:42 mysql -rw-rw---- 1 root root 27711 Feb 3 17:42 mysql-bin.000001 -rw-rw---- 1 root root 1069399 Feb 3 17:42 mysql-bin.000002 -rw-rw---- 1 root root 38 Feb 3 17:42 mysql-bin.index drwx------ 2 root root 4096 Feb 3 17:42 performance_schema drwx------ 2 root root 4096 Feb 3 17:42 test
能夠看到上面生成了3個目錄分別是mysql、performance_schema、test,這3個目錄是初始化腳本生成的3個庫(數據庫中的庫,庫是存放表的單位,MySQL會默認MySQL數據目錄中的目錄都是它是庫),其中mysql目錄最重要,其中包含上面提到的系統表和用戶表,另外兩個目錄則默認爲空。
mysql-bin爲名的文件是MySQL的二進制日誌,後面複製中會提到;log-error.log是MySQL的錯誤日誌,其中會包含啓動過程、運行中出現的錯誤以及一些其餘信息。前面提到的兩個文件能夠經過修改配置文件調整文件命名規則,因此在一些人或公司使用MySQL時會出現其餘的二進制文件名、錯誤日誌名。
另外注意在初始化MySQL後要講數據目錄調整爲mysql用戶所屬。
配置與配置文件
使用Windows軟件時一般會有軟件設置,在Linux系統中的軟件一般在啓動和使用時利用軟件參數調整軟件的自帶功能。由於一般軟件的啓動參數較多,也有軟件(例如MySQL)不支持直接使用內置參數加載,因此須要配置文件,配置文件是彙總一個軟件配置信息的獨立文件,軟件經過直接讀取配置文件獲取全部的配置信息,不用在軟件啓動時後面跟不少參數。
MySQL啓動時有啓動參數(在Linux系統上的命令參數均可以使用「命令 --help」的方式得到說明,例如「mysqld_safe --help」),MySQL在使用中有動態和靜態參數兩種。
啓動參數
MySQL在啓動時通常使用「--defaults-file=配置文件」讓MySQL實例啓動時加載配置文件。
內置參數(配置文件中的)
因爲數據庫性能依靠內存,因此配置文件中會有不少針對MySQL實例內存的設置,用幾個參數舉例:
key_buffer_size = 64M #MyISAM引擎表內存預分配大小,實例級別參數
innodb_buffer_pool_size = 1G #InnoDB引擎表內存預分配大小(MySQL 5.7之前版本沒法動態修改),實例級別參數
sort_buffer_size = 4M #MySQL服務在處理排列時可使用的內存,線程級別
數據庫通常會對請求進行限制,好比只能同時對200個不一樣請求源進行處理,在這以外的請求須要等待直到200個請求中有已經完成且斷開鏈接的。能夠把管理這些鏈接的東西看作一個池「鏈接池」,當鏈接池滿了就沒法在承載,除鏈接池外還有個處理等待請求的鏈接池。相關參數有:
max_connections=200 #最大鏈接數限制,就是上面說的200個請求,在MySQL中咱們稱之爲thread「線程」
max_user_connections=150 #用戶的最大鏈接數限制,也就是說同一個用戶能夠從不一樣的地方訪問數據庫,可是受限於這個值
connect_timeout = 20 #鏈接等待超時時間。當等待的請求超過這個時間就被斷開
wait_timeout=30 #鏈接請求處理完成後,若是空閒時間超過30秒會被MySQL主動斷開
interactive_timeout=30 #與wait_timeout設置相同便可,參數具體差別能夠參考官網說明
動態參數與靜態參數
動態參數就是在MySQL在使用中能夠直接調整而且生效的參數。相反有些參數沒法直接修改生效,須要修改配置文件並重啓MySQL實例才能夠。
MySQL不一樣版本的參數也徹底相同,有的低版本參數在高版本中取消了,有的低版本參數沒法動態修改而後高版本能夠。
單、多實例啓動
單實例啓動 mysqld_safe
[root@test ~]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf & #上面命令中「/usr/local/mysql/bin」是MySQL編譯安裝完的命令目錄,「--defaults-file=/etc/my.cnf」是配置文件參數以及配置文件位置,「&」是Linux的修飾符,表示這個命令在後臺運行
在互聯網公司中一般一臺數據庫服務器不僅運行一個MySQL實例(一個運行的MySQL就叫做一個MySQL實例),就像一臺電腦能夠運行多個QQ同樣。
同時啓動多個實例 mysqld_multi
[root@test ~]# /usr/local/mysql/bin/mysqld_multi --defaults-file=/etc/my.cnf start 3306 3307 3308 #因爲這種方式不經常使用,很少作解釋,若是須要本身參考官網說明
啓動後生成的文件 熟悉日誌 三、使用 鏈接的概念 建庫建表 添加、查詢、刪除、更改數據 SQL語法及簡單函數 主從複製原理 用戶管理及權限控制 備份四、優化 存儲引擎的特色 SQL優化方法 監控內存、磁盤的使用