當前位置:編程學習大全網 - 編程語言 - 什麽是MySql數據庫

什麽是MySql數據庫

MySQL數據庫:MySQL是壹種開放源代碼的關系型數據庫管理系統(RDBMS),使用最常用的數據庫管理語言--結構化查詢語言(SQL)進行數據庫管理。

MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。

MySQL因為其速度、可靠性和適應性而備受關註。大多數人都認為在不需要事務化處理的情況下,MySQL是管理內容最好的選擇。

數據庫簡介:

MySQL是壹種開放源代碼的關系型數據庫管理系統(RDBMS),MySQL數據庫系統使用最常用的數據庫管理語言--結構化查詢語言(SQL)進行數據庫管理。

由於MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。MySQL因為其速度、可靠性和適應性而備受關註。大多數人都認為在不需要事務化處理的情況下,MySQL是管理內容最好的選擇。

MySQL這個名字,起源不是很明確。壹個比較有影響的說法是,基本指南和大量的庫和工具帶有前綴“my”已經有10年以上,而且不管怎樣,MySQL AB創始人之壹的Monty Widenius的女兒也叫My。這兩個到底是哪壹個給出了MySQL這個名字至今依然是個迷,包括開發者在內也不知道。

MySQL的海豚標誌的名字叫“sakila”,它是由MySQL AB的創始人從用戶在“海豚命名”的競賽中建議的大量的名字表中選出的。獲勝的名字是由來自非洲斯威士蘭的開源軟件開發者Ambrose Twebaze提供。根據Ambrose所說,Sakila來自壹種叫SiSwati的斯威士蘭方言,也是在Ambrose的家鄉烏幹達附近的坦桑尼亞的Arusha的壹個小鎮的名字。

MySQL,雖然功能未必很強大,但因為它的開源、廣泛傳播,導致很多人都了解到這個數據庫。它的歷史也富有傳奇性。

MySQL數據庫歷史:

MySQL的歷史最早可以追溯到1979年,那時Oracle也才小打小鬧,微軟的SQL Server影子都沒有。有壹個人叫Monty Widenius, 為壹個叫TcX的小公司打工,並用BASIC設計了壹個報表工具,可以在4M主頻和16KB內存的計算機上運行。過了不久,又將此工具,使用C語言重寫,移植到Unix平臺,當時,它只是壹個很底層的面向報表的存儲引擎。這個工具叫做Unireg。

可是,這個小公司資源有限,Monty天賦極高,面對資源有限的不利條件,他反而更能發揮潛能,總是力圖寫出最高效的代碼。並因此養成了習慣。與Monty同在壹起的還有壹些別的同事,很少有人能堅持把那些代碼持續寫到20年後,而Monty卻做到了。

1990年,TcX的customer 中開始有人要求要為它的API提供SQL支持,當時,有人想到了直接使用商用數據庫算了,但是Monty覺得商用數據庫的速度難令人滿意。於是,他直接借助於mSQL的代碼,將它集成到自己的存儲引擎中。但不巧的是,效果並不太好。於是, Monty雄心大起,決心自己重寫壹個SQL支持。

1996年,MySQL 1.0發布,只面向壹小撥人,相當於內部發布。到了96年10月,MySQL 3.11.1發布了,呵呵,沒有2.x版本。最開始,只提供了Solaris下的二進制版本。壹個月後,Linux版本出現了。

緊接下來的兩年裏,MySQL依次移植到各個平臺下。它發布時,采用的許可策略,有些與眾不同:允許免費商用,但是不能將MySQL與自己的產品綁定在壹起發布。如果想壹起發布,就必須使用特殊許可,意味著要花銀子。當然,商業支持也是需要花銀子的。其它的,隨用戶怎麽用都可以。這種特殊許可為MySQL帶來了壹些收入,從而為它的持續發展打下了良好的基礎。(細想想,PostgreSQL曾經有幾年限入低谷,可能與它的完全免費,不受任何限制有關系)。

MySQL3.22應該是壹個標誌性的版本,提供了基本的SQL支持。

MySQL關系型數據庫於1998年1月發行第壹個版本。它使用系統核心提供的多線程機制提供完全的多線程運行模式,提供了面向C、C++、Eiffel、Java、Perl、PHP、Python以及Tcl等編程語言的編程接口(APIs),支持多種字段類型並且提供了完整的操作符支持查詢中的SELECT和WHERE操作。

MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。MySQL因為其速度、可靠性和適應性而備受關註。

