Mysql的基本知識

一、mysql 的管理
1、連接Mysql
格式: mysql -h主機地址 -u用戶名 -p用戶密碼
例1:連接到本機上的MYSQL。
首先在打開DOS窗口,然後進入目錄 mysqlbin,再鍵入命令mysql -uroot -p,回車後提示你輸密碼,如果剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車即可進入到MYSQL中了,MYSQL的提示符是:mysql>
例2:連接到遠程主機上的MYSQL。假設遠程主機的IP爲:110.110.110.110,用戶名爲root,密碼爲abcd123。則鍵入以下命令:
mysql -h110.110.110.110 -uroot -pabcd123
(注:u與root可以不用加空格,其它也一樣)
2、退出MYSQL命令: exit (回車)
3、修改密碼
格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼
1) mysqladmin -u用戶名 -p舊密碼 password 新密碼
    例:mysqladmin -u root password 21century
    注:因爲開始時root沒有密碼,所以-p舊密碼一項就可以省略了。
2)直接修改user表的root用戶口令:
   mysql> user mysql;
   mysql> update user set pasword=password('21century') where user='root';
   mysql> flush privileges;
   注:flush privileges的意思是強制刷新內存授權表,否則用的還是緩衝中的口令。
4、測試密碼是否修改成功
1)不用密碼登錄
[root@test1 local]# mysql
ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)
顯示錯誤,說明密碼已經修改。
2)用修改後的密碼登錄
[root@test1 local]# mysql -u root -p
Enter password: (輸入修改後的密碼21century)
Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 177 to server version: 3.23.48
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
成功!
這是通過mysqladmin命令修改口令,也可通過修改庫來更改口令

5、增加新用戶
(注意:和上面不同,下面的因爲是MYSQL環境中的命令,所以後面都帶一個分號作爲命令結束符)
格式:grant select on 數據庫.* to 用戶名@登錄主機 identified by "密碼"
例1、增加一個用戶test1密碼爲abc,讓他可以在任何主機上登錄,並對所有數據庫有查詢、插入、修改、刪除的權限。首先用以root用戶連入MYSQL,然後鍵入以下命令:
grant select,insert,update,delete on *.* to test1@"%但例1增加的用戶是十分危險的,你想如某個人知道test1的密碼,那麼他就可以在internet上的任何一臺電腦上登錄你的mysql數據庫並對你的數據可以爲所欲爲了,解決辦法見例2。" Identified by "abc";
例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 "";
6、Mysql的啓動和停止
   啓動:Mysql從3.23.15版本開始作了改動,默認安裝後服務要用mysql用戶來啓動,不允許root用戶啓動。
         如果非要用root用戶來啓動,必須加上--user=root參數
         (./safe_mysqld --user=root &)
   停止:mysqladmin -u root -p shutdown

7、只需本機使用Mysql服務,在啓動時還可以加上--skip-networking參數使Mysql不監聽任何TCP/IP連接
    (./safe_mysqld --skip-networking &),增加安全性。(非常推薦)

8、忘記root密碼怎麼辦?
    在啓動Mysql服務器時加上參數--skip-grant-tables來跳過授權表的驗證
    (./safe_mysqld --skip-grant-tables &),這樣我們就可以直接登陸Mysql服務器,
    然後再修改root用戶的口令,重啓Mysql就可以用新口令登陸了。

9、操作技巧1、如果你打命令時,回車後發現忘記加分號,你無須重打一遍命令,只要打個分號回車就可以了。也就是說你可以把一個完整的命令分成幾行來打,完後用分號作結束標誌就OK。
2、你可以使用光標上下鍵調出以前的命令。但以前我用過的一個MYSQL舊版本不支持。我現在用的是mysql-3.23.27-beta-win。


二、Mysql數據庫操作

1、、創建數據庫
命令:create database <數據庫名>
例如:建立一個名爲xhkdb的數據庫
mysql> create database xhkdb;
2、顯示所有的數據庫
命令:show databases (注意:最後有個s)
mysql> show databases;
剛開始時才兩個數據庫:mysql和test。mysql庫很重要它裏面有MYSQL的系統信息,我們改密碼和新增用戶,實際上就是用這個庫進行操作。
3、刪除數據庫
命令:drop database <數據庫名>
例如:刪除名爲 xhkdb的數據庫
mysql> drop database xhkdb;
4、連接數據庫
命令: use數據庫名> <
例如:如果xhkdb數據庫存在,嘗試存取它:
mysql> use xhkdb;
屏幕提示:Database changed
5、當前選擇(連接)的數據庫
mysql> select database();
6、當前數據庫包含的表信息:
mysql> show tables; (注意:最後有個s)
7、備份數據庫:
> mysqldump --opt school>school.txt
註釋:將數據庫school備份到school.txt文件,school.txt是一個文本文件,文件名任取,打開看看你會有新發現。
三、Mysql表操作,操作之前應連接某個數據庫

