Mysql數據庫介紹
MySQL是一個真正的多用戶、多線程SQL數據庫服務器。SQL(結構化查詢語言)是世界上最流行的和標準
化的數據庫語言。MySQL是以一個客戶機/服務器結構的實現,它由一個服務器守護程序mysqld和很多不同的
客戶程序和庫組成。
SQL是一種標準化的語言,它使得存儲、更新和存取信息更容易。例如,你能用SQL語言為一個網站檢索
產品信息及存儲顧客信息,同時MySQL也足夠快和靈活以允許你存儲記錄文件和圖像。
MySQL 主要目標是快速、健壯和易用。最初是因為我們需要這樣一個SQL服務器,它能處理與任何可不昂
貴硬件平臺上提供數據庫的廠家在一個數量級上的大型數據庫,但速度更快,MySQL就開發出來。自1996年以
來,我們一直都在使用MySQL,其環境有超過 40 個數據庫,包含 10,000個表,其中500多個表超過7百萬行
,這大約有100 個吉字節(GB)的關鍵應用數據。
Mysql數據庫特點
1. 使用核心線程的完全多線程。這意味著它能很容易地利用多CPU(如果有)。
2. 可運行在不同的平臺上。
3. 多種列類型:1、 2、 3、4、和 8 字節長度的有符號/無符號整數(INT)、FLOAT、DOUBLE、CHAR、
VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、 TIMESTAMP、YEAR、SET和ENUM類型。
4. 利用一個優化的一遍掃描多重聯結(one-sweep multi-join)非常快速地進行聯結(join)。
5. 在查詢的SELECT和WHERE部分支持全部運算符和函數。
6. 通過一個高度優化的類庫實現SQL函數庫并且像他們能達到的一樣快速,通常在查詢初始化后不應該有任
何內存分配。
7. 全面支持SQL的GROUP BY和ORDER BY子句,支持聚合函數( COUNT()、COUNT(DISTINCT)、AVG()、STD()、
SUM()、 MAX()和MIN() )。
8. 支持ANSI SQL的LEFT OUTER JOIN和ODBC語法。
9. 你可以在同一查詢中混用來自不同數據庫的表。
10. 一個非常靈活且安全的權限和口令系統,并且它允許基于主機的認證。口令是安全的,因為當與一個服
務器連接時,所有的口令傳送被加密。
11. ODBC for Windiws 95。
12. 具備索引壓縮的快速B樹磁盤表。
13. 每個表允許有16個索引。每個索引可以由1~16個列或列的一部分組成。最大索引長度是 256 個字節(在
編譯MySQL時,它可以改變)。一個索引可以使用一個CHAR或VARCHAR字段的前綴。
14. 定長和變長記錄。
15. 用作臨時表的內存散列表。
16. 大數據庫處理。我們正在對某些包含 50,000,000 個記錄的數據庫使用MySQL。
17. 所有列都有缺省值,你可以用INSERT插入一個表列的子集,那些沒用明確給定值的列設置為他們的缺省
值。
18. 一個非常快速的基于線程的內存分配系統。
19. 沒有內存漏洞。用一個商用內存漏洞監測程序測試過(purify)。
20. 包括myisamchk,一個檢查、優化和修復數據庫表的快速實用程序。
21. 全面支持ISO-8859-1 Latin1 字符集。
22. 所有數據以 ISO-8859-1 Latin1 格式保存。所有正常的字符串比較是忽略大小寫的。
23. DELETE、INSERT、REPLACE和UPDATE 返回有多少行被改變(受影響)。
24. 函數名不會與表或列名沖突。例如ABS是一個有效的列名字。對函數調用的唯一限制是函數名與隨后的
"("不能有空格。
25. 所有MySQL程序可以用選項--help或-?獲得聯機幫助。
26. 服務器能為客戶提供多種語言的出錯消息。
27. 客戶端使用TCP/IP 連接或Unix套接字(socket)或NT下的命名管道連接MySQL。
28. MySQL特有的SHOW命令可用來檢索數據庫、表和索引的信息,EXPLAIN命令可用來確定優化器如何解決一
個查詢。
MySQL服務器的啟動與停止
一、啟動服務器的方法
啟動服務器由三種主要方法:
1、 直接調用mysqld。
#./mysqld&
這可能是最不常用的方法,建議不要多使用。
2、調用safe_mysqld腳本,最好的方法。
#./safe_mysqld -O join_buffer=128M -O key_buffer=128M -O record_buffer=256M -O sort_buffer=128M -O table_cache=2048 -O tmp_table_size=16M -O max_connections=2048 &
3、調用mysql.server腳本。
safe_mysqld腳本安裝在MySQL安裝目錄的bin目錄下,或可在MySQL源代碼分發的scripts目錄下找到。
mysql.server腳本安裝在MySQL安裝目錄下的share/mysqld目錄下或可以在MySQL源代碼分發的support_files
目錄下找到。如果你想使用它們,你需要將它們拷貝到適當的目錄下mysql/bin下。
#./mysql.server start
Sun Solariys開機自動啟mysql的方法
寫一個啟動和關閉的批處理文件Web (在路徑/etc/init.d 下), 內容如下:
#!/bin/sh
OPT_=$1
case "$OPT_" in
start)
/bin/echo "$0 : (start)"
#
# Your service startup command goes here.
#
/usr/local/apache/bin/apachectl start
/home3/mysql/bin/safe_mysqld -O join_buffer=128M -O key_buffer=128M -O record_buffer=256M -O sort_buffer=128M -O table_cache=2048 -O tmp_table_size=16M -O max_connections=2048 &
# NOTE: Must exit with zero unless error is severe.
exit 0
;;
stop)
/bin/echo "$0 : (stop)"
#
# Your service shutdown command goes here.
#
/usr/local/apache/bin/apachectl stop
# NOTE: Must exit with zero unless error is severe.
exit 0
;;
*) /bin/echo ''
/bin/echo "Usage: $0 [start|stop]"
/bin/echo " Invalid argument ==> \"${OPT_}\""
/bin/echo ''
exit 0
;;
esac
確認此文件有可執行的權利
#chmod 500 web
#cd /etc/rc2.d
#ln -s ../init.d/web S99mysql
在系統啟動時,S99mysql腳本將自動用一個start參數調用。注意頭字母必須大寫。
二、停止服務器的方法
1、要手工停止服務器,使用mysqladmin:
#mysqladmin -u 用戶名 -p'密碼' shutdown
2、 調用mysql.server腳本,最好的方法。
#./mysql.server stop
3、 直接殺掉OS的進程號
#kill -9 進程號
這可能是最不常用的方法,建議不要多使用。
要自動停止服務器,你不需做特別的事情。只需要加另外一個關閉程序。
#cd /etc/rc0.d
#ln -s ../init.d/web K01mysql
在系統啟動時,K01mysql腳本將自動用一個stop參數調用。
MySQL目錄結構和常用命令
一、 數據目錄的位置
這是默認的mysql目錄結構
bin info libexec share var
include lib man sql-bench
一個缺省數據目錄被編譯進了服務器,如果你從一個源代碼分發安裝MySQL,典型的缺省目錄為
/usr/local/var,如果從RPM文件安裝則為/var/lib/mysql,如果從一個二進制分發安裝則是
/usr/local/mysql/data。
作為一名MySQL管理員,你應該知道你的數據目錄在哪里。如果你運行多個服務器,你應該是到所有數據目錄
在哪里,但是如果你不知道確切的位置,由多種方法找到它:
1、使用mysqladmin variables從你的服務器直接獲得數據目錄路徑名。查找datadir變量的值,在Unix上,其輸出類似于:
%mysqladmin -u username -p'*****' variables
+----------------------+----------------------+
| variable_name | Value |
+----------------------+----------------------+
| back_log | 5 |
| connect_timeout | 5 |
| basedir | /var/local/ |
| datadir | /usr/local/var/ |
....
2、查找mysql運行的路徑
%ps -ef | grep mysqld
二、數據目錄結構
每個數據庫對應于數據目錄下的一個目錄。
在一個數據庫中的表對應于數據目錄下的文件。
數據目錄也包含由服務器產生的幾個狀態文件,如日志文件。這些文件提供了關于服務器操作的重要信息。
對管理特別在出了問題而試圖確定問題原因時很有價值。
1、數據庫表的表示
數據庫目錄中有3種文件:一個樣式(描述文件)、一個數據文件和一個索引文件。每個文件的基本名是表
名,文件名擴展名代表文件類型。擴展名如下表。數據和索引文件的擴展名指出表使用老式IASM索引或新式
MyISAM索引。
MySQL文件類型
文件類型 文件名擴展名 文件內容
樣式文件 .frm 描述表的結構(它的列、列類型、索引等)
數據文件 .ISD(ISAM)或.MYD(MyISAM) 包含表里所有的數據
索引文件 .ISM(ISAM)或.MYI(MyISAM) 包含數據文件上的所有索引的索引樹
當你發出一條CREATE TABLE tbl_name時語句定義表的結構時,服務器創建一個名為tbl_name.frm的文件,它
包括該結構的內部編碼,同時也創建一個空數據和索引文件,初始化為包含指出無記錄和無索引的信息(如
果CREATE TABLE語句包括索引指定,索引文件反映出這些索引)。對應于表的文件的屬主和模式被設置為只
允許MySQL服務器用戶訪問。
下面介紹一下常用的mysql命令
進入mysql數據庫
#./mysql -u 用戶名 -p'密碼'
查看所有的數據庫
mysql> show databases;
進入一個特定的數據庫
mysql> use 數據庫名;
查看數據庫里所有的表
mysql> show tables;
把表改名
mysql> alter table 表名1 rename 表名2;
例子:mysql>alter table dept rename dept2;
2、 建索引的注意事項:
先要把要加索引的字段設為非空
mysql> alter table 表名 change 字段名 字段名 字段描述 not null;
例子:
我們創建這樣一個表
mysql> create table employee
( id int(5) not null,
depno int(5),
name varchar(20) not null,
cardnumber bigint(15) not null);
mysql> alter table employee change depno depno int(5) not null;
加索引
mysql> alter table 表名 add index 索引名 (字段名1[,字段名2 …]);
例子: mysql> alter table employee add index emp_name (name);
加主關鍵字的索引
mysql> alter table 表名 add primary key (字段名);
例子: mysql> alter table employee add primary key(id);
加唯一限制條件的索引
mysql> alter table 表名 add unique 索引名 (字段名);
例子: mysql> alter table employee add unique emp_name2(cardnumber);
查看某個表的索引
mysql> show index from 表名;
例子: mysql> show index from employee;
刪除某個索引
mysql> alter table 表名 drop index 索引名;
例子: mysql>alter table employee drop index emp_name;
MySQL用戶管理
MySQL管理員應該知道如何設置MySQL用戶賬號,指出哪個用戶可以連接服務器,從哪里連接,連接后能做什
么。MySQL 3.22.11開始引入兩條語句使得這項工作更容易做:GRANT語句創建MySQL用戶并指定其權限,而
REVOKE語句刪除權限。兩條語句扮演了mysql數據庫的前端角色,并提供與直接操作這些表的內容不同的另一
種方法。CREATE和REVOKE語句影響4個表:
授權表內容:
user 能連接服務器的用戶以及他們擁有的任何全局權限
db 數據庫級權限
tables_priv 表級權限
columns_priv 列級權限
還有第5個授權表(host),但它不受GRANT和REVOKE的影響。
當你對一個用戶發出一條GRANT語句時,在user表中為該用戶創建一條記錄。如果語句指定任何全局權限(管
理權限或適用于所有數據庫的權限),這些也記錄在user表中。如果你指定數據庫、表和列級權限,他們被
分別記錄在db、tables_priv和columns_priv表中。
在下面的章節中,我們將介紹如何設置MySQL用戶賬號并授權。我們也涉及如何撤權和從授權表中刪除用戶。
一、創建用戶并授權
GRANT語句的語法看上去像這樣:
GRANT privileges (columns)
ON what
TO user IDENTIFIED BY "password"
WITH GRANT OPTION
要使用該語句,你需要填寫下列部分:
privileges
授予用戶的權限,下表列出可用于GRANT語句的權限指定符:
權限指定符 權限允許的操作:
ALTER 修改表和索引
CREATE 創建數據庫和表
DELETE 刪除表中已有的記錄
DROP 拋棄(刪除)數據庫和表
INDEX 創建或拋棄索引
INSERT 向表中插入新行
REFERENCE 未用
SELECT 檢索表中的記錄
UPDATE 修改現存表記錄
FILE 讀或寫服務器上的文件
PROCESS 查看服務器中執行的線程信息或殺死線程
RELOAD 重載授權表或清空日志、主機緩存或表緩存。
SHUTDOWN 關閉服務器
ALL 所有;ALL PRIVILEGES同義詞
USAGE 特殊的“無權限”權限
columns
權限運用的列,它是可選的,并且你只能設置列特定的權限。如果命令有多于一個列,應該用逗號分開它們.
what
權限運用的級別。權限可以是全局的(適用于所有數據庫和所有表)、特定數據庫(適用于一個數據庫中的
所有表)或特定表的。可以通過指定一個columns字句是權限是列特定的。
user
權限授予的用戶,它由一個用戶名和主機名組成。MySQL中的一個用戶名就是你連接服務器時指定的用戶名,
該名字不必與你的Unix登錄名或Windows名聯系起來。缺省地,如果你不明確指定一個名字,客戶程序將使用
你的登錄名作為MySQL用戶名。這只是一個約定。你可以在授權表中將該名字改為nobody,然后以nobody連接
執行需要超級用戶權限的操作。
password
賦予用戶的口令,它是可選的。如果你對新用戶沒有指定IDENTIFIED BY子句,該用戶不賦給口令(不安全)。
對現有用戶,任何你指定的口令將代替老口令。如果你不指定口令,老口令保持不變,當你用IDENTIFIED BY
時,口令字符串用改用口令的字面含義,GRANT將為你編碼口令,不要象你用SET PASSWORD 那樣使用password()
函數。
WITH GRANT OPTION子句是可選的。如果你包含它,用戶可以授予權限通過GRANT語句授權給其它用戶。你可
以用該子句給與其它用戶授權的能力。
用戶名、口令、數據庫和表名在授權表記錄中是大小寫敏感的,主機名和列名不是。
舉例:創建一個超級用戶test1
mysql> grant all privilleges on *.* to test1@localhost identified by '123456' with grant option;
創建一個只能查詢的用戶 test2
mysql> grant select on *.* to test2@localhost identified by '9876543';
二、撤權并刪除用戶
要取消一個用戶的權限,使用REVOKE語句。REVOKE的語法非常類似于GRANT語句,除了TO用FROM取代并且沒有
INDETIFED BY和WITH GRANT OPTION子句:
REVOKE privileges (columns) ON what FROM user
user部分必須匹配原來GRANT語句的你想撤權的用戶的user部分。privileges部分不需匹配,你可以用GRANT
語句授權,然后用REVOKE語句只撤銷部分權限。REVOKE語句只刪除權限,而不刪除用戶。即使你撤銷了所有
權限,在user表中的用戶記錄依然保留,這意味著用戶仍然可以連接服務器。要完全刪除一個用戶,你必須
用一條DELETE語句明確從user表中刪除用戶記錄:
#mysql -u root mysql
mysql>DELETE FROM user
->WHERE User="user_name" and Host="host_name";
mysql>FLUSH PRIVILEGES;
DELETE語句刪除用戶記錄,而FLUSH語句告訴服務器重載授權表。(當你使用GRANT和REVOKE語句時,表自動
重載,而你直接修改授權表時不是。)
舉例:刪除用戶test1
mysql> revoke all on *.* from test2@localhost;
mysql> use mysql;
mysql> delete from user where user='test' and host='localhost';
mysql> flush privileges;
MySQL數據庫備份
在數據庫表丟失或損壞的情況下,備份你的數據庫是很重要的。已經知道表被破壞,用諸如vi或Emacs等編輯
器試圖直接編輯它們,這對表絕對不是件好事!
備份數據庫兩個主要方法是用mysqldump程序或直接拷貝數據庫文件(如用cp、cpio或tar等)。每種方法都
有其優缺點:
mysqldump與MySQL服務器協同操作。直接拷貝方法在服務器外部進行,并且你必須采取措施保證沒有客戶正
在修改你將拷貝的表,一般在數據庫關閉情況下做。mysqldump比直接拷貝要慢些。mysqldump生成能夠移植
到其它機器的文本文件,甚至那些有不同硬件結構的機器上。直接拷貝文件可以移植到同類機器上,但不能
移植到其它機器上,除非你正在拷貝的表使用MyISAM存儲格式。
一、使用mysqldump備份和拷貝數據庫
當你使用mysqldump程序產生數據庫備份文件時,缺省地,文件內容包含創建正在傾倒的表的CREATE語句和包
含表中行數據的INSERT語句。換句話說,mysqldump產生的輸出可在以后用作mysql的輸入來重建數據庫。
Mysqldump參數如下:
#mysqldump -u 用戶名-p'密碼' 數據庫名 [表名] > 操作系統下文件名
舉例:#./mysqldump -u root -p'123456' samp_db>samp.db.txt
輸出文件的開頭看起來象這樣:
# MySQL Dump 6.0
#
# Host: localhost Database: samp_db
#---------------------------------------
# Server version 3.23.2-alpha-log
#
# Table structure for table 'absence'
#
CREATE TABLE absence(
student_id int(10) unsigned DEFAULT '0' NOT NULL,
date date DEFAULT '0000-00-00' NOT NULL,
PRIMARY KEY (student_id,date)
);
#
# Dumping data for table 'absence'
#
INSERT INTO absence VALUES (3,'1999-09-03');
INSERT INTO absence VALUES (5,'1999-09-03');
INSERT INTO absence VALUES (10,'1999-09-08');
......
文件剩下的部分有更多的INSERT和CREATE TABLE語句組成。
輸出單個的表:
#mysqldump samp_db student score event absence >grapbook.sql
#mysqldump samp_db member president >hist-league.sql
缺省地,mysqldump在寫入前將一個表的整個內容讀進內存。這通常確實不必要,并且實際上如果你有一個大
表,幾乎是失敗的。你可用--quick選項告訴mysqldump只要它檢索出一行就寫出每一行。為了進一步優化傾
倒過程,使用--opt而不是--quick。--opt選項打開其它選項,加速數據的傾倒和把它們讀回。
二、使用直接拷貝數據庫的備份和拷貝方法
另一種不涉及mysqldump備份數據庫和表的方式是直接拷貝數據庫表文件。典型地,這用諸如cp、tar或cpio
實用程序。本文的例子使用cp。
%cd DATADIR
%cp -r samp_db /usr/archive/mysql
單個表可以如下備份:
%cd DATADIR/samp_db
%cp member.* /usr/archive/mysql/samp_db
%cp score.* /usr/archive/mysql/samp_db
....
當你完成了備份時,你可以重啟服務器(如果關閉了它)或釋放加在表上的鎖定(如果你讓服務器運行)。
要用直接拷貝文件把一個數據庫從一臺機器拷貝到另一臺機器上,只是將文件拷貝到另一臺服務器主機的適
當數據目錄下即可。要確保文件是MyIASM格式或兩臺機器有相同的硬件結構,否則你的數據庫在另一臺主機
上有奇怪的內容。你也應該保證在另一臺機器上的服務器在你正在安裝數據庫表時不訪問它們。
建一個sh文件bakmysql.sh
#!/bin/sh
cd /usr/local/mysql/
tar cvf /mount2/mysqlvar.tar var
可以設到操作系統自動運行。
root用戶crontab文件
/var/spool/cron/crontabs/root增加以下內容
0 2 1 * * /mount2/bakmysql.sh
#/etc/rc2.d/S75cron stop
#/etc/rc2.d/S75cron start
重新擊活Sun Solaris自動處理進程
三、用備份恢復數據
數據庫損壞的發生有很多原因,程度也不同。如果你走運,你可能僅損壞一兩個表(如掉電),如果你倒霉
,你可能必須替換整個數據目錄(如磁盤損壞)。在某些情況下也需要恢復,比如用戶錯誤地刪除了數據庫
或表。不管這些倒霉事件的原因,你將需要實施某種恢復。
如果表損壞但沒丟失,嘗試用myisamchk或isamchk修復它們,如果這樣的損壞可有修復程序修復。
1、 恢復整個數據庫
Mysqldump參數如下:
#mysqldump -u 用戶名-p'密碼' 數據庫名 < 操作系統下文件名
舉例:
先在Mysql里創建另一個數據庫
mysql> create database test;
然后將備份的數據導入
#mysqldump -u root -p'123456' test2 < samp.db.txt
create database dbname DEFAULT CHARSET=UTF8
posted on 2007-11-28 19:53
josson 閱讀(331)
評論(0) 編輯 收藏 所屬分類:
數據庫