1999-2000年,有壹家公司在瑞典成立了,叫MySQL AB (AB是瑞典語“股份公司”的意思)。 雇了幾個人,與Sleepycat合作,開發出了 Berkeley DB引擎, 因為BDB支持事務處理,所以,MySQL從此開始支持事務處理了。

2000年4月,MySQL對舊的存儲引擎進行了整理,命名為MyISAM。同時,2001年,Heikiki Tuuri向MySQL提出建議,希望能集成他們的存儲引擎InnoDB,這個引擎同樣支持事務處理,還支持行級鎖。

如今,遺憾的是,BDB和InnoDB好像都被Oracle收購了,為了消滅競爭對手,哪怕是開源的,都是不擇手段。

MySQL與InnoDB的正式結合版本是4.0。

到了MySQL5.0,2003年12月,開始有View,存儲過程之類的東東,當然,其間, bug也挺多。

在2008年1月16號 MySQL被Sun公司收購。

最近,MySQL的創始人Monty Widenius已經向Sun提交了辭呈。head都要走了。

據說,被Sun收購的公司多薄命,不知道MySQL今後前途如何,希望壹路走好。相信MySQL的生命力還是很長久的。

時至今日 mysql 和 php 的結合絕對是完美.很多大型的網站也用到mysql數據庫.mysql的發展前景是非常光明的!

MySQL常用命令:

1:使用SHOW語句找出在服務器上當前存在什麽數據庫:

mysql> SHOW DATABASES;

2:2、創建壹個數據庫MYSQLDATA

mysql> CREATE DATABASE MYSQLDATA;

3:選擇妳所創建的數據庫

mysql> USE MYSQLDATA; (按回車鍵出現Database changed 時說明操作成功!)

4:查看現在的數據庫中存在什麽表

mysql> SHOW TABLES;

5:創建壹個數據庫表

mysql> CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));

6:顯示表的結構:

mysql> DESCRIBE MYTABLE;

7:往表中加入記錄

mysql> insert into MYTABLE values (”hyq”,”M”);

8:用文本方式將數據裝入數據庫表中(例如D:/mysql.txt)

mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE MYTABLE;

9:導入.sql文件命令(例如D:/mysql.sql)

mysql>use database;

mysql>source d:/mysql.sql;

10:刪除表

mysql>drop TABLE MYTABLE;

11:清空表

mysql>delete from MYTABLE;

12:更新表中數據

mysql>update MYTABLE set sex=”f” where name=’hyq’;

全局管理權限對應解釋:

FILE: 在MySQL服務器上讀寫文件。

PROCESS: 顯示或殺死屬於其它用戶的服務線程。

RELOAD: 重載訪問控制表,刷新日誌等。

SHUTDOWN: 關閉MySQL服務。

數據庫/數據表/數據列權限:

ALTER: 修改已存在的數據表(例如增加/刪除列)和索引。

CREATE: 建立新的數據庫或數據表。

DELETE: 刪除表的記錄。

DROP: 刪除數據表或數據庫。

INDEX: 建立或刪除索引。

INSERT: 增加表的記錄。

SELECT: 顯示/搜索表的記錄。

UPDATE: 修改表中已存在的記錄。

特別的權限:

ALL: 允許做任何事(和root壹樣)。

USAGE: 只允許登錄–其它什麽也不允許做。

MySQL數據庫導入方法:

MySQL數據庫的導入,有兩種方法:

1) 先導出數據庫SQL腳本,再導入;

2) 直接拷貝數據庫目錄和文件。

在不同操作系統或MySQL版本情況下,直接拷貝文件的方法可能會有不兼容的情況發生。

所以壹般推薦用SQL腳本形式導入。下面分別介紹兩種方法。

2. 方法壹 SQL腳本形式

操作步驟如下:

2.1. 導出SQL腳本

在原數據庫服務器上,可以用phpMyAdmin工具,或者mysqldump命令行,導出SQL腳本。

2.1.1 用phpMyAdmin工具

導出選項中,選擇導出“結構”和“數據”,不要添加“DROP DATABASE”和“DROP TABLE”選項。

選中“另存為文件”選項,如果數據比較多,可以選中“gzipped”選項。

將導出的SQL文件保存下來。

2.1.2 用mysqldump命令行

命令格式

mysqldump -u 用戶名 -p 數據庫名 > 數據庫名.sql

範例:

mysqldump -u root -p abc > abc.sql

(導出數據庫abc到abc.sql文件)