1、建表
命令:create table <表名> ( <字段名1> <類型1> [,..<字段名n> <類型n>]);
例如,建立一個名爲MyClass的表,
字段名
數字類型
數據寬度
是否爲空
是否主鍵
自動增加
默認值
id
int
4
primary key
auto_increment
name
char
20
sex
int
4
0
degree
double
16


mysql> create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default '0',
> degree double(16,2));
2、獲取表結構
命令: desc 表名,或者show columns from 表名

mysql> desc MyClass;
mysql> show columns from MyClass;
3、刪除表
命令:drop table <表名>
例如:刪除表名爲 MyClass 的表
mysql> drop table MyClass;
4、插入數據
命令:insert into <表名> [( <字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )]
例如,往表 MyClass中插入二條記錄, 這二條記錄表示:編號爲1的名爲Tom的成績爲96.45, 編號爲2 的名爲Joan 的成績爲82.99, 編號爲3 的名爲Wang 的成績爲96.5.
mysql> insert into MyClass values(1,'Tom',96.45),(2,'Joan',82.99), (2,'Wang', 96.59);
5、查詢表中的數據
1)、查詢所有行
命令: select字段1,字段2,...> from < 表名 > where < 表達式 > <
例如:查看錶 MyClass 中所有數據
mysql> select * from MyClass;
2)、查詢前幾行數據
例如:查看錶 MyClass 中前2行數據
mysql> select * from MyClass order by id limit 0,2;
6、刪除表中數據
命令:delete from 表名 where表達式
例如:刪除表 MyClass中編號爲1 的記錄
mysql> delete from MyClass where id=1;
7、修改表中數據:update表名 set 字段=新值,… where 條件
mysql> update MyClass set name='Mary' where id=1;
8、在表中增加字段:
命令:alter table 表名 add字段 類型 其他;
例如:在表MyClass中添加了一個字段passtest,類型爲int(4),默認值爲0
mysql> alter table MyClass add passtest int(4) default '0'
9、更改表名:
命令:rename table 原表名 to新表名;
例如:在表MyClass名字更改爲YouClass
mysql> rename table MyClass to YouClass;
10、字段類型
1.INT[(M)] 型: 正常大小整數類型
2.DOUBLE[(M,D)] [ZEROFILL] 型: 正常大小(雙精密)浮點數字類型
3.DATE 日期類型:支持的範圍是1000-01-01到9999-12-31。MySQL以YYYY-MM-DD格式來顯示DATE值,但是允許你使用字符串或數字把值賦給DATE列
4.CHAR(M) 型:定長字符串類型,當存儲時,總是是用空格填滿右邊到指定的長度
5.BLOB TEXT類型,最大長度爲65535(2^16-1)個字符。
6.VARCHAR型:變長字符串類型
11、給表改名
    RENAME TABLE ztemp TO ztemp4;
12、修改字段屬性    Alter TABLE bbabase CHANGE news_id id VARCHAR(5) NOT NULL;
13、在表中的content後增加一字段    Alter TABLE bbabase ADD leave_time DATETIME NOT NULL AFTER content;
14、將文本數據轉到表中(轉入之前確保表存在,且字段個數和類型符合)
1、文本數據應符合的格式:字段數據之間用tab鍵隔開,null值用\n來代替. 例:
1 rose二中 1976-10-10
2 mike一中 1975-12-23
2、數據傳入命令 load data local infile "文件名" into table 表名;


