學(xué)習(xí) MySQL
作者:孔建軍
1 MySQL 介紹
MySQL是瑞典 MySQL AB公司開發(fā)的一個完全網(wǎng)絡(luò)化的跨平臺關(guān)系型數(shù)據(jù)庫系統(tǒng),具有多用戶、多線程、多種客戶工具和API支持、低消耗、底成本、高性能等特點。她具有客戶機/服務(wù)器體系結(jié)構(gòu)的分布式數(shù)據(jù)庫管理系統(tǒng),由一個服務(wù)器守護進程 mysqld 和不同客戶程序和庫組成。由于其源碼的開放性及穩(wěn)定性,在 WEB開發(fā)應(yīng)用等方面得到了廣泛使用,具有較強的競爭力和市場前景。目前Internet上流行的網(wǎng)站構(gòu)架方式是LAMP(Linux+Apache+MySQL+PHP),即操作系統(tǒng)使用GNU/Linux,Web服務(wù)器使用Apache,數(shù)據(jù)庫服務(wù)器使用MySQL,服務(wù)器端腳本解釋器使用PHP。這四個軟件都遵循 GPL協(xié)議開放源代碼,用戶可以快速搭建一個真正穩(wěn)定、免費的網(wǎng)站系統(tǒng)。雖然沒有大型專業(yè)數(shù)據(jù)庫(如Orcal)高端功能強大,但其靈活方便等優(yōu)勢也贏得了眾多用戶的關(guān)注。
Sun于今年初以10億美元高價收購MySQL,據(jù)說 Sun 準(zhǔn)備關(guān)閉MySQL備份方案的源代碼,許多高級功能的代碼也將不再開放,即不會再免費向開源社區(qū)貢獻。
MySQL 特征:
- 1.使用C和C++編寫,并使用了多種編譯器進行測試,保證了源代碼的可移植性
2.支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統(tǒng)
3.為多種編程語言提供了API。這些編程語言包括C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等
4.支持多線程,充分利用CPU資源
5.優(yōu)化的SQL查詢算法,有效地提高查詢速度
6.既能夠作為一個單獨的應(yīng)用程序應(yīng)用在客戶端服務(wù)器網(wǎng)絡(luò)環(huán)境中,也能夠作為一個庫而嵌入到其他的軟件中提供多語言支持,常見的編碼如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作數(shù)據(jù)表名和數(shù)據(jù)列名
7.提供TCP/IP、ODBC和JDBC等多種數(shù)據(jù)庫連接途徑
8.提供用于管理、檢查、優(yōu)化數(shù)據(jù)庫操作的管理工具
9.可以處理擁有上千萬條記錄的大型數(shù)據(jù)庫
2 運行效果
kongove@ubuntu:~/Desktop/zeuux.org$ mysql -h localhost -u root -pEnter password:Type 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql> use test;Database changedmysql> select * from student;+------+--------------+| id | name |+------+--------------+| 1 | XiyouLinux |+------+--------------+1 rows in set (0.01 sec)mysql>
3 基本使用
3.1 安裝
- Redhat 下使用可執(zhí)行壓縮包安裝 MySQL: # rpm -qa|grep mysql
- Fedora 下通過軟件包管理工具 yum 安裝 MySQL: # yum install mysql-server mysql-client mysqlversion
- Ubuntu 下通過APT軟件包管理工具安裝 MySQL: # apt-get install mysql-server mysql-client mysqlversion
查看是否已經(jīng)安裝 mysql
# wget http://URL-OF-MySQL/mysql.tar.gz
下載 mysql 軟件包
# tar xcvf mysql.tar.gz
解壓軟件包
# cd mysql/
# make
# make install
# cd scripts
# mysql_install_db
完成具體編譯、安裝
3.2 配置
- 啟動系統(tǒng)時自動運行 MySQL 服務(wù)器 在 /etc/rc.local中添加啟動一行命令: /etc/init.d/mysql start
- 配置數(shù)據(jù)庫用戶 安裝mysql過程中,會自動提示設(shè)置默認(rèn)用戶 root 的登錄數(shù)據(jù)庫密碼。
管理員還可以使用GRANT語句添加新用戶并指定其權(quán)限,使用REVOKE語句刪除指定用戶權(quán)限。
$ mysql> grant select,insert,update,delete on *.* to "new_user"@"%" Identified by "password";
添加新用戶new_user,密碼為password,讓該用戶可在任何主機上登錄,并對所有數(shù)據(jù)庫有查詢、插入、修改、刪除的權(quán)限。
$ mysql> delete from user where User="user_name"; $ mysql> flush privileges;
delete語句刪除指定用戶記錄,flush語句告訴服務(wù)器重載授權(quán)表。
$ mysql> grant select on table $tablename to $user;
把查詢$tablename表的權(quán)利授給用戶$user
$ mysql> grant select on table $tablename to public;
把對表$tablename查詢的權(quán)利給所有用戶
$ mysql> grant createtab on database $databasename to $user;
把在數(shù)據(jù)庫$databasename中創(chuàng)建新表的權(quán)利授給用戶$user
$ mysql> revoke update(id) on table $tablename from $user;
把用戶$user更新$tablename表 id 數(shù)據(jù)項的權(quán)利收回
授權(quán)表 | 內(nèi)容 |
user | 能連接服務(wù)器的用戶以及他們擁有的任何全局權(quán)限 |
db | 數(shù)據(jù)庫級權(quán)限 |
tables_priv | 表級權(quán)限 |
columns_priv | 列級權(quán)限 |
3.3 測試
# mysqladmin version查看 MySQL 服務(wù)器是否正在運行
# mysqladmin -u root shutdown
測試服務(wù)器是否可以關(guān)閉
# mysqlshow
顯示所有數(shù)據(jù)庫
# mysqlshow $database
顯示指定數(shù)據(jù)庫中的表信息
3.4 基本操作
- 服務(wù)器命令: #/etc/init.d/mysql start
- 客戶端命令選項: mysql [-h $hostname] [-u $username] -p $datebasename
- 客戶端內(nèi)部命令:
- 常用客戶端命令范例: $mysql -h mysql.kongove.cn -u kong -p
啟動數(shù)據(jù)庫服務(wù)
#/etc/init.d/mysql stop
關(guān)閉數(shù)據(jù)庫服務(wù)
#/etc/init.d/mysql restart
重啟數(shù)據(jù)庫服務(wù)
#/etc/init.d/mysql status
查看數(shù)據(jù)庫服務(wù)狀態(tài)
#/etc/init.d/mysql reload
重新加載服務(wù)
# /etc/init.d/mysql force-reload
強制重新加載服務(wù)
選項 | 含義 |
-h $hostname | 指定數(shù)據(jù)庫服務(wù)器,可以為IP地址或者域名 |
-p | 提示用戶輸入密碼 |
-u $username | 指定用戶名 |
$databasename | 指定數(shù)據(jù)庫名 |
命令 | 簡潔命令 | 含義 |
(\?) | 等價于'help' | |
clear | (\c) | 清除命令 |
connect | (\r) | 重新連接服務(wù)器,選項參數(shù)是數(shù)據(jù)庫名和主機名 |
delimiter | (\d) | 設(shè)置定界符 |
edit | (\e) | 采用 $EDITOR 編輯命令 |
ego | (\G) | 向 mysql 數(shù)據(jù)庫服務(wù)器發(fā)送命令,并將返回結(jié)果垂直輸出 |
exit | (\q) | 退出 mysql, 等價與 quit |
go | (\g) | 向數(shù)據(jù)庫服務(wù)器發(fā)送命令 |
help | (\h) | 顯示此幫助信息 |
nopager | (\n) | 緊用 PAGER,打印到標(biāo)準(zhǔn)輸出 |
notee | (\t) | 不寫入輸出文件 |
pager | (\P) | 設(shè)置通過 PAGER 打印結(jié)果 |
(\p) | 打印當(dāng)前命令 | |
prompt | (\R) | 改變 mysql 提示模式 |
quit | (\q) | 退出 mysql |
rehash | (\#) | 重新編譯完成 hash |
source | (\.) | 執(zhí)行 SQL 腳本文件,帶一個文件名作為參數(shù) |
status | (\s) | 從服務(wù)器得到狀態(tài)信息 |
system | (\!) | 執(zhí)行一個 Shell 命令 |
tee | (\T) | 指定輸出文件,添加所有信息到此文件 |
use | (\u) | 指定別的數(shù)據(jù)庫,新數(shù)據(jù)庫名作為參數(shù) |
charset | (\C) | 轉(zhuǎn)換成另一個字符編碼,可能需要處理多自己編碼的 binlog |
warnings | (\W) | 顯示執(zhí)行指令的警告信息 |
nowarning | (\w) | 不顯示執(zhí)行指令的警告信息 |
登錄數(shù)據(jù)庫
$ mysql> show databases;
顯示當(dāng)前服務(wù)器上所有數(shù)據(jù)庫
$ mysql> use $databasename;
選擇使用數(shù)據(jù)庫
$ mysql> show tables;
顯示當(dāng)前數(shù)據(jù)庫中的所有表
$ mysql> create database $databasename;
創(chuàng)建數(shù)據(jù)庫
$ mysql> create table $tablename(id int, name char(5), age int);
在當(dāng)前數(shù)據(jù)庫里創(chuàng)建表
$ mysql> create view $viewname as select id, name from $tablename;
在當(dāng)前數(shù)據(jù)庫里創(chuàng)建視圖
$ mysql> drop table $tablename;
刪除當(dāng)前數(shù)據(jù)庫里指定的表
$ mysql> drop view $viewname;
刪除當(dāng)前數(shù)據(jù)庫里指定的視圖
$ mysql> select * from $tablename;
顯示指定表的內(nèi)容
$ mysql> select id, name from $tablename;
顯示指定表中指定數(shù)據(jù)項
$ mysql> select name from $viewname;
顯示指定視圖中指定內(nèi)容
$ mysql> select * from $tablename where id>20;
根據(jù)條件篩選查看指定表中id號大于20的表項
$ mysql> select id from $tablename where age=(select age from $tablename2 where name='孔建軍');
帶有比較運算符的子查詢
$ mysql> insert into $tablename(id,name,score) values(1,'kong',100);
添加指定表項
$ mysql> update $tablename set score=99 where id=1;
修改指定表中滿足條件表項的相關(guān)值
$ mysql> delete from $tablename where id=1;
刪除滿足條件的指定表項
4 數(shù)據(jù)備份與恢復(fù)
- 備份數(shù)據(jù)庫原則: 1. 定期實施備份;
- 備份 $ mysqldump -h $hostname -u $username -p $databasename >2008.5.22.sql
- 還原 $ mysql> source 2008.5.22.sql
2. 讓服務(wù)器執(zhí)行更新日志;
3. 使用一種傳統(tǒng)、易理解的備份文件名機制;
4. 用文件系統(tǒng)備份用戶的備份文件。
使用 mysqldump 備份整個數(shù)據(jù)庫到文件2008.5.22.sql
$ cp -r $datadir/$databasename /usr/archive/mysql/
直接復(fù)制數(shù)據(jù)庫進行數(shù)據(jù)備份
編寫Shell腳本,自動備份數(shù)據(jù)庫內(nèi)容:
#!/bin/bash #備份指定服務(wù)器、用戶名的數(shù)據(jù)庫內(nèi)容,并以當(dāng)前時間命名文件。 mysqldump -u username -h hostname -p databasename > `date +%Y%m%d_%H:%M:%S`.sql 運行腳本完成備份: [crystallight]$ ./mysqldump.sh Enter password: [crystallight]$ ls 20081014_22:56:39.sql mysqldump.sh
使用備份文件還原數(shù)據(jù)庫
$ mysql -u root -h mysql.kongove.cn -p $databasename <2008.5.22.sql
使用備份文件還原指定數(shù)據(jù)庫
5 數(shù)據(jù)庫連接
- PHP連接 MySQL 數(shù)據(jù)庫
- Jsp 連接 MySQL 數(shù)據(jù)庫
- C 語言連接 MySQL 數(shù)據(jù)庫
- Python 連接數(shù)據(jù)庫
$db['host'] = "222.24.20.86"; $db['user'] = "kong"; $db['pass'] = "passwrod"; $db['database'] = "kong_database"; $db['table'] = "kong_table"; #連接數(shù)據(jù)庫 ql_connect($db['host'],$db['user'],$db['pass']); mysql_select_db($db['database']); mysql_query($sql); #插入數(shù)據(jù)項 $sql = "insert into ".$table." (id,user_name,user_info,head_type,hide,message,ip,time,reply, reply_time) values(null,'$user_name','$user_info','$head_type','$hide','$message','$ip','$time',null,null);"; $result = mysql_query($sql); #篩選查詢 $sql = "select * from $table order by id desc limit $start_msg,$max_msg;"; $result = mysql_query($sql);
String url ="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1" Connection conn= DriverManager.getConnection(url); Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); String sql="select * from test"; ResultSet rs=stmt.executeQuery(sql);
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned int client_flag)
import MySQLdb as mydb db = mydb.connect(host='192.168.0.110',user='jianjun',passwd='lovelinux',db='webdatabase', charset="utf-8") cur = db.cursor() sql = unicode("select user,id from user_table where sex = '男'","utf-8") print sql cur.execute(sql) cur.close() db.close()
6 圖形管理工具
phpMyAdmin、mysql-admin、MySQL Administrator、MySQL Query Browser、phpMyBackupPro 等都是不錯的圖形化管理數(shù)據(jù)庫工具,可以方便的進行數(shù)據(jù)庫各項管理、維護操作。
phpMyAdmin 可以通過 web 界面,使用 http 方式來進行連接管理,用戶在瀏覽器即可完成管理任務(wù),不需要特殊軟件環(huán)境。Web服務(wù)器端必須支持php解析功能。在Web服務(wù)器端配置好 apache 和 php ,下載 phpadmin,解壓到 apache能夠訪問的一個目錄中。修改phpadmin/config.inc.php文件,其中主要是對mysql連接方式,連接路徑以及用戶名密碼的設(shè)置。然后運行訪問 index.php 進入管理頁面。
MySQL Administrator、MySQL Query Browser、mysql-admin 是linux系統(tǒng)中幾款數(shù)據(jù)庫管理軟件,其管理功能完備,配置簡單。
phpMyBackupPro 也是由 PHP 寫成的,可以透過 Web 介面創(chuàng)建和管理數(shù)據(jù)庫。它可以創(chuàng)建偽 cronjobs,可以用來自動在某個時間或周期備份MySQL 數(shù)據(jù)庫。