提示輸入密碼時,輸入該數據庫用戶名的密碼。

2.2. 創建空的數據庫

通過主控界面/控制面板,創建壹個數據庫。假設數據庫名為abc,數據庫全權用戶為abc_f。

2.3. 將SQL腳本導入執行

同樣是兩種方法,壹種用phpMyAdmin(mysql數據庫管理)工具,或者mysql命令行。

2.3.1 用phpMyAdmin工具

從控制面板,選擇創建的空數據庫,點“管理”,進入管理工具頁面。

在"SQL"菜單中,瀏覽選擇剛才導出的SQL文件,點擊“執行”以上載並執行。

註意:phpMyAdmin對上載的文件大小有限制,php本身對上載文件大小也有限制,如果原始sql文件

比較大,可以先用gzip對它進行壓縮,對於sql文件這樣的文本文件,可獲得1:5或更高的壓縮率。

gzip使用方法:

# gzip xxxxx.sql

得到

xxxxx.sql.gz文件。

提示輸入密碼時,輸入該數據庫用戶名的密碼。

3 直接拷貝

如果數據庫比較大,可以考慮用直接拷貝的方法,但不同版本和操作系統之間可能不兼容,要慎用。

3.1 準備原始文件

用tar打包為壹個文件

3.2 創建空數據庫

3.3 解壓

在臨時目錄中解壓,如:

cd /tmp

tar zxf mydb.tar.gz

3.4 拷貝

將解壓後的數據庫文件拷貝到相關目錄

cd mydb/

cp * /var/lib/mysql/mydb/

對於FreeBSD:

cp * /var/db/mysql/mydb/

3.5 權限設置

將拷貝過去的文件的屬主改為mysql:mysql,權限改為660

