第1章 MySQL介紹
1.1 數據的定義
數據是指對客觀事件進行記錄並可以鑒別的符號,是對客觀事物的性質、狀態以及相互關系等進行記載的物理符號或這些物理符號的組合,是可識別、抽象的符號
1.2 數據庫管理系統
作用:存儲數據、管理數據(查詢數據、備份恢復、安全、性能等)
1.2.1 RDBMS及NoSQL的特性對比
種類 |
RDBMS(關系型數據庫) |
NoSQL(非關系型) |
特點 |
強大查詢功能 強一致性 二級索引 事務支持等 |
靈活模式 擴展性 高性能 分布式支持 |
典型產品 |
Oracle、MySQL、sqlserver、db2 |
Redis(持久化緩存)、MongoDB(最接近關系型數據的NoSQL)、Memcached、hbase、Neo4j |
功能特點介紹 |
01.數據存取是通過SQL 02.最大特點:數據安全性方面強(ACID) |
01.關系型數據庫的補充,現在也有部分替代的趨勢 02.關注高性能,高並發,靈活性,忽略和上述無關的功能 |
1.2.2 NoSQL的分類、特點、典型產品
鍵值(KV)存儲:Memcached、Redis
列存儲(column-oriented):HBASE(新浪,360)、Cassandra(200台服務器集群)
文檔數據庫(document-oriented):MongoDB(最接近關系型數據庫的NoSQL)
圖形存儲(Graph):Neo4j
1.2.2.1 Oracle公司產品介紹
01.Oracle數據庫版本介紹
7--8i--9i--10g—11g--12c--18c(?) 02.Oracle的市場應用 市場份額第一,趨勢遞減 市場空間,傳統企業 傳統企業也在互聯網化 03.MySQL數據庫版本介紹 5.0--5.1--5.5--5.6--5.7--8.0 04.MySQL的市場應用 中、大型互聯網公司 市場空間:互聯網領域第一 趨勢明顯
同源產品:MariaDB、perconaDB
1.2.2.2 其他公司產品介紹
01.微軟:SQL Server
微軟和sysbase合作開發的產品,后自己開發windows平台
3/4線小公司,傳統行業在用
02.IBM:DB2
市場占有量小
目前只有:國有銀行(人行、中國銀行、工商銀行等)、中國移動應用
03.PostgreSQL
04.MongoDB
05.Redis
后三者廣泛應用在大型互聯網公司
1.2.3 Redis特點
01.依然高性能該並發
02.數據持久化的功能
03.支持多數據類型,主從復制和集群
04.管理不再使用SQL
第2章 Mysql安裝
2.1 安裝方式介紹
01.RPM/Yum:安裝方便、速度快,無法定制
02.二進制:無需安裝,解壓即可使用,但不能定制功能
03.編譯安裝:可定制,安裝慢
5.5之前:./configure make make install
5.5之后:cmake gmake
04.先編譯再制作rpm、yum庫,然后yum安裝
特點:簡單、速度快、可定制,比較復雜,制作時間長
2.1.1 企業選擇安裝方式
中小企業:以上方式都可以,運維偏向編譯,dba偏向選擇二進制
大型企業:可以選擇04
2.2 准備環境
01.克隆模板機(盡量使用centos6)→克隆完做快照
1 iptables -L #查看已添加的iptables規則
2 iptables -F #清除已有iptables規則 3 /etc/init.d/iptables stop 4 chkconfig iptables off 5 6 getenforce
02.設置IP地址為10.0.0.52 主機名db02
A.網卡地址修改IP=10.0.0.52
1 sed -i 's#200#52#g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
2 grep '52' /etc/sysconfig/network-scripts/ifcfg-eth[01]
B.修改系統主機名稱
1 hostname db02
2 sed -i 's#oldboyedu-40#db02#g' /etc/sysconfig/network 3 grep "db02" /etc/sysconfig/network
C.重啟網絡生效
1 /etc/init.d/network restart
03.設置hosts解析
1 echo "10.0.0.52 db02" >>/etc/hosts
04.添加單獨的磁盤用來存放mysql軟件和數據(/dev/sdb=20G)
1 mkfs.ext4 /dev/sdb
2 mkdir /application 3 mount /dev/sdb /application 4 blkid #查詢磁盤的uuid,這里用來查詢/dev/sdb的信息 5 6 echo "UUID=xxx /application ext4 defaults 0 0 " >>/etc/fstab
2.3 軟件安裝
2.3.1 安裝依賴包
1 yum install -y ncurses-devel libaio-devel 2 yum install cmake -y #安裝cmake 3 rpm -qa ncurses-devel libaio-devel cmake
1 vim /etc/yum.conf 2 3 keepcache=1 #將網絡yum源使用過的軟件包保存下來 4 cachedir=/var/cache/$basearch/$releasever #保存在這個位置
2.3.2 創建mysql管理用戶
1 useradd -s /sbin/nologin -u 999 -M mysql #無需登錄,生產環境中建議手動定義UID及GID 2 id mysql
2.3.3 解壓安裝mysql
1 mkdir -p /home/oldboy/tools/ 2 cd /home/oldboy/tools/ 3 wget -q http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.36.tar.gz 4 ls -l mysql-5.6.36.tar.gz #盡量去官方下載或rz直接上傳軟件包
1 tar xf mysql-5.6.36.tar.gz
2 cd mysql-5.6.36
3 cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.36 \ #代碼預編譯->程序存放位置 4 -DMYSQL_DATADIR=/application/mysql-5.6.36/data \ 5 -DMYSQL_UNIX_ADDR=/application/mysql-5.6.36/tmp/mysql.sock \ 6 -DDEFAULT_CHARSET=utf8 \ 7 -DDEFAULT_COLLATION=utf8_general_ci \ 8 -DWITH_EXTRA_CHARSETS=all \ 9 -DWITH_INNOBASE_STORAGE_ENGINE=1 \ 10 -DWITH_FEDERATED_STORAGE_ENGINE=1 \ 11 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ 12 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \ 13 -DWITH_ZLIB=bundled \ 14 -DWITH_SSL=bundled \ 15 -DENABLED_LOCAL_INFILE=1 \ 16 -DWITH_EMBEDDED_SERVER=1 \ 17 -DENABLE_DOWNLOADS=1 \ 18 -DWITH_DEBUG=0 19 20 make && make install #如果是多核cpu可指定make -jcpu核數,加快編譯速度 21 ln -s /application/mysql-5.6.36/ /application/mysql
#補充:如果系統里有曾經安裝的數據庫文件和啟動程序最好停掉或刪除,以免沖突
說明:在裝系統時不要安裝有關虛擬化的選擇,因為這樣會導致安裝KVM的過程中依賴iptable,刪除所有iptables規則后重啟網絡會自動添加上
若上述操作未出現錯誤(可使用echo $?查看返回值),cd /application/mysql/若其下有內容則表示MySQL安裝成功。至此,數據庫安裝完成
2.4 初始化及配置數據庫
1 cp support-files/my*.cnf /etc/my.cnf
初始化系統庫對象(程序位置、數據存放位置及使用的用戶)
1 /application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data --user=mysql
提示:如果以前操作系統中安裝過rpm格式的mysql,系統中可能會遺留/etc/my.cnf文件,則需將它刪除/更名,否則該文件會干擾MySQL的正確配置,造成無法啟動
說明:初始化mysql數據庫文件會有很多信息提示,若出現兩個OK的字樣即表示初始化成功,否則就要解決初始化的問題
1 chown -R mysql.mysql /application/mysql/ 2 cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld #拷貝mysql啟動腳本到命令路徑 3 chmod 700 /etc/init.d/mysqld
2.5 啟動服務並測試
1 chkconfig mysqld on 2 chkconfig --list mysqld 3 /etc/init.d/mysqld start
注意:此時數據庫啟動會提示找不到xx/tmp/mysql.sock,因為5.6.36版本不會自動創建tmp目錄,需手動創建mkdir -p /application/mysql/tmp
1 netstat -lntup|grep 3306 2 cd /application/mysql/bin 3 ./mysql
2.6 設置mysql全局變量
1 echo 'PATH=/application/mysql/bin/:$PATH' >>/etc/profile
2 tail -1 /etc/profile 3 source /etc/profile 4 echo $PATH 5 mysql
說明:數據庫分為系統數據和管理數據
2.6.1 排錯方法
01.輸出
02.錯誤日志
1 tail -100 /application/mysql/data/db02.err #日志需定期切割,否則會導致日志過大無法查看
2.6.2 設置mysql數據庫密碼並登錄
01.設置密碼
1 which mysqladmin
2 mysqladmin -u root password 'oldboy123' #設置密碼oldboy123 3 mysqladmin -u root -p password '新密碼' #更改密碼
注意:此時命令回車后需驗證舊密碼,輸入舊密碼后即更改成功
02.登錄測試
1 mysql -uroot -poldboy123
2.6.2.1 生產環境中如何更安全的登錄數據庫
1 mysql -uroot -p 2 #此時回車后只需輸入密碼即可登錄,且密碼不會被打印到屏幕上
2.6.3 刪除用戶及無用數據庫(基本優化)
1 show databases; #查看數據庫及用戶 2 select user,host from mysql.user;
#刪除用戶
1 drop user ''@'db02';
2 drop user ''@'localhost'; 3 drop user 'root'@'db02'; 4 drop user 'root'@'::1'; 5 select user,host from mysql.user; #此時數據庫僅有root 127.0.0.1及root localhost用戶
#刪除數據庫
1 drop database test; 2 show databases;
注意:刪除無密碼無用戶名的用戶,即存在安全隱患,其查看方法如下
1 select user,host,password from mysql.user
提示:在數據庫中的use mysql相當於命令行中的/application/mysql/data目錄,在此目錄下創建目錄(表)即可在數據庫中看到
2.7 ‼常見問題
故障:
1 ERROR! The server quit without updating PID file
解決:
1.權限chown -R mysql.mysql
2.killall mysqld
3.重新初始化數據
4.運行1年了,出問題(非法斷電/關機或者非法關閉數據庫,如kill -9)
第3章 Mysql體系及原理說明
3.1 Mysql客戶端-服務器結構
Mysql是一個典型的C/S服務結構:即client+server(服務器及客戶端)兩部分
01.mysql自帶的客戶端程序/application/mysql/bin
1 mysql
2 mysqladmin
3 mysqldump等
4 API接口:php-mysql
02.服務端程序mysqld,即二進制程序(后台的守護進程)
單進程多線程的服務結構
3.1.1 數據庫連接方式
01.通過TCP/IP方式(用戶;密碼;IP地址;端口)
1 mysql -uroot -poldboy123 -h 10.0.0.52 -P 3306
02.通過socket套接字(用戶;密碼;socket路徑)
1 mysql -uroot -poldboy123 -S /application/mysql/tmp/mysql.sock
注意:端口號和socket均為啟動完成后自動創建,mysql -uroot -poldboy123默認使用socket方式登錄
3.2 Mysql實例
01.mysql在啟動過程
a.啟動后台守護進程,並生成工作線程xxx
b.預分配內存結構供MySQL處理數據使用
02.Mysql實例:即mysql后台進程+線程結構+預分配的內存結構
說明:在處理能力上,數據庫以守護進程mysqld的方式先載入內存,程序等待請求的到來再進行處理;同時也把將來可能用到的內存結構一並分配完成
3.3 Mysqld服務器程序構成
服務器程序構成概覽:
服務器程序 |
功能及作用 |
備注 |
連接層 |
通信協議、連接線程、用戶驗證合法性 |
|
SQL層(核心) |
判斷語句語法 解析器、查詢執行 授權、查詢高速緩存 優化器、查詢日志記錄(記錄成功SQL的執行) |
二維表邏輯結構 結構化的查詢語言(數據庫內部的邏輯語言) |
存儲引擎層 |
存儲/檢索數據、通過索引查找數據 數據的不同存儲方式 不同的管理方式:事務(增刪改)、備份恢復、高級功能(高可用、讀寫分離架構) |
將抽象(邏輯)數據存放到數據文件中去 基於磁盤、內存、網絡 InnoDB/MyISAM、MEMORY、NDB
|
3.3.1 SQL層
3.3.1.1 分類
DDL數據庫定義語言
DCL數據庫控制語言
DML數據庫操作語言
DQL數據查詢語言
3.3.2 存儲引擎層
01.依賴於存儲引擎的功能
1 存儲介質
2 事務功能
3 鎖定
4 備份和恢復
5 優化
02.特殊功能
1 a.全文搜索 2 b.引用完整性 3 c.空間數據處理
03.雙層處理
上層包括SQL解析器和優化器、下層包含一組存儲引擎
04.SQL 層不依賴於存儲引擎
引擎不影響SQL處理
3.3.3 總結Mysql的執行過程(連接層->SQL層->存儲引擎層)
1)用戶通過TCP/IP或者socket請求連接mysql
2)經過連接層判斷連接合法性,分配連接相應線程 3)連接層線程將用戶需要執行的SQL語句送到SQL層處理 4)SQL層經過語句、語義、語法、SQL類型、權限等判斷 5)查詢緩存查找,若找到直接返回給用戶數據;若未找到則將SQL交給解析器解析,生成執行計划 6)優化器讀取執行計划,判斷並選擇代價最小的執行計划 7)執行計划執行,生成獲取數據的方法方案,交由存儲引擎層繼續處理 8)存儲引擎層根據上層提供的方法,獲取磁盤數據返回用戶 9)此次查詢信息會緩存到查詢緩存中
3.4 Mysql邏輯結構(數據庫內部結構)
出現原因:為了用戶能夠讀懂數據出現的,用來更好的理解數據
即管理數據的一種方式
對象:
庫show databases; use mysql;
表show tables;
記錄(行select user,host,password from user、列desc user)
3.4.1 Mysql物理結構
庫(目錄)、表(多個文件)->行記錄MYD、列結構frm、索引MYI
1 [root@db02 ~]# cd /application/mysql/data/ 2 [root@db02 data]# ls 3 auto.cnf(數據庫唯一值) db02.err(錯誤日志) db02.pid(mysqld進程號) ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema
注意:上述文件切勿進行物理操作,如rm.mv.vi.vim
3.4.2 Mysql存儲方式
01.存儲方式
程序文件隨數據目錄一起存儲在服務器安裝目錄下,執行各種客戶機程序、管理程序和實用程序時將創建程序可執行文件和日志文件,首要使用磁盤空間的是數據目錄。
A.服務器日志文件和狀態文件:
包含有關服務器處理的語句的信息,日志可用於進行故障排除、監視、復制和恢復
B.InnoDB日志文件:
(適用於所有數據庫)駐留在數據目錄級別
C.InnoDB系統表空間:
包含數據字典、撤消日志和緩沖區;每個數據庫在數據目錄下均具有單一目錄(無論在數據庫中創建何種類型的表)
02.存儲內容
A.數據文件:
特定於存儲引擎的數據文件。這些文件也可能包含元數據或索引信息,具體取決於所使用的存儲引擎
B.格式文件(.frm):
包含每個表和/或視圖結構的說明,位於相應的數據庫目錄中 C.觸發器: 與某個表關聯並在該表發生特定事件時激活的命名數據庫對象 數據目錄的位置取決於配置、操作系統、安裝包和分發,典型位置是/var/lib/mysql MySQL在磁盤上存儲系統數據庫(mysql),mysql包含諸如用戶、特權、插件、幫助列表、事件、時區實現和存儲例程之類的信息。
3.4.3 體系結構小結
3.4.3.1 SQL優化相關的理念
解析器:執行計划-數據庫執行sql的一種方式
優化器:知道基本規則,直接影響將來選擇哪個執行計划
查詢緩存:生產環境中,一般會用redis memcached來代替
3.4.3.2 邏輯結構<--->物理結構對應關系
庫<=>data即一個目錄,為了存放多張表
表<=>data在相應的庫中,用多個文件來表示
myisam表:3文件(.myd數據文件、.myi索引文件、frm表/列結構定義文件)
innodb:2個/1個,即共享表空間:ibdata1->系統的元數據(基表)-->information_schema視圖
獨立表空間:5.6以后默認的表的存儲方式
獨立表空間實例
#創建庫->切換庫->創建表->寫入數據->查看列信息
1 mysql>
2 create database oldboy;
3 use oldboy; 4 create table t1(id int); 5 insect id from t1; 6 desc t1; 7 exit 8 9 [root@db02 data]# cd oldboy/ 10 [root@db02 oldboy]# ls 11 db.opt t1.frm t1.ibd
3.4.3.3 如何使用磁盤(物理結構)
a.多個庫多個目錄,目錄下存放了多個表的存儲文件
b.auto.cnf
ibdataN
ib_logfileN
db02.err
xx.pid等
此筆記是本人學習摘記整理而成,此為初稿(尚有諸多不完善之處),原創作品允許轉載,轉載時請務必以超鏈接形式標明文章原始出處,作者信息和本聲明,否則將追究法律責任。http://www.cnblogs.com/bananaaa/