四、一個建庫和建表以及插入數據的實例

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狀態進入目錄\mysql\bin,然後鍵入以下命令:
mysql -uroot -p密碼 < c:\school.sql
如果成功,空出一行無任何顯示;如有錯誤,會有提示。(以上命令已經調試,你只要將//的註釋去掉即可使用)。


五、Mysql 的備份
1、使用mysqldump進行Mysql 備份
1.1、mysqldump命令
mysql數據庫導出要用到MySQL的mysqldump工具,基本用法是:

Shell> mysqldump [OPTIONS] database [tables]

如果你不給定任何表,整個數據庫將被導出。
通過執行mysqldump --help,你能得到你mysqldump的版本支持的選項表。
注意,如果你運行mysqldump沒有--quick或--opt選項,mysqldump將在導出結果前裝載整個結果集到內存中,如果你正在導出一個大的數據庫,這將可能是一個問題。
1.2、mysqldump支持下列選項:
--add-locks
在每個表導出之前增加LOCK TABLES並且之後UNLOCK TABLE。(爲了使得更快地插入到MySQL)。
--add-drop-table
在每個create語句之前增加一個drop table。
--allow-keywords
允許創建是關鍵詞的列名字。這由表名前綴於每個列名做到。
-c, --complete-insert
使用完整的insert語句(用列名字)。
-C, --compress
如果客戶和服務器均支持壓縮,壓縮兩者間所有的信息。
--delayed
用Insert DELAYED命令插入行。
-e, --extended-insert
使用全新多行Insert語法。(給出更緊縮並且更快的插入語句)
-#, --debug[=option_string]
跟蹤程序的使用(爲了調試)。
--help
顯示一條幫助消息並且退出。

LOAD DATA INFILE
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--fields-terminated-by=...
這些選擇與-T選擇一起使用,並且有相應的LOAD DATA INFILE子句相同的含義。
LOAD DATA INFILE語法。
-F, --flush-logs
在開始導出前,洗掉在MySQL服務器中的日誌文件。
-f, --force,
即使我們在一個表導出期間得到一個SQL錯誤,繼續。
-h, --host=..
從命名的主機上的MySQL服務器導出數據。缺省主機是localhost。
-l, --lock-tables.
爲開始導出鎖定所有表。
-t, --no-create-info
不寫入表創建信息(Create TABLE語句)
-d, --no-data
不寫入表的任何行信息。如果你只想得到一個表的結構的導出,這是很有用的!
--opt
同--quick --add-drop-table --add-locks --extended-insert --lock-tables。
應該給你爲讀入一個MySQL服務器的儘可能最快的導出。
-pyour_pass, --password[=your_pass]
與服務器連接時使用的口令。如果你不指定“=your_pass”部分,mysqldump需要來自終端的口令。
-P port_num, --port=port_num
與一臺主機連接時使用的TCP/IP端口號。(這用於連接到localhost以外的主機,因爲它使用 Unix套接字。)
-q, --quick
不緩衝查詢,直接導出至stdout;使用mysql_use_result()做它。
-S /path/to/socket, --socket=/path/to/socket
與localhost連接時(它是缺省主機)使用的套接字文件。
-T, --tab=path-to-some-directory
對於每個給定的表,創建一個table_name.sql文件,它包含SQL Create 命令,和一個table_name.txt文件,它包含數據。注意:這只有在mysqldump運行在mysqld守護進程運行的同一臺機器上的時候才工作。.txt文件的格式根據--fields-xxx和--lines--xxx選項來定。
-u user_name, --user=user_name
與服務器連接時,MySQL使用的用戶名。缺省值是你的Unix登錄名。
-O var=option, --set-variable var=option設置一個變量的值。可能的變量被列在下面。
-v, --verbose
冗長模式。打印出程序所做的更多的信息。
-V, --version
打印版本信息並且退出。
-w, --where='where-condition'
只導出被選擇了的記錄;注意引號是強制的!
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
1.3、最常見的mysqldump的一個備份:
雖然mysqldump支持的命令有很多,對於大多數人而言,我們只需要使用-opt這個命令就已經足夠了,爲你的數據庫做一個完整的備份:

mysqldump --opt database > backup-file.sql

但是它對用來自於一個數據庫的信息充實另外一個MySQL數據庫也是有用的:

mysqldump --opt database | mysql --host=remote-host -C database

1.4、使用mysqldump導出的文件恢復數據庫
由於mysqldump導出的是完整的SQL語句,所以用mysql客戶程序很容易就能把數據導入了:

shell> mysqladmin create target_db_name
shell> mysql target_db_name < backup-file.sql

就是
shell> mysql 庫名 < 文件名
2、使用mysqldump定時備份數據庫的腳本
2.1、備份腳本
使用腳本每天定期執行數據庫備份操作,對每個使用mysql數據庫的人來說都很有必要,這樣的腳本網上有很多,這裏摘抄一個朋友的腳本 dbbackup:

這個腳本每天最多隻執行一次,而且只保留最近五天的備份在服務器上。

dbbackup代碼:

#!/bin/bash
#This is a ShellScript For Auto DB Backup
#Powered by aspbiz
#2004-09

#Setting
#設置數據庫名,數據庫登錄名,密碼,備份路徑,日誌路徑,數據文件位置,以及備份方式
#默認情況下備份方式是tar,還可以是mysqldump,mysqldotcopy
#默認情況下,用root(空)登錄mysql數據庫,備份至/root/dbxxxxx.tgz
DBName=mysql
DBUser=root
DBPasswd=
BackupPath=/root/
LogFile=/root/db.log
DBPath=/var/lib/mysql/
#BackupMethod=mysqldump
#BackupMethod=mysqlhotcopy
#BackupMethod=tar
#Setting End


NewFile="$BackupPath"db$(date +%y%m%d).tgz
DumpFile="$BackupPath"db$(date +%y%m%d)
OldFile="$BackupPath"db$(date +%y%m%d --date='5 days ago').tgz

echo "-------------------------------------------" >> $LogFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile
echo "--------------------------" >> $LogFile
#Delete Old File
if [ -f $OldFile ]
then
rm -f $OldFile >> $LogFile 2>&1
echo "[$OldFile]Delete Old File Success!" >> $LogFile
else
echo "[$OldFile]No Old Backup File!" >> $LogFile
fi

if [ -f $NewFile ]
then
echo "[$NewFile]The Backup File is exists,Can't Backup!" >> $LogFile
else
case $BackupMethod in
mysqldump)
     if [ -z $DBPasswd ]
     then
        mysqldump -u $DBUser --opt $DBName > $DumpFile
     else
        mysqldump -u $DBUser -p$DBPasswd --opt $DBName > $DumpFile
     fi
     tar czvf $NewFile $DumpFile >> $LogFile 2>&1
     echo "[$NewFile]Backup Success!" >> $LogFile
     rm -rf $DumpFile
     ;;