chown mysql:mysql /var/lib/mysql/mydb/*

chmod 660 /var/lib/mysql/mydb/*

Mssql轉換mysql的方法:

1.導表結構

使用MySQL生成create腳本的方法。找到生成要導出的腳本,按MySQL的語法修改壹下到MySQL數據庫中創建該表的列結構什麽的。

2.導表數據

在MSSQL端使用bcp導出文本文件:

bcp “Select * FROM dbname.dbo.tablename;” queryout tablename.txt -c -Slocalhost\db2005 -Usa

其中”"中是要導出的sql語句,-c指定使用\t進行字段分隔,使用\n進行記錄分隔,-S指定數據庫服務器及實例,-U指定用戶名,-P指定密碼.

在MySQL端使用mysqlimport 導入文本文件到相應表中

mysqlimport -uroot -p databasename /home/test/tablename.txt

其中-u指定用戶名,-p指定密碼,databasename指定數據庫名稱,表名與文件名相同

MySQL備份與恢復:

MySQL備份恢復數據的壹般步驟

備份壹個數據庫的例子:

1、備份前讀鎖定涉及的表

mysql>LOCK TABLES tbl1 READ,tbl1 READ,…

如果,妳在mysqldump實用程序中使用--lock-tables選項則不必使用如上SQL語句。

2、導出數據庫中表的結構和數據

shell>mysqldump --opt db_name>db_name.sql

3、啟用新的更新日誌

shell>mysqladmin flush-logs

這樣可以記錄妳備份後的數據改變為恢復數據準備。

4、解除表的讀鎖

mysql>UNLOCK TABLES;

為了加速上述過程,妳可以這樣做:

shell> mysqldump --lock-tables --opt db_name>db_name.sql; mysqladmin flush-logs

但是這樣可能會有點小問題。上命令在啟用新的更新日誌前就恢復表的讀鎖,

在更新繁忙的站點,可能有備份後的更新數據沒有記錄在新的日誌中。

現在恢復上面備份的數據庫

1、對涉及的表使用寫鎖

mysql>LOCK TABLES tbl1 WRITE,tbl1 WRITE,…

2、恢復備份的數據

shell>mysql db_name < db_name.sql

3、恢復更新日誌的內容

shell>mysql --one-database db_name < hostname.nnn

假設需要使用的日誌名字為hostname.nnn

4、啟用新的更新日誌

shell>mysqladmin flush-logs

5、解除表的寫鎖

mysql>UNLOCK TABLES;

希望上面的例子能給妳啟發,因為備份數據的手法多種多樣,妳所使用的和上面所述可能大不壹樣,但是對於備份和恢復中,表的鎖定、啟用新的更新日誌的時機應該是類似的,仔細考慮這個問題。

MySQL數據庫優化:

選擇InnoDB作為存儲引擎

大型產品的數據庫對於可靠性和並發性的要求較高,InnoDB作為默認的MySQL存儲引擎,相對於MyISAM來說是個更佳的選擇。

優化數據庫結構

組織數據庫的schema、表和字段以降低I/O的開銷,將相關項保存在壹起,並提前規劃,以便隨著數據量的增長,性能可以保持較高的水平。

設計數據表應盡量使其占用的空間最小化,表的主鍵應盡可能短。·對於InnoDB表,主鍵所在的列在每個輔助索引條目中都是可復制的,因此如果有很多輔助索引,那麽壹個短的主鍵可以節省大量空間。

僅創建妳需要改進查詢性能的索引。索引有助於檢索,但是會增加插入和更新操作的執行時間。

InnoDB的ChangeBuffering特性

InnoDB提供了changebuffering的配置,可減少維護輔助索引所需的磁盤I/O。大規模的數據庫可能會遇到大量的表操作和大量的I/O,以保證輔助索引保持最新。當相關頁面不在緩沖池裏面時,InnoDB的changebuffer將會更改緩存到輔助索引條目,從而避免因不能立即從磁盤讀取頁面而導致耗時的I/O操作。當頁面被加載到緩沖池時,緩沖的更改將被合並,更新的頁面之後會刷新到磁盤。這樣做可提高性能,適用於MySQL5.5及更高版本。

InnoDB頁面壓縮

InnoDB支持對表進行頁面級的壓縮。當寫入數據頁的時候,會有特定的壓縮算法對其進行壓縮。壓縮後的數據會寫入磁盤,其打孔機制會釋放頁面末尾的空塊。如果壓縮失敗,數據會按原樣寫入。表和索引都會被壓縮,因為索引通常是數據庫總大小中占比很大的壹部分,壓縮可以顯著節約內存,I/O或處理時間,這樣就達到了提高性能和伸縮性的目的。它還可以減少內存和磁盤之間傳輸的數據量。MySQL5.1及更高版本支持該功能。

註意,頁面壓縮並不能支持***享表空間中的表。***享表空間包括系統表空間、臨時表空間和常規表空間。

使用批量數據導入

在主鍵上使用已排序的數據源進行批量數據的導入可加快數據插入的過程。否則,可能需要在其他行之間插入行以維護排序,這會導致磁盤I/O變高,進而影響性能,增加頁的拆分。關閉自動提交的模式也是有好處的,因為它會為每個插入執行日誌刷新到磁盤。在批量插入期間臨時轉移唯壹鍵和外鍵檢查也可顯著降低磁盤I/O。對於新建的表,最好的做法是在批量導入後創建外鍵/唯壹鍵約束。

壹旦妳的數據達到穩定的大小,或者增長的表增加了幾十或幾百兆字節,就應該考慮使用OPTIMIZETABLE語句重新組織表並壓縮浪費的空間。對重新組織後的表進行全表掃描所需要的I/O會更少。

優化InnoDB磁盤I/O

增加InnoDB緩沖池大小可以讓查詢從緩沖池訪問而不是通過磁盤I/O訪問。通過調整系統變量innodb_flush_method來調整清除緩沖的指標使其達到最佳水平。

MySQL的內存分配

在為MySQL分配足夠的內存之前,請考慮不同領域對MySQL的內存需求。要考慮的關鍵領域是:並發連接——對於大量並發連接,排序和臨時表將需要大量內存。在撰寫本文時,對於處理3000+並發連接的數據庫,16GB到32GB的RAM是足夠的。

內存碎片可以消耗大約10%或更多的內存。像innodb_buffer_pool_size、key_buffer_size、query_cache_size等緩存和緩沖區要消耗大約80%的已分配內存。

日常維護

定期檢查慢的查詢日誌並優化查詢機制以有效使用緩存來減少磁盤I/O。優化它們,以掃描最少的行數,而不是進行全表掃描。

其他可以幫助DBA檢查和分析性能的日誌包括:錯誤日誌、常規查詢日誌、二進制日誌、DDL日誌(元數據日誌)。

定期刷新緩存和緩沖區以降低碎片化。使用OPTIMIZETABLE語句重新組織表並壓縮任何可能被浪費的空間。?

  • 上一篇:應用程序發生異常 未知的軟件異常 (0xc0000409),位置為 0x0050aeec 怎麽辦
  • 下一篇:中國電信薪資待遇如何?
  • copyright 2024編程學習大全網