學習 MySQL
作者:孔建軍
1 MySQL 介紹
MySQL是瑞典 MySQL AB公司開發(fā)的一個完全網絡化的跨平臺關系型數據庫系統(tǒng),具有多用戶、多線程、多種客戶工具和API支持、低消耗、底成本、高性能等特點。她具有客戶機/服務器體系結構的分布式數據庫管理系統(tǒng),由一個服務器守護進程 mysqld 和不同客戶程序和庫組成。由于其源碼的開放性及穩(wěn)定性,在 WEB開發(fā)應用等方面得到了廣泛使用,具有較強的競爭力和市場前景。目前Internet上流行的網站構架方式是LAMP(Linux+Apache+MySQL+PHP),即操作系統(tǒng)使用GNU/Linux,Web服務器使用Apache,數據庫服務器使用MySQL,服務器端腳本解釋器使用PHP。這四個軟件都遵循 GPL協議開放源代碼,用戶可以快速搭建一個真正穩(wěn)定、免費的網站系統(tǒng)。雖然沒有大型專業(yè)數據庫(如Orcal)高端功能強大,但其靈活方便等優(yōu)勢也贏得了眾多用戶的關注。
Sun于今年初以10億美元高價收購MySQL,據說 Sun 準備關閉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.既能夠作為一個單獨的應用程序應用在客戶端服務器網絡環(huán)境中,也能夠作為一個庫而嵌入到其他的軟件中提供多語言支持,常見的編碼如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作數據表名和數據列名
7.提供TCP/IP、ODBC和JDBC等多種數據庫連接途徑
8.提供用于管理、檢查、優(yōu)化數據庫操作的管理工具
9.可以處理擁有上千萬條記錄的大型數據庫
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
查看是否已經安裝 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 服務器 在 /etc/rc.local中添加啟動一行命令: /etc/init.d/mysql start
- 配置數據庫用戶 安裝mysql過程中,會自動提示設置默認用戶 root 的登錄數據庫密碼。
管理員還可以使用GRANT語句添加新用戶并指定其權限,使用REVOKE語句刪除指定用戶權限。
$ mysql> grant select,insert,update,delete on *.* to "new_user"@"%" Identified by "password";
添加新用戶new_user,密碼為password,讓該用戶可在任何主機上登錄,并對所有數據庫有查詢、插入、修改、刪除的權限。
$ mysql> delete from user where User="user_name"; $ mysql> flush privileges;
delete語句刪除指定用戶記錄,flush語句告訴服務器重載授權表。
$ mysql> grant select on table $tablename to $user;
把查詢$tablename表的權利授給用戶$user
$ mysql> grant select on table $tablename to public;
把對表$tablename查詢的權利給所有用戶
$ mysql> grant createtab on database $databasename to $user;
把在數據庫$databasename中創(chuàng)建新表的權利授給用戶$user
$ mysql> revoke update(id) on table $tablename from $user;
把用戶$user更新$tablename表 id 數據項的權利收回
授權表 | 內容 |
user | 能連接服務器的用戶以及他們擁有的任何全局權限 |
db | 數據庫級權限 |
tables_priv | 表級權限 |
columns_priv | 列級權限 |
3.3 測試
# mysqladmin version查看 MySQL 服務器是否正在運行
# mysqladmin -u root shutdown
測試服務器是否可以關閉
# mysqlshow
顯示所有數據庫
# mysqlshow $database
顯示指定數據庫中的表信息
3.4 基本操作
- 服務器命令: #/etc/init.d/mysql start
- 客戶端命令選項: mysql [-h $hostname] [-u $username] -p $datebasename
- 客戶端內部命令:
- 常用客戶端命令范例: $mysql -h mysql.kongove.cn -u kong -p
啟動數據庫服務
#/etc/init.d/mysql stop
關閉數據庫服務
#/etc/init.d/mysql restart
重啟數據庫服務
#/etc/init.d/mysql status
查看數據庫服務狀態(tài)
#/etc/init.d/mysql reload
重新加載服務
# /etc/init.d/mysql force-reload
強制重新加載服務
選項 | 含義 |
-h $hostname | 指定數據庫服務器,可以為IP地址或者域名 |
-p | 提示用戶輸入密碼 |
-u $username | 指定用戶名 |
$databasename | 指定數據庫名 |
命令 | 簡潔命令 | 含義 |
(\?) | 等價于'help' | |
clear | (\c) | 清除命令 |
connect | (\r) | 重新連接服務器,選項參數是數據庫名和主機名 |
delimiter | (\d) | 設置定界符 |
edit | (\e) | 采用 $EDITOR 編輯命令 |
ego | (\G) | 向 mysql 數據庫服務器發(fā)送命令,并將返回結果垂直輸出 |
exit | (\q) | 退出 mysql, 等價與 quit |
go | (\g) | 向數據庫服務器發(fā)送命令 |
help | (\h) | 顯示此幫助信息 |
nopager | (\n) | 緊用 PAGER,打印到標準輸出 |
notee | (\t) | 不寫入輸出文件 |
pager | (\P) | 設置通過 PAGER 打印結果 |
(\p) | 打印當前命令 | |
prompt | (\R) | 改變 mysql 提示模式 |
quit | (\q) | 退出 mysql |
rehash | (\#) | 重新編譯完成 hash |
source | (\.) | 執(zhí)行 SQL 腳本文件,帶一個文件名作為參數 |
status | (\s) | 從服務器得到狀態(tài)信息 |
system | (\!) | 執(zhí)行一個 Shell 命令 |
tee | (\T) | 指定輸出文件,添加所有信息到此文件 |
use | (\u) | 指定別的數據庫,新數據庫名作為參數 |
charset | (\C) | 轉換成另一個字符編碼,可能需要處理多自己編碼的 binlog |
warnings | (\W) | 顯示執(zhí)行指令的警告信息 |
nowarning | (\w) | 不顯示執(zhí)行指令的警告信息 |
登錄數據庫
$ mysql> show databases;
顯示當前服務器上所有數據庫
$ mysql> use $databasename;
選擇使用數據庫
$ mysql> show tables;
顯示當前數據庫中的所有表
$ mysql> create database $databasename;
創(chuàng)建數據庫
$ mysql> create table $tablename(id int, name char(5), age int);
在當前數據庫里創(chuàng)建表
$ mysql> create view $viewname as select id, name from $tablename;
在當前數據庫里創(chuàng)建視圖
$ mysql> drop table $tablename;
刪除當前數據庫里指定的表
$ mysql> drop view $viewname;
刪除當前數據庫里指定的視圖
$ mysql> select * from $tablename;
顯示指定表的內容
$ mysql> select id, name from $tablename;
顯示指定表中指定數據項
$ mysql> select name from $viewname;
顯示指定視圖中指定內容
$ mysql> select * from $tablename where id>20;
根據條件篩選查看指定表中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;
修改指定表中滿足條件表項的相關值
$ mysql> delete from $tablename where id=1;
刪除滿足條件的指定表項
4 數據備份與恢復
- 備份數據庫原則: 1. 定期實施備份;
- 備份 $ mysqldump -h $hostname -u $username -p $databasename >2008.5.22.sql
- 還原 $ mysql> source 2008.5.22.sql
2. 讓服務器執(zhí)行更新日志;
3. 使用一種傳統(tǒng)、易理解的備份文件名機制;
4. 用文件系統(tǒng)備份用戶的備份文件。
使用 mysqldump 備份整個數據庫到文件2008.5.22.sql
$ cp -r $datadir/$databasename /usr/archive/mysql/
直接復制數據庫進行數據備份
編寫Shell腳本,自動備份數據庫內容:
#!/bin/bash #備份指定服務器、用戶名的數據庫內容,并以當前時間命名文件。 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
使用備份文件還原數據庫
$ mysql -u root -h mysql.kongove.cn -p $databasename <2008.5.22.sql
使用備份文件還原指定數據庫
5 數據庫連接
- PHP連接 MySQL 數據庫
- Jsp 連接 MySQL 數據庫
- C 語言連接 MySQL 數據庫
- Python 連接數據庫
$db['host'] = "222.24.20.86"; $db['user'] = "kong"; $db['pass'] = "passwrod"; $db['database'] = "kong_database"; $db['table'] = "kong_table"; #連接數據庫 ql_connect($db['host'],$db['user'],$db['pass']); mysql_select_db($db['database']); mysql_query($sql); #插入數據項 $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 等都是不錯的圖形化管理數據庫工具,可以方便的進行數據庫各項管理、維護操作。
phpMyAdmin 可以通過 web 界面,使用 http 方式來進行連接管理,用戶在瀏覽器即可完成管理任務,不需要特殊軟件環(huán)境。Web服務器端必須支持php解析功能。在Web服務器端配置好 apache 和 php ,下載 phpadmin,解壓到 apache能夠訪問的一個目錄中。修改phpadmin/config.inc.php文件,其中主要是對mysql連接方式,連接路徑以及用戶名密碼的設置。然后運行訪問 index.php 進入管理頁面。
MySQL Administrator、MySQL Query Browser、mysql-admin 是linux系統(tǒng)中幾款數據庫管理軟件,其管理功能完備,配置簡單。
phpMyBackupPro 也是由 PHP 寫成的,可以透過 Web 介面創(chuàng)建和管理數據庫。它可以創(chuàng)建偽 cronjobs,可以用來自動在某個時間或周期備份MySQL 數據庫。