mysqlhotcopy)
     rm -rf $DumpFile
     mkdir $DumpFile
     if [ -z $DBPasswd ]
     then
       mysqlhotcopy -u $DBUser $DBName $DumpFile >> $LogFile 2>&1
     else
        mysqlhotcopy -u $DBUser -p $DBPasswd $DBName $DumpFile >>$LogFile 2>&1
     fi
     tar czvf $NewFile $DumpFile >> $LogFile 2>&1
     echo "[$NewFile]Backup Success!" >> $LogFile
     rm -rf $DumpFile
     ;;
*)
     /etc/init.d/mysqld stop >/dev/null 2>&1
     tar czvf $NewFile $DBPath$DBName >> $LogFile 2>&1
     /etc/init.d/mysqld start >/dev/null 2>&1
     echo "[$NewFile]Backup Success!" >> $LogFile
     ;;
esac
fi

echo "-------------------------------------------" >> $LogFile

2.2、放入crontab定期執行dbbackup
假定dbbackup在/root目錄下。我們通過使用crontab命令,設置每天0點10分執行/root/dbbakup腳本。
1、 使用crontab –e 編輯crontab
2、 在crontab中加入:

#back for mysql database
10 0 * * * /root/dbbackup

新增:


1)、把遠程mysql服務器上的選定表的指定數據導入到本地的文本文件中:

[hello@localhost hello]$ mysqldump -hhostname -uusername -p -w "last>'2007-01-01'" dbname tablename > ./filename
Enter password:

2)、把遠程mysql服務器上的選定數據庫的全部數據導入到本地的文本文件中:

[hello@localhost hello]$ mysqldump -hhostname -uusername -p dbname > ./filename
Enter password:

3)、把遠程mysql服務器上的選定表的指定數據導入到服務器的文本文件中(所以在本地不能操作如下):

mysql> use dbname;
mysql> select fieldname into outfile '/home/hello/a.txt' from tablename where last>"2007-1-1";
ERROR 1045: Access denied for user: 'hello@%' (Using password: YES)
mysql>

4)、把遠程mysql服務器上的選定表的指定數據導入到本地的文本文件中:

[hello@localhost hello]$ mysql -e "select fieldname from tablename where last>'2007-1-1'" -hhostname -uusername -p dbname > ./filename
Enter password:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章