簡介
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的曆史最早可以追溯到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年,MySQL1.0發布,隻面向一小撥人,相當于内部發布。到了96年10月,MySQL3.11.1發布了,最開始,隻提供了Solaris下的二進制版本。一個月後,Linux版本出現了。
緊接下來的兩年裡,MySQL依次移植到各個平台下。它發布時,采用的許可策略,有些與衆不同:允許免費商用,但是不能将MySQL與自己的産品綁定在一起發布。如果想一起發布,就必須使用特殊許可,意味着要花銀子。當然,商業支持也是需要花銀子的。其它的,随用戶怎麼用都可以。這種特殊許可為MySQL帶來了一些收入,從而為它的持續發展打下了良好的基礎。
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,這個引擎同樣支持事務處理,還支持行級鎖。
MySQL與InnoDB的正式結合版本是4.0。
到了MySQL5.0,2003年12月,開始有View,存儲過程之類的東東,當然,其間,bug也挺多。
在2008年1月16号,MySQL被Sun公司收購。
存儲引擎
MyISAM Mysql的默認數據庫,最為常用。擁有較高的插入,查詢速度,但不支持事務
InnoDB事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定
BDB源自Berkeley DB,事務型數據庫的另一種選擇,支持COMMIT和ROLLBACK等其他事務特性
Memory所有數據置于内存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會占用和數據量成正比的内存空間。并且其内容會在Mysql重新啟動時丢失
Merge将一定數量的MyISAM表聯合而成一個整體,在超大規模數據存儲時很有用
Archive非常适合存儲大量的獨立的,作為曆史記錄的數據。因為它們不經常被讀取。Archive擁有高效的插入速度,但其對查詢的支持相對較差
Federated将不同的Mysql服務器聯合起來,邏輯上組成一個完整的數據庫。非常适合分布式應用
Cluster/NDB高冗餘的存儲引擎,用多台數據機器聯合提供服務以提高整體性能和安全性。适合數據量大,安全和性能要求高的應用
CSV邏輯上由逗号分割數據的存儲引擎
BlackHole黑洞引擎,寫入的任何數據都會消失,一般用于記錄binlog做複制的中繼
另外,Mysql的存儲引擎接口定義良好。有興趣的開發者通過閱讀文檔編寫自己的存儲引擎。
應用架構
單點(Single),适合小規模應用
複制(Replication),适合中小規模應用
集群(Cluster),适合大規模應用
Mysql架構及應用(3張)
MySQL4.1版本中增加了不少新的性能,包括對主鍵的更高速度的緩存,對子查詢的更好的支持,以及應網絡約會網站所要求的,基于地理信息的查詢。
其同步開發的5.0版本則把目标對準了企業用戶,對于4.1版本中的所有新特性,5.0版本悉數收入囊中,并且獨具以下特點:對外鍵的良好支持;系統自動報錯機制以及對存儲過程的充分支持。
索引文件
随着網絡數據量的增大,用戶對數據庫查詢的要求也越來越高,普通的查詢有時很難滿足要求,迫切需要對于MySQL語句實現優化,以提高查詢效率。其中最常用的是創建索引。
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表裡所有記錄的引用指針。索引不是萬能的,索引可以加快數據檢索操作,但會使數據修改操作變慢。每修改數據記錄,索引就必須刷新一次。為了在某種程序上彌補這一缺陷,許多SQL命令都有一個DELAY_KEY_WRITE項。這個選項的作用是暫時制止MySQL在該命令每插入一條新記錄和每修改一條現有之後立刻對索引進行刷新,對索引的刷新将等到全部記錄插入/修改完畢之後再進行。
在需要把許多新記錄插入某個數據表的場合,DELAY_KEY_WRITE選項的作用将非常明顯。另外,索引還會在硬盤上占用相當大的空間。因此應該隻為最經常查詢和最經常排序的數據列建立索引。注意,如果某個數據列包含許多重複的内容,為它建立索引就沒有太大的實際效果。
适當的數據表索引、SQL查詢語句中“*”及“limit”的優化、id限定分頁查詢和查詢緩存技術會大大提高數據庫的響應速度。
從理論上講,完全可以為數據表裡的每個字段分别建一個索引,但MySQL把同一個數據表裡的索引總數限制為16個。
1、InnoDB數據表的索引
與InnoDB數據表相比,在InnoDB數據表上,索引對InnoDB數據表的重要性要大得多。在InnoDB數據表上,索引不僅會在搜索數據記錄時發揮作用,還是數據行級鎖定機制的苊、基礎。“數據行級鎖定”的意思是指在事務操作的執行過程中鎖定正在被處理的個别記錄,不讓其他用戶進行訪問。這種鎖定将影響到(但不限于)SELECT、LOCKINSHAREMODE、SELECT、FORUPDATE命令以及INSERT、UPDATE和DELETE命令。出于效率方面的考慮,InnoDB數據表的數據行級鎖定實際發生在它們的索引上,而不是數據表自身上。顯然,數據行級鎖定機制隻有在有關的數據表有一個合适的索引可供鎖定的時候才能發揮效力。
2、限制
如果WHERE子句的查詢條件裡有不等号(WHEREcoloum!=),MySQL将無法使用索引。類似地,如果WHERE子句的查詢條件裡使用了函數(WHEREDAY(column)=),MySQL也将無法使用索引。在JOIN操作中(需要從多個數據表提取數據時),MySQL隻有在主鍵和外鍵的數據類型相同時才能使用索引。
如果WHERE子句的查詢條件裡使用比較操作符LIKE和REGEXP,MySQL隻有在搜索模闆的第一個字符不是通配符的情況下才能使用索引。比如說,如果查詢條件是LIKE'abc%‘,MySQL将使用索引;如果查詢條件是LIKE'%abc’,MySQL将不使用索引。
在ORDERBY操作中,MySQL隻有在排序條件不是一個查詢條件表達式的情況下才使用索引。(雖然如此,在涉及多個數據表查詢裡,即使有索引可用,那些索引在加快ORDERBY方面也沒什麼作用)。如果某個數據列裡包含許多重複的值,就算為它建立了索引也不會有很好的效果。比如說,如果某個數據列裡包含的淨是些諸如“0/1”或“Y/N”等值,就沒有必要為它創建一個索引。
MySQL普通索引、唯一索引和主索引
1、普通索引
普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。因此,應該隻為那些最經常出現在查詢條件(WHEREcolumn=)或排序條件(ORDERBYcolumn)中的數據列創建索引。隻要有可能,就應該選擇一個數據最整齊、最緊湊的數據列(如一個整數類型的數據列)來創建索引。
2、唯一索引
普通索引允許被索引的數據列包含重複的值。比如說,因為人有可能同名,所以同一個姓名在同一個“員工個人資料”數據表裡可能出現兩次或更多次。
如果能确定某個數據列将隻包含彼此各不相同的值,在為這個數據列創建索引的時候就應該用關鍵字UNIQUE把它定義為一個唯一索引。這麼做的好處:一是簡化了MySQL對這個索引的管理工作,這個索引也因此而變得更有效率;二是MySQL會在有新記錄插入數據表時,自動檢查新記錄的這個字段的值是否已經在某個記錄的這個字段裡出現過了;如果是,MySQL将拒絕插入那條新記錄。也就是說,唯一索引可以保證數據記錄的唯一性。事實上,在許多場合,人們創建唯一索引的目的往往不是為了提高訪問速度,而隻是為了避免數據出現重複。
3、主索引
在前面已經反複多次強調過:必須為主鍵字段創建一個索引,這個索引就是所謂的“主索引”。主索引與唯一索引的唯一區别是:前者在定義時使用的關鍵字是PRIMARY而不是UNIQUE。
4、外鍵索引
如果為某個外鍵字段定義了一個外鍵約束條件,MySQL就會定義一個内部索引來幫助自己以最有效率的方式去管理和使用外鍵約束條件。
5、複合索引
索引可以複蓋多個數據列,如像INDEX(columnA,columnB)索引。這種索引的特點是MySQL可以有選擇地使用一個這樣的索引。如果查詢操作隻需要用到columnA數據列上的一個索引,就可以使用複合索引INDEX(columnA,columnB)。不過,這種用法僅适用于在複合索引中排列在前的數據列組合。比如說,INDEX(A,B,C)可以當做A或(A,B)的索引來使用,但不能當做B、C或(B,C)的索引來使用。
6、索引的長度
在為CHAR和VARCHAR類型的數據列定義索引時,可以把索引的長度限制為一個給定的字符個數(這個數字必須小于這個字段所允許的最大字符個數)。這麼做的好處是可以生成一個尺寸比較小、檢索速度卻比較快的索引文件。在絕大多數應用裡,數據庫中的字符串數據大都以各種各樣的名字為主,把索引的長度設置為10~15個字符已經足以把搜索範圍縮小到很少的幾條數據記錄了。
在為BLOB和TEXT類型的數據列創建索引時,必須對索引的長度做出限制;MySQL所允許的最大索引全文索引文本字段上的普通索引隻能加快對出現在字段内容最前面的字符串(也就是字段内容開頭的字符)進行檢索操作。如果字段裡存放的是由幾個、甚至是多個單詞構成的較大段文字,普通索引就沒什麼作用了。這種檢索往往以的形式出現,這對MySQL來說很複雜,如果需要處理的數據量很大,響應時間就會很長。
這類場合正是全文索引(full-textindex)可以大顯身手的地方。在生成這種類型的索引時,MySQL将把在文本中出現的所有單詞創建為一份清單,查詢操作将根據這份清單去檢索有關的數據記錄。全文索引即可以随數據表一同創建,也可以等日後有必要時再使用下面這條命令添加:
ALTERTABLEtablenameADDFULLTEXT(column1,column2)有了全文索引,就可以用SELECT查詢命令去檢索那些包含着一個或多個給定單詞的數據記錄了。下面是這類查詢命令的基本語法:
SELECT*FROMtablename
WHEREMATCH(column1,column2)AGAINST(‘word1','word2','word3’)
上面這條命令将把column1和column2字段裡有word1、word2和word3的數據記錄全部查詢出來。
注解:InnoDB數據表不支持全文索引。
文件優化
查詢和索引的優化
隻有當數據庫裡已經有了足夠多的測試數據時,它的性能測試結果才有實際參考價值。如果在測試數據庫裡隻有幾百條數據記錄,它們往往在執行完第一條查詢命令之後就被全部加載到内存裡,這将使後續的查詢命令都執行得非常快——不管有沒有使用索引。隻有當數據庫裡的記錄超過了1000條、數據總量也超過了MySQL服務器上的内存總量時,數據庫的性能測試結果才有意義。
在不确定應該在哪些數據列上創建索引的時候,人們從EXPLAINSELECT命令那裡往往可以獲得一些幫助。這其實隻是簡單地給一條普通的SELECT命令加一個EXPLAIN關鍵字作為前綴而已。有了這個關鍵字,MySQL将不是去執行那條SELECT命令,而是去對它進行分析。MySQL将以表格的形式把查詢的執行過程和用到的索引等信息列出來。
在EXPLAIN命令的輸出結果裡,第1列是從數據庫讀取的數據表的名字,它們按被讀取的先後順序排列。type列指定了本數據表與其它數據表之間的關聯關系(JOIN)。在各種類型的關聯關系當中,效率最高的是system,然後依次是const、eq_ref、ref、range、index和All(All的意思是:對應于上一級數據表裡的每一條記錄,這個數據表裡的所有記錄都必須被讀取一遍——這種情況往往可以用一索引來避免)。
possible_keys數據列給出了MySQL在搜索數據記錄時可選用的各個索引。key數據列是MySQL實際選用的索引,這個索引按字節計算的長度在key_len數據列裡給出。比如說,對于一個INTEGER數據列的索引,這個字節長度将是4。如果用到了複合索引,在key_len數據列裡還可以看到MySQL具體使用了它的哪些部分。作為一般規律,key_len數據列裡的值越小越好。
ref數據列給出了關聯關系中另一個數據表裡的數據列的名字。row數據列是MySQL在執行這個查詢時預計會從這個數據表裡讀出的數據行的個數。row數據列裡的所有數字的乘積可以大緻了解這個查詢需要處理多少組合。
最後,extra數據列提供了與JOIN操作有關的更多信息,比如說,如果MySQL在執行這個查詢時必須創建一個臨時數據表,就會在extra列看到usingtemporary字樣。
MYSQL-安裝注意
1、如果是用MySQL+Apache,使用的又是FreeBSD網路操作系統的話,安裝時候你應按注意到FreeBSD的版本問題,在FreeBSD的3.0以下版本來說,MySQLSource内含的MIT-pthread運行是正常的,但在這版本以上,你必須使用nativethreads,也就是加入一個with-named-thread-libs=-lc_r的選項。
2、如果在COMPILE過程中出了問題,請先檢查你的gcc版本是否在2.81版本以上,gmake版本是否在3.75以上。
3、如果不是版本的問題,那可能是你的内存不足,請使用./configure--with-low-memory來加入。
4、如果要重新做你的configure,那麼你可以鍵入rmconfig.cache和makeclean來清除記錄。
5、把MySQL安裝在/usr/local目錄下,這是缺省值,您也可以按照你的需要設定你所安裝的目錄。
MYSQL-報錯解決
1、Starting MySQL.Manager of pid-file quit without updating fi[失敗]
關于這個錯誤原因有很多,最大的可能是沒有創建測試數據庫,可以用/usr/local/mysql/scripts/mysql_install_db –user=mysql命令進行創建;另外一個原因可能是權限設置問題,需要賦予mysql的data權限,可以用chmod -R命令。
2、FATAL ERROR: Could not find /home/mysql/bin/my_print_defaults If you are using a binary release, you must run this script from
within the directory the archive extracted into. If you compiled
MySQL yourself you must run ‘make install’ first.
這個錯誤,是沒有指明mysql的date路徑導緻的,可以很簡單的進行解決:
vim /etc/my.cnf
在[mysld]後面加上路徑:
basedir = /usr/local/mysql
datadir =/opt/data;
3、-bash: mysql: command not found
用mysql命令進行登陸mysql報錯,原因是沒有設置環境變量,需要設置,或者進入到bin目錄進行登陸cd/usr/local/mysql/bin
mysql -u root
4、ERROR 1130: Host ’192.168.1.3′ is not allowed to connect to this MySQL server
用mysql遠程工具鍊接數據庫報錯,這個錯誤原因是沒有開放遠程鍊接功能,可以在mysql裡面輸入如下命令進行解決:GRANT ALL PRIVILEGES ON *.* TO ’root‘@’%' IDENTIFIED BY ’password’ WITH GRANT OPTION;
版本
MySQL開發組計劃于2001年中期公布MySQL4.0版本。在這個版本中将有以下新的特性被提供:新的表定義文件格式、高性能的數據複制功能、更加強大的全文搜索功能。在此之後,MySQL開發着希望提供安全的數據複制機制、在BeOS操作系統上的MySQL實現以及對延時關鍵字的定期刷新選項。随着時間的推進,MySQL将對ANSI 92/ANSI 99标準完全兼容。
常用命令
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提供的官方手冊中,英文版本包括以下系列:
MySQL 5.5參考手冊
MySQL 5.4參考手冊
MySQL 5.1參考手冊
MySQL 5.0參考手冊
MySQL 3.23/4.0/4.1參考手冊
中文版本為5.1在線參考手冊,URL參考擴展閱讀
初學指南
連接MYSQL
格式:mysql -h主機地址-u用戶名-p用戶密碼
1、例1:連接到本機上的MYSQL。
首先在打開DOS窗口,然後進入目錄mysqlbin,再鍵入命令mysql -uroot -p,回車後提示你輸密碼,如果剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車即可進入到MYSQL中了,MYSQL的提示符是:mysql>
2、例2:連接到遠程主機上的MYSQL。假設遠程主機的IP為:110.110.110.110,用戶名為root,密碼為abcd123。則鍵入以下命令:
mysql-h110.110.110.110-uroot-pabcd123
(注:u與root可以不用加空格,其它也一樣)
3、退出MYSQL命令:exit(回車)
注意:想要成功連接到遠程主機,需要在遠程主機打開MySQL遠程訪問權限
方法如下:
在遠程主機中以管理員夥身份進入
輸入如下命令
mysql>GRANT ALL PRIVILEGES ON *.* TO 'agui'@%'IDENTIFIED BY '123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
//賦予任何主機訪問數據的權限
mysql>FLUSH PRIVILEGES
//修改生效
agui為我們使用的用戶名
密碼為123
即:在遠程主機上作好設置,我們即可通過mysql-h110.110.110.110 -uagui -p123連接進遠程主機
修改密碼
格式:mysqladmin,-u用戶名,-p舊密碼,password新密碼
1、例1:給root加個密碼ab12。首先在DOS下進入目錄mysqlbin,然後鍵入以下命令
mysqladmin -uroot -password ab12
注:因為開始時root沒有密碼,所以-p舊密碼一項就可以省略了。
2、例2:再将root的密碼改為djg345。
mysqladmin -uroot -pab12 password djg345
增加新用戶
(注意:和上面不同,下面的因為是MYSQL環境中的命令,所以後面都帶一個分号作為命令結束符)
格式:grant select on 數據庫.* to 用戶名@登錄主機 identified by“密碼”
例1、增加一個用戶test1密碼為abc,讓他可以在任何主機上登錄,并對所有數據庫有查詢、插入、修改、删除的權限。首先用以root用戶連入MYSQL,然後鍵入以下命令:
grant select,insert,update,delete on *.* to test1@“%” Identified by “abc”;
但例1增加的用戶是十分危險的,你想如某個人知道test1的密碼,那麼他就可以在internet上的任何一台電腦上登錄你的mysql數據庫并對你的數據可以為所欲為了,解決辦法見例2。
例2、增加一個用戶test2密碼為abc,讓他隻可以在localhost上登錄,并可以對數據庫mydb進行查詢、插入、修改、删除的操作(localhost指本地主機,即MYSQL數據庫所在的那台主機),這樣用戶即使用知道test2的密碼,他也無法從internet上直接訪問數據庫,隻能通過MYSQL主機上的web頁來訪問了。
grant select,insert,update,delete on mydb.* to test2@localhost identified by “abc”;
如果你不想test2有密碼,可以再打一個命令将密碼消掉。
grant select,insert,update,delete on mydb.* to test2@localhost identified by “”;
下面來看看MYSQL中有關數據庫方面的操作。注意:必須首先登錄到MYSQL中,以下操作都是在MYSQL的提示符下進行的,而且每個命令以分号結束。
操作技巧
1、如果你打命令時,回車後發現忘記加分号,你無須重打一遍命令,隻要打個分号回車就可以了。也就是說你可以把一個完整的命令分成幾行來打,完後用分号作結束标志就OK。
2、你可以使用光标上下鍵調出以前的命令。但以前我用過的一個MYSQL舊版本不支持。我現在用的是mysql-3.23.27-beta-win。
顯示命令
1、顯示數據庫列表。
show databases;
剛開始時才兩個數據庫:mysql和test。mysql庫很重要它裡面有MYSQL的系統信息,我們改密碼和新增用戶,實際上就是用這個庫進行操作。
2、顯示庫中的數據表:
use mysql; //打開庫,學過FOXBASE的一定不會陌生吧
show tables;
3、顯示數據表的結構:
describe 表名;
4、建庫:
create database 庫名;
5、建表:
use 庫名;
create table 表名 (字段設定列表);
6、删庫和删表:
drop database 庫名;
drop table 表名;
7、将表中記錄清空:
delete from 表名;
8、顯示表中的記錄:
select * from 表名;
一個建庫和建表以及插入數據的實例
drop database if exists school; //如果存在SCHOOL則删除
create database school; //建立庫SCHOOL
use school; //打開庫SCHOOL
create table teacher //建立表TEACHER
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default ‘深圳',
year date
);//建表結束
//以下為插入字段
insert into teacher values('','glchengang',’深圳一中‘,'1976-10-10');
insert into teacher values('','jack',’深圳一中‘,'1975-12-23');
注:在建表中:
(1)将ID設為長度為3的數字字段:int(3)并讓它每個記錄自動加一:auto_increment并不能為空:not null而且讓他成為主字段primary key。
(2)将NAME設為長度為10的字符字段。
(3)将ADDRESS設為長度50的字符字段,而且缺省值為深圳。varchar和char有什麼區别呢,隻有等以後的文章再說了。
(4)将YEAR設為日期字段。
如果你在mysql提示符鍵入上面的命令也可以,但不方便調試。你可以将以上命令原樣寫入一個文本文件中假設為school.sql,然後複制到c:下,并在DOS狀态進入目錄mysqlbin,然後鍵入以下命令:
mysql -uroot -p密碼 < c:school.sql
如果成功,空出一行無任何顯示;如有錯誤,會有提示。(以上命令已經調試,你隻要将//的注釋去掉即可使用)。
将文本數據轉到數據庫中
1、文本數據應符合的格式:字段數據之間用tab鍵隔開,null值用n來代替.
例:
3 rose 深圳二中 1976-10-10
4 mike 深圳一中 1975-12-23
2、數據傳入命令 load data local infile “文件名” into table 表名;
注意:你最好将文件複制到mysqlbin目錄下,并且要先用use命令打開表所在的數據庫。
八、備份數據庫:(命令在DOS的mysqlbin目錄下執行)
mysqldump --opt school>school.bbb
注釋:将數據庫school備份到school.bbb文件,school.bbb是一個文本文件,文件名任取,打開看看你會有新發現。
安全指南
作為一個MySQL的系統管理員,你有責任維護你的MySQL數據庫系統的數據安全性和完整性。下面主要介紹如何建立一個安全的MySQL系統,從系統内部和外部網絡兩個角度,提供一個安全指南。
一、内部安全性-保證數據目錄訪問的安全
1.1數據庫文件。
1.2日志文件。
二、外部安全性-保證網絡訪問的安全
2.1MySQL授權表的結構和内容
2.2服務器控制客戶訪問
2.3避免授權表風險
2.4不用GRANT設置用戶
管理工具
使用各種精心設計的工具來管理MySQL數據庫要比單純使用傳統的方法輕松得的多。開發人員應該不斷尋找那些能夠縮短開發時間的工具。這也是我們本文整理這10個能夠簡化開發過程的MySQL工具的原因。
一、MySQL Workbench
MySQL Workbench是一個由MySQL開發的跨平台、可視化數據庫工具。它作為DBDesigner4工程的替代應用程序而備受矚目。MySQL Workbench可以作為windows、linux和OS X系統上的原始GUI工具,它有各種不同的版本,你可以查看下面的鍊接以獲得它的版本信息。
二、phpMyAdmin
phpMyAdmin是一款免費的、用PHP編寫的工具,用于在萬維網上管理MySQL,它支持MySQL的大部分功能。這款含有用戶界面的軟件能夠支持一些最常用的操作(比如管理數據庫、表格、字段、聯系、索引、用戶、許可,等等),同時你還可以直接執行任何SQL語句。以MySQL數據庫和PHP語言作為動态網頁設計的基礎,創建動态網頁,實現網頁的交互性設計,實現對數據各種操作和管理。
它所具備的特性:
>直觀的Web界面
>支持大多數MySQL功能:
>浏覽和丢棄數據庫、表格、視圖、字段和索引
>創建、複制、删除、重命名以及更改數據庫、表格、字段和索引
>維護服務器、數據庫以及表格,能對服務器的配置提出建議
>執行、編輯和标注任何SQL語句,甚至批量查詢
>管理MySQL用戶以及用戶權限
>管理存儲的過程(stored procedures)和觸發器(triggers)
>從CSV和SQL文件格式中導入數據
>能夠以多種格式導出數據:CSV、SQL、XML、PDF、ISO/IEC 26300等
>管理多台服務器
>為數據庫布局創建PDF圖表
>使用Query-by-example(QBE)創建複雜的查詢
>在數據庫中進行全局搜索,或者在數據庫的子集中進行搜索
>用預定義的函數把存儲的數據轉化成任何格式
>還具有其他更多特性...
三、Aqua Data Studio
對于數據庫管理人員、軟件開發人員以及業務分析師來說,Aqua Data Studio是一個完整的集成開發環境(IDE)。它主要具備了四個方面的功能:1)數據庫查詢和管理工具;2)一套數據庫、源代碼管理以及文件系統的比較工具;3)為Subversion(SVN)和CVS而設計了一個完整的集成源代碼管理客戶端;4)提供了一個的數據庫建模工具(modeler),它和最好的獨立數據庫圖表工具一樣強大。
四、SQLyog
SQLyog是一個全面的MySQL數據庫管理工具(/’GUI’/'Frontend’)。它的社區版(Community Edition)是具有GPL許可的免費開源軟件。這款工具包含了開發人員在使用MySQL時所需的絕大部分功能:查詢結果集合、查詢分析器、服務器消息、表格數據、表格信息,以及查詢曆史,它們都以标簽的形式顯示在界面上,開發人員隻要點擊鼠标即可。此外,它還可以方便地創建視圖和存儲過程,最近幾周筆者一直在反複使用這個功能。
五、MYSQL Front
這個MySQL數據庫的圖形GUI是一個“真正的”應用程序,它提供的用戶界面比用PHP和HTML建立起來的系統更加精确。因為不會因為重載HTML網頁而導緻延時,所以它的響應是即時的。如果供應商允許的話,你可以讓MySQL-Front直接與數據庫進行工作。如果不行,你也隻需要在發布網站上安裝一個小的腳本即可。登錄信息會存儲在你的硬盤上,因此你不必再登錄到不同的網絡界面上了。
六、mytop
mytop是一款基于控制台的工具(不是GUI),用于監視線程以及MySQL 3.22.x、3.23.x和4.x服務器的整體性能。它可以在大多數安裝了Perl、DBI以及Term::ReadKey的Unix系統上(包括Mac系統OS X)運行。如果你安裝了Term::ANSIColor,你能得到彩色的視圖。如果你安裝了Time::HiRes,你還可以得到一個不錯的 “每秒查詢數” 實時統計。mytop0.7版甚至還能在windows上運行。
mytop的靈感來自系統監視工具“top”。我經常在Linux、FreeBSD和Solaris上使用top,你很可能會在mytop中注意到來自這些操作系統的某些特性。mytop連接到MySQL服務器之後,能定期運行SHOW PROCESSLIST和SHOW STATUS命令,并以一種有用的格式總結從這些命令中所獲得的信息。
七、Sequel Pro
Sequel Pro是一款管理MAC OSX數據庫的應用程序,它可以讓你直接訪問本地以及遠程服務器上的MySQL數據庫,并且支持從流行的文件格式中導入和導出數據,其中包括SQL、CSV和XML等文件。最初,Sequel Pro隻是開源CocoaMySQL工程的一個分支。部分特性如下:
>你很容易就可以建立起一個到Mac電腦本地MySQL服務器的連接
>它具有全部的表格管理功能,包括索引。
>支持MySQL視圖
>它使用多窗口功能,能夠立即支持多個數據庫或表格
八、SQL Buddy
SQL Buddy是一個強大的輕量級Ajax數據庫管理工具。它非常易于安裝,你隻需要把文件夾解壓到服務器裡就行了,這再簡單不過了!你還可以進行常見的絕大部分操作。
九、MySQL Sidu
MySQL Sidu是一款免費的MySQL客戶端,它通過網絡浏覽器來運行,非常容易上手!Sidu這幾個字母表示Select(選擇)、Insert(插入)、Delete(删除)和Update(更新)。Sidu其實還有更多的功能,它看起來更像MySQL前端軟件的GUI而不是網頁。
>SIDU支持SQL選擇、插入、删除,更新功能。
>SIDU支持在浏覽器上工作,如Firefox、IE、Opera、Safari、Chrome等等。
>SIDU看起來像MySQL前端軟件的GUI而不是網頁。
>SIDU可以跟MySQL、Postgres和SQLite DBs一起工作。
十、Navicat Lite MySQL Admin Tool
Navicat是一款快速、可靠的數據庫管理工具,很受大家的歡迎。Navicat專門用來簡化數據庫管理并且減少管理成本,它旨在滿足數據庫管理人員、數據庫開發人員以及廣大中小企業的需要,它有一個很直觀的GUI,可以讓你安全便捷的創建、組織、訪問以及分享信息。
對于MySQL來說,Navicat工具是一個強大的數據庫管理和開發工具。它可以跟任何版本的MySQL數據庫服務器(3.21版或者以上版本)一起工作,并且支持MySQL大多數最新的功能,包括Trigger、Stored Procedure、Function、Event,View和Manage User等。Navicat Lite可以免費下載,但是僅适用于非商業活動。
十一、優化方案
groupadd mysql
useradd -g mysql mysql
tar zxvf mysql-5.0.45.tar.gz
cd mysql-5.0.45
./configure --prefix=/usr/local/mysql/定義安裝路徑
--without-debug 關閉debug模式
--with-unix-socket-path=/tmp/mysql.sock 使用unix套接字鍊接提高7.5%性能
--with-client-ldflags=-all-static 靜态鍊接提高13%性能
--with-mysqld-ldflags=-all-static 靜态鍊接提高13%性能
--enable-assembler 允許使用彙編模式(優化性能)
--with-extra-charsets=gbk,gb2312,utf8 添加gb2312,gbk,utf8中文字符支持
--with-pthread
--enable-thread-safe-client
make && make install
chmod +w /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql
cp support-files/my-large.cnf /usr/local/mysql/my.cnf
/usr/local/mysql/bin/mysql_install_db
--basedir=/usr/local/mysql 說明MYSQL安裝路徑
--datadir=/usr/local/mysql/data 說明數據庫文件存放的路徑
--user=mysql 說明使用哪個用戶創建
--pid-file=/usr/local/mysql/mysql.pid
--skip-locking
--port=3306 聲明端口
--socket=/tmp/mysql.sock 聲明臨時文件
cp support-files/mysql.server /etc/init.d/mysqld copy啟動的mysqld文件
chmod 700 /etc/init.d/mysqld
service mysqld start
my.cnf輸入以下内容:
[client]
default-character-set = utf8
port = 3306
socket = /tmp/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user = mysql
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/webserver/mysql
datadir = /data0/mysql/3306/data
#限制打開的最大的文件個數
open_files_limit = 10240
#back_log 是操作系統在監聽隊列中所能保持的連接數,
#隊列保存了在MySQL連接管理器線程處理之前的連接.
#如果你有非常高的連接率并且出現"connection refused"報錯,
#你就應該增加此處的值.
#檢查你的操作系統文檔來獲取這個變量的最大值.
#如果将back_log設定到比你操作系統限制更高的值,将會沒有效果
back_log=600
#MySQL服務所允許的同時會話數的上限
#其中一個連接将被SUPER權限保留作為管理員登錄.
#即便已經達到了連接數的上限.
max_connections=3000
#每個客戶端連接最大的錯誤允許數量,如果達到了此限制.
#這個客戶端将會被MySQL服務阻止直到執行了"FLUSH HOSTS"或者服務重啟
#非法的密碼以及其他在鍊接時的錯誤會增加此值.
#查看"Aborted_connects"狀态來獲取全局計數器.
max_connect_errors=6000
#所有線程所打開表的數量.
#增加此值就增加了mysqld所需要的文件描述符的數量
#這樣你需要确認在[mysqld_safe]中"open-files-limit"變量設置打開文件數量允許至少4096
table_cache=614
#允許外部文件級别的鎖。打開文件鎖會對性能造成負面影響
#所以隻有在你在同樣的文件上運行多個數據庫實例時才使用此選項(注意仍會有其他約束!)
#或者你在文件層面上使用了其他一些軟件依賴來鎖定MyISAM表
external-locking=FALSE
#服務所能處理的請求包的最大大小以及服務所能處理的最大的請求大小(當與大的BLOB字段一起工作時相當必要)
#每個連接獨立的大小.大小動态增加
max_allowed_packet=32M
#排序緩沖被用來處理類似ORDER BY以及GROUP BY隊列所引起的排序
#如果排序後的數據無法放入排序緩沖,
#一個用來替代的基于磁盤的合并分類會被使用
#查看"Sort_merge_passes"狀态變量.
#在排序發生時由每個線程分配
sort_buffer_size=2M
#此緩沖被使用來優化全聯合(full JOINs不帶索引的聯合).
#類似的聯合在極大多數情況下有非常糟糕的性能表現,
#但是将此值設大能夠減輕性能影響.
#通過"Select_full_join"狀态變量查看全聯合的數量
#當全聯合發生時,在每個線程中分配
join_buffer_size=2M
#我們在cache中保留多少線程用于重用
#當一個客戶端斷開連接後,如果cache中的線程還少于thread_cache_size,
#則客戶端線程被放入cache中.
#這可以在你需要大量新連接的時候極大的減少線程創建的開銷
#(一般來說如果你有好的線程模型的話,這不會有明顯的性能提升.)
thread_cache_size=300
#此允許應用程序給予線程系統一個提示在同一時間給予渴望被運行的線程的數量.
#此值隻對于支持thread_concurrency()函數的系統有意義(例如Sun Solaris).
#你可可以嘗試使用[CPU數量]*(2..4)來作為thread_concurrency的值
thread_concurrency=8
#查詢緩沖常被用來緩沖SELECT的結果并且在下一次同樣查詢的時候不再執行直接返回結果.
#打開查詢緩沖可以極大的提高服務器速度,如果你有大量的相同的查詢并且很少修改表.
#查看"Qcache_lowmem_prunes"狀态變量來檢查是否當前值對于你的負載來說是否足夠高.
#注意:在你表經常變化的情況下或者如果你的查詢原文每次都不同,
#查詢緩沖也許引起性能下降而不是性能提升.
query_cache_size=64M
#隻有小于此設定值的結果才會被緩沖
#此設置用來保護查詢緩沖,防止一個極大的結果集将其他所有的查詢結果都複蓋.
query_cache_limit=2M
query_cache_min_res_unit=2k
default-storage-engine=MyISAM
#當創建新表時作為默認使用的表類型,
#如果在創建表示沒有特别執行表類型,将會使用此值
default_table_type=MyISAM
#線程使用的堆大小。此容量的内存在每次連接時被預留.
#MySQL本身常不會需要超過64K的内存
#如果你使用你自己的需要大量堆的UDF函數
#或者你的操作系統對于某些操作需要更多的堆,
#你也許需要将其設置的更高一點.
thread_stack=192K
#設定默認的事務隔離級别.可用的級别如下:
#READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,SERIALIZABLE
transaction_isolation=READ-COMMITTED
#内部(内存中)臨時表的最大大小
#如果一個表增長到比此值更大,将會自動轉換為基于磁盤的表.
#此限制是針對單個表的,而不是總和.
tmp_table_size=246M
#所有的使用了比這個時間(以秒為單位)更多的查詢會被認為是慢速查詢.
#不要在這裡使用"1",否則會導緻所有的查詢,甚至非常快的查詢頁被記錄下來(由于MySQL目前時間的精确度隻能達到秒的級别).
long_query_time=1
#在慢速日志中記錄更多的信息.
#一般此項最好打開.
#打開此項會記錄使得那些沒有使用索引的查詢也被作為到慢速查詢附加到慢速日志裡
log_long_format
#打開二進制日志功能.
#在複制(replication)配置中,作為MASTER主服務器必須打開此項
#如果你需要從你最後的備份中做基于時間點的恢複,你也同樣需要二進制日志.
log-bin=/data0/mysql/3306/binlog
#在一個事務中binlog為了記錄SQL狀态所持有的cache大小
#如果你經常使用大的,多聲明的事務,你可以增加此值來獲取更大的性能.
#所有從事務來的狀态都将被緩沖在binlog緩沖中然後在提交後一次性寫入到binlog中
#如果事務比此值大,會使用磁盤上的臨時文件來替代.
#此緩沖在每個連接的事務第一次更新狀态時被創建
binlog_cache_size=4M
#獨立的内存表所允許的最大容量.
#此選項為了防止意外創建一個超大的内存表導緻永盡所有的内存資源.
max_heap_table_size=246M
binlog_format=MIXED
max_binlog_cache_size=8M
max_binlog_size=512M
expire_logs_days=7
#關鍵詞緩沖的大小,一般用來緩沖MyISAM表的索引塊.
#不要将其設置大于你可用内存的30%,
#因為一部分内存同樣被OS用來緩沖行數據
#甚至在你并不使用MyISAM 表的情況下,你也需要仍舊設置起8-64M内存由于它同樣會被内部臨時磁盤表使用.
key_buffer_size=256M
#用來做MyISAM表全表掃描的緩沖大小.
#當全表掃描需要時,在對應線程中分配.
read_buffer_size=1M
#當在排序之後,從一個已經排序好的序列中讀取行時,行數據将從這個緩沖中讀取來防止磁盤尋道.
#如果你增高此值,可以提高很多ORDER BY的性能.
#當需要時由每個線程分配
read_rnd_buffer_size=16M
#MyISAM使用特殊的類似樹的cache來使得突發插入
#(這些插入是,INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., 以及 LOAD DATA
#INFILE) 更快。此變量限制每個進程中緩沖樹的字節數.
#設置為0會關閉此優化.
#為了最優化不要将此值設置大于"key_buffer_size".
#當突發插入被檢測到時此緩沖将被分配.
bulk_insert_buffer_size=64M
#此緩沖當MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE到一個空表中引起重建索引時被分配.
#這在每個線程中被分配.所以在設置大值時需要小心.
myisam_sort_buffer_size=128M
#MySQL重建索引時所允許的最大臨時文件的大小(當REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
#如果文件大小比此值更大,索引會通過鍵值緩沖創建(更慢)
myisam_max_sort_file_size=10G
#如果被用來更快的索引創建索引所使用臨時文件大于制定的值,那就使用鍵值緩沖方法.
#這主要用來強制在大表中長字串鍵去使用慢速的鍵值緩沖方法來創建索引.
myisam_max_extra_sort_file_size=10G
#如果一個表擁有超過一個索引,MyISAM可以通過并行排序使用超過一個線程去修複他們.
#這對于擁有多個CPU以及大量内存情況的用戶,是一個很好的選擇.
myisam_repair_threads=1
#自動檢查和修複沒有适當關閉的MyISAM表.
myisam_recover
#避免MySQL的外部鎖定,減少出錯幾率增強穩定性。
skip-name-resolve
master-connect-retry=10
slave-skip-errors=1032,1062,126,1114,1146,1048,1396
#唯一的服務辨識号,數值位于1到2^32-1之間.
#此值在master和slave上都需要設置.
#如果"master-host"沒有被設置,則默認為1,但是如果忽略此選項,MySQL不會作為master生效.
server-id=1
#如果你的MySQL服務包含InnoDB支持但是并不打算使用的話,
#使用此選項會節省内存以及磁盤空間,并且加速某些部分
#skip-innodb
#附加的内存池被InnoDB用來保存metadata信息
#如果InnoDB為此目的需要更多的内存,它會開始從OS這裡申請内存.
#由于這個操作在大多數現代操作系統上已經足夠快,你一般不需要修改此值.
#SHOW INNODB STATUS命令會顯示當先使用的數量.
innodb_additional_mem_pool_size=16M
#InnoDB使用一個緩沖池來保存索引和原始數據,不像MyISAM.
#這裡你設置越大,你在存取表裡面數據時所需要的磁盤I/O越少.
#在一個獨立使用的數據庫服務器上,你可以設置這個變量到服務器物理内存大小的80%
#不要設置過大,否則,由于物理内存的競争可能導緻操作系統的換頁颠簸.
#注意在32位系統上你每個進程可能被限制在2-3.5G用戶層面内存限制,
#所以不要設置的太高.
innodb_buffer_pool_size=2048M
#InnoDB将數據保存在一個或者多個數據文件中成為表空間.
#如果你隻有單個邏輯驅動保存你的數據,一個單個的自增文件就足夠好了.
#其他情況下.每個設備一個文件一般都是個好的選擇.
#你也可以配置InnoDB來使用裸盤分區——請參考手冊來獲取更多相關内容
innodb_data_file_path=ibdata1:1024M:autoextend
#用來同步IO操作的IO線程的數量。
#此值在Unix下被硬編碼為4,但是在Windows磁盤I/O可能在一個大數值下表現的更好.
innodb_file_io_threads=4
#在InnoDb核心内的允許線程數量.
#最優值依賴于應用程序,硬件以及操作系統的調度方式.
#過高的值可能導緻線程的互斥颠簸.
innodb_thread_concurrency=8
#如果設置為1,InnoDB會在每次提交後刷新(fsync)事務日志到磁盤上,
#這提供了完整的ACID行為.
#如果你願意對事務安全折衷,并且你正在運行一個小的食物,你可以設置此值到0或者2來減少由事務日志引起的磁盤I/O
#0代表日志隻大約每秒寫入日志文件并且日志文件刷新到磁盤.
#2代表日志寫入日志文件在每次提交後,但是日志文件隻有大約每秒才會刷新到磁盤上.
innodb_flush_log_at_trx_commit=2
#用來緩沖日志數據的緩沖區的大小.
#當此值快滿時,InnoDB将必須刷新數據到磁盤上.
#由于基本上每秒都會刷新一次,所以沒有必要将此值設置的太大(甚至對于長事務而言)
innodb_log_buffer_size=16M
#在日志組中每個日志文件的大小.
#你應該設置日志文件總合大小到你緩沖池大小的25%~100%
#來避免在日志文件複寫上不必要的緩沖池刷新行為.
#不論如何,請注意一個大的日志文件大小會增加恢複進程所需要的時間.
innodb_log_file_size=128M
#在日志組中的文件總數.
#通常來說2~3是比較好的.
innodb_log_files_in_group=3
#在InnoDB緩沖池中最大允許的髒頁面的比例.
#如果達到限額,InnoDB會開始刷新他們防止他們妨礙到幹淨數據頁面.
#這是一個軟限制,不被保證絕對執行.
innodb_max_dirty_pages_pct=90
#在被回滾前,一個InnoDB的事務應該等待一個鎖被批準多久.
#InnoDB在其擁有的鎖表中自動檢測事務死鎖并且回滾事務.
#如果你使用LOCK TABLES指令, 或者在同樣事務中使用除了InnoDB以外的其他事務安全的存儲引擎
#那麼一個死鎖可能發生而InnoDB無法注意到.
#這種情況下這個timeout值對于解決這種問題就非常有幫助.
innodb_lock_wait_timeout=120
innodb_file_per_table=0
[mysqldump]
#不要在将内存中的整個結果寫入磁盤之前緩存。在導出非常巨大的表時需要此項
quick
max_allowed_packet=32M
數據庫導入
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 -Slocalhostdb2005 -Usa
其中”"中是要導出的sql語句,-c指定使用t進行字段分隔,使用n進行記錄分隔,-S指定數據庫服務器及實例,-U指定用戶名,-P指定密碼.
在MySQL端使用mysqlimport導入文本文件到相應表中
mysqlimport -uroot -p databasename /home/test/tablename.txt
其中-u指定用戶名,-p指定密碼,databasename指定數據庫名稱,表名與文件名相同
備份與恢複
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數據庫的簡單辦法
直接在控制面闆中點“清空mysql數據庫”即可。
也可以用如下辦法:
保存為***.php運行就OK了
$user="";//數據庫用戶名
$password="";//數據庫密碼
$db_name="";//數據庫名
$link=mysql_connect("localhost:3306",$user,$password);
mysql_select_db("$db_name",$link);
echo"
正在清空數據庫...";
$result=mysql_query("SHOWtables",$link);
while($currow=mysql_fetch_array($result)){
mysql_query("dropTABLEIFEXISTS$currow");
echo$currow."
";
}
echo"成功
";
?>