1、什么是數據庫?什么是關系型數據庫?什么是非關系型數據庫?
數據庫就是一個存儲數據的倉庫。
關系型數據庫是依據關系模型(就是“一對一、一對多、多對多”等關系模型,關系模型就是指二維表格模型,因而一個關系型數據庫就是由二維表及其之間的聯系組成的一個數據組織。)來創建的數據庫。例如:Oracle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL。
非關系型數據庫主要是基於“非關系模型”(列模型:Hbase;鍵值對模型:redis,MemcacheDB;
文檔類模型:mongoDB)的數據庫(由於關系型太大,所以一般用“非關系型”來表示其他類型的數據庫)
關系型數據庫與非關系型數據比較:
查詢速度:nosql數據庫優於關系型數據庫。nosql數據庫將數據存儲於緩存之中,關系型數據庫將數據存儲在硬盤中,自然查詢速度遠不及nosql數據庫。
安全:關系型數據庫優於nosql數據庫。因為關系型數據庫存儲在磁盤中,不會說突然斷電數據就沒有了。斷電丟失數據,但其中redis可以同步數據到磁盤中,現在很多非關系型數據庫都開始支持轉存到磁盤中。
存儲數據的格式:關系型數據庫優於nosql數據庫。nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,所以可以存儲基礎類型以及對象或者是集合等各種格式,而數據庫則只支持基礎類型(varchar等)。
2、MYSQL、ORACLE、SQL SERVER功能和應用場合
Mysql 端口號3306,主要用於大型門戶(中小型公司也在使用),例如搜狗、新浪等,它主要的優勢就是開放源代碼,因為開放源代碼這個數據庫是免費的,它現在是甲骨文公司的產品。
Oracle 端口號 1521,主要用於銀行、鐵路、飛機場等。該數據庫功能強大,軟件費用高。也是甲骨文公司的產品。
sql server 端口號1433,是微軟公司的產品,主要應用於大中型企業,如聯想、方正等。
3、數據庫服務器、數據庫、表與記錄的關系
所謂安裝數據庫服務器,只是在機器上裝了一個數據庫管理程序,這個管理程序可以管理多個數據庫,一般開發人員會針對每一個應用創建一個數據庫。為保存應用中實體的數據,一般會在數據庫創建多個表,以保存程序中實體的數據。
4、數據的存儲引擎。
存儲引擎(engines):存儲引擎就是指表的類型。數據庫的存儲引擎決定了表在計算機中的存儲方式。
mysql支持的存儲引擎包括:MyISAM、InnoDB、MEMORY、ARCHIVE、MRG_MYISAM等。其中,InnoDB為默認存儲引擎。最常使用的兩種存儲引擎是MyISAM和InnoDB(5.5以上默認Engine是Innodb,其他版本默認是MyISAM)。
5.sql語言的分類
1)數據定義語言(DDL)
用於創建、修改、和刪除數據庫內的數據結構,如:1:創建和刪除數據庫(CREATE DATABASE || DROP DATABASE);2:創建、修改、重命名、刪除表(CREATE TABLE || ALTER TABLE|| RENAME TABLE||DROP TABLE||TRUNCATE TABLE);3:創建和刪除索引 (CREATEINDEX || DROP INDEX)
2)數據查詢語言(DQL)
從數據庫中的一個或多個表中查詢數據(SELECT)
3)數據操作語言(DML)
修改數據庫中的數據,包括插入(INSERT)、更新(UPDATE)和刪除(DELETE)
4)數據控制語言(DCL)
用於對數據庫的訪問,如:1:給用戶授予訪問權限(GRANT);2:取消用戶訪問 權限(REMOKE)
問:什么時候使用DROP?什么時候使用DELETE?什么時候用TRUNCATE?
答:由上可看出,對於結構刪除,如數據庫刪除、表刪除、索引刪除等當使用DROP;而對於數據的刪除則是DELETE,DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日志中保存以便進行進行回滾操作;TRUNCATE TABLE 則一次性地從表中刪除所有的數據並不把單獨的刪除操作記錄記入日志保存,刪除行是不能恢復的。並且在刪除的過程中不會激活與表有關的刪除觸發器。執行速度快。
從表和索引所占空間來看,當表被TRUNCATE 后,這個表和索引所占用的空間會恢復到初始大小,DELETE操作不會減少表或索引所占用的空間。drop語句將表所占用的空間全釋放掉。
6、SQL語句查詢的基本語句:
7、mysql密碼的修改與恢復
a) 方法一:
① 停止mysql服務
② 啟動跳過授權列表 mysqld --skip-grant-tables或者在mysql主配置文件中增加--skip-grant-tables再重啟
③ update user set password=password('新密碼') where host='主地址' and user='用戶名';
④ flush privileges;//刷新權限
⑤ 重啟登陸mysql服務
b) 方法二:
① 停止mysql服務
② 啟動跳過授權列表 mysqld --skip-grant-tables或者在mysql主配置文件中增加--skip-grant-tables再重啟
③ set password for 用戶名@'主機地址' =password('新密碼'); //注這種方法無需刷新權限
④ 重啟並登陸mysql服務
8、數據庫的備份與恢復
a)備份的概念:為應付文件、數據丟失或損壞等可能出現的意外情況,將電子計算機存儲設備中的數據復制到磁帶等大容量存儲設備中,從而在原文中獨立出來單獨貯存的程序或文件副本; 如果系統的硬件或存儲媒體發生故障,“備份”工具可以幫助您保護數據免受意外的損失。
b)一般的備份可分為:1、系統備份:指的是用戶操作系統因磁盤損傷或損壞,計算機病毒或人為誤刪除等原因造成的系統文件丟失,從而造成計算機操作系統不能正常引導,因此使用系統備份,將操作系統事先貯存起來,用於故障后的后備支援。2、數據備份:指的是用戶將數據包括文件,數據庫,應用程序等貯存起來,用於數據恢復時使用。
c)備份更專業地可分為:
i.全量備份:完全備份就是指對某一個時間點上的所有數據或應用進行的一個完全拷貝
ii.增量備份:增量備份是指在一次全備份或上一次增量備份后,以后每次的備份只需備份與前一次相比增加和者被修改的文件
iii.差異備份:差異備份是指在一次全備份后到進行差異備份的這段時間內,對那些增加或者修改文件的備份
d)對mysql數據庫而言,就是數據備份,可分為全量備份與增量備份
e)備份工具有:mysqldump、xtrabackup、mydumper
9、備份計划,mysqldump以及xtranbackup的實現原理
(1)、備份計划;
這里每個公司都不一樣,您別說那種1小時1全備什么的就行
(2)、備份恢復時間;
這里跟機器,尤其是硬盤的速率有關系,以下列舉幾個僅供參考
20G的2分鍾(mysqldump)
80G的30分鍾(mysqldump)
111G的30分鍾(mysqldump)
288G的3小時(xtra)
3T的4小時(xtra)
邏輯導入時間一般是備份時間的5倍以上
(3) 、xtrabackup實現原理
Xtrabackup是由percona提供的mysql數據庫備份工具, 有兩個主要的工具:xtrabackup、innobackupex,備份過程快速、可靠,備份過程不會打斷正在執行的事務,能夠基於壓縮等功能節約磁盤空間和流量,自動實現備份檢驗,還原速度快,備份可在線備份,但是恢復要關閉服務器,恢復后再啟動.
在InnoDB內部會維護一個redo日志文件,我們也可以叫做事務日志文件。事務日志會存儲每一個InnoDB表數據的記錄修改。當InnoDB啟動時,InnoDB會檢查數據文件和事務日志,並執行兩個步驟:它應用(前滾)已經提交的事務日志到數據文件,並將修改過但沒有提交的數據進行回滾操作。
(4) mysqldump實現原理
mysqldump的本質是通過select * from tab來獲取表的數據的。mysqldump只適合放到業務低峰期做,如果備份的過程中數據操作很頻繁,會造成Undo表空間越來越大,undo表空間默認是放到共享表空間中的,而ibdata的特性是一旦增大,就不會收縮。
(5) mydumper實現原理
mydumper是一個使用C語言編寫的多線程導出導入工具,並且能夠保證多個表之間的一致性
10、mysql日志類型
錯誤日志:記錄啟動、運行或停止mysqld時出現的問題。參數:log-error。
二進制日志: 該日志文件會以二進制形式記錄數據庫的各種操作,但是不記錄查詢語句。參數:log-bin。
查詢日志:該日志分為兩類:通用查詢日志(參數:log)和慢查詢日志(參數:log-slow-queries和設置時間的參數:long_query_time)。前者記錄建立的客戶端連接和執行的語句。 后者記錄所有執行時間超過long_query_time秒的所有查詢或不使用索引的查詢。
11、mysql主從復制優點
健壯性:主服務器出現故障時,可以切到從服務器作為備份
速度快:更新操作在主服務器端,查詢操作在從服務器端,可以加快用戶的響應時間
備份:避免影響業務
12、mysql主從復制原理
從庫生成兩個線程,一個I/O線程,一個SQL線程;
i/o線程去請求主庫 的binlog,並將得到的binlog日志寫到relay log(中繼日志) 文件中;
主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog;
SQL 線程,會讀取relay log文件中的日志,並解析成具體操作,來實現主從的操作一致,而最終數據一致;
13、mysql支持的復制類型:
(1):基於語句的復制: 在主服務器上執行的SQL語句(寫入bin log中),在從服務器上執行同樣的語句。MySQL默認采用基於語句的復制,效率比較高。binlog_format = 'STATEMENT'
(2):基於行的復制:把改變的內容(寫入bin log中)復制過去,而不是把命令在從服務器上執行一遍. 從mysql5.0開始支持。binlog_format = 'ROW'
(3):混合類型的復制: 默認采用基於語句的復制,一旦發現基於語句的無法精確的復制時,就會采用基於行的復制。binlog_format = 'MIXED'
14、mysql讀寫分離原理
Amoeba(變形蟲)項目,該開源框架於2008發布一款Amoeba for mysql軟件,該軟件致力於mysql的分布式數據庫前端代理層,主要的作用是應用服務訪問mysql服務器時充當SQL路由功能,並具有負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關SQL的到目標數據庫、可並發請求多台數據庫全並結果的作用。通過Amoeba能夠完成多數據源的高可用、負載均衡、數據切片的功能。原理如下:
在數據庫集群架構中,讓主庫負責處理事務性查詢,而從庫只負責處理select查詢,讓兩者分工明確達到提高數據庫整體讀寫性能。當然,主數據庫另外一個功能就是負責將事務性查詢導致的數據變更同步到從庫中,也就是寫操作。
讀寫分離優點:
1)分攤服務器壓力,提高機器的系統處理效率
讀寫分離適用於讀多於寫的場景,如果有一台服務器,當select很多時,update和delete會被這些select訪問中的數據堵塞,等待select結束,並發性能並不高,而主從只負責各自的寫和讀,極大程度的緩解X鎖和S鎖爭用;
假如我們有1主3從,不考慮上述1中提到的從庫單方面設置,假設現在1分鍾內有10條寫入,150條讀取。那么,1主3從相當於共計40條寫入,而讀取總數沒變,因此平均下來每台服務器承擔了10條寫入和50條讀取(主庫不承擔讀取操作)。因此,雖然寫入沒變,但是讀取大大分攤了,提高了系統性能。另外,當讀取被分攤后,又間接提高了寫入的性能。所以,總體性能提高了,說白了就是拿機器和帶寬換性能;
2)增加冗余數據庫服務器宕機后可以調整另外一台從庫以最快速度恢復服務,提高服務可用性。
15、amoeba進行數據切分
根據數據的特點,將不同特性的數據紀錄存放到不同的數據庫服務器中就是數據切分,可以設置規則匹配數據特性以實現數據切分,其實,數據切分就是根據設置規則將數據分別存放到不同的數據庫,以減輕數據庫服務器的壓力和減小單個數據庫的大小,可通過設置amoeba的rule.xml文件中的切片規則實現。原理如圖:
水平分割:將關鍵字段按特定的算法存放到不同的服務器
垂直分割:將數據按業務的不同分別保存到不同的服務器
數據庫擴展讀寫分離軟件還有:mycat,mysql-proxy,maxscale