一、mysql基本管理
1.啟動mysql
/etc/init.d/mysqld是一個shell啟動腳本,啟動後最終會調用mysqld_safe腳本,最後調用mysqld服務啟動mysql,如下:
/etc/init.d/mysqld start 或/usr/local/mysql/bin/mysqld_safe &
root 26221 1 0 08:55 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/mysql.pid
mysql 27071 26221 0 08:55 ? 00:02:26 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/mysql-error.log --open-files-limit=65535 --pid-file=/data/mysql/mysql.pid --socket=/tmp/mysql.sock --port=3306
2.關閉mysql:
mysqladmin -uroot shutdown -p123 平滑關閉服務
/etc/init.d/mysqld stop 實際是調用上面的指令
Kill –USR2 `cat path/pid` 直接殺死pid來關閉服務,不推薦
3.連接配接資料庫
mysql -uroot -p123 -D test -S /var/lib/mysql/mysql.sock -h 127.0.0.1 -P 3306
選項:
-u 指定使用者
-p 指定使用者密碼
-h 指定伺服器位址
-P 指定端口号
-S 指定SOCK路徑
-D 指定資料庫名,直接連接配接到資料庫
-C 資料傳輸壓縮
-e 非互動式執行SQL語句
4.資料庫互動式指令
\? 幫助資訊
\c 清除目前輸入語句
\r 重新連接配接到伺服器,可選資料庫和主機
\d 設定語句分隔符。
\e 使用$ EDITOR編輯指令。
\G 發送指令到mysql server,垂直顯示結果。
\g 發送指令到mysql伺服器。
\h 顯示此幫助。
\n 禁用尋呼機,列印到stdout。
\t 不要寫入outfile。
\P 設定PAGER [to_pager]。通過PAGER列印查詢結果。
\p 列印目前指令。
\R 更改您的mysql提示符。
\q 退出mysql。
\# 重建完成哈希。
\. 執行SQL腳本檔案。擷取檔案名作為參數。
\s 從伺服器擷取狀态資訊。
\! 執行系統shell指令。
\T 設定outfile [to_outfile]。将所有内容附加到給定的檔案中。
\u 使用另一個資料庫。将資料庫名稱作為參數。
\C 切換到另一個字元集。可能需要處理具有多位元組字元集的binlog。
\W 每個聲明後顯示警告。
\w 每個語句後都不要顯示警告。
\x 清除會話上下文。
二、mysql資料庫變量管理
mysql中變量可分為系統變量與狀态變量,系統變量配置了mysql的運作環境屬性,狀态變量顯示了msyql運作過程中的狀态資訊,而系統變量從作用域劃分,又可以分為全局變量和會話變量。
系統變量:
全局級别的變量:global variables,作用域為整個msyql伺服器
會話級别的變量:session variables,作用域為目前會話。
狀态變量:
狀态變量也分為全局級别與會話級别,但是使用者無法設定狀态變量,隻能檢視。
1.全局系統變量查詢
全局系統變量查詢:
show global variables \G;
檢視字元集相關的全部設定:
show global variables like 'character%';
檢視日志配置是否開啟或關閉:
show global variables where variable_name like '%log%' and value='off';
2.會話系統變量查詢
show session variables;
目前會話字元集查詢
show session variables like 'character%';
注意:有些變量隻存在于全局級别中,而有些變量隻存在于會話級别中,如果不指明global或session,則表示檢視會話級别的變量值。
3.使用select檢視單個全局系統變量或會話系統變量
select @@global.character_set_server; #檢視系統字元集變量
select @@session.wait_timeout; #檢視目前會話逾時
如不指定global或session,@@var_name表示優先從會話級别擷取變量值。
4.改變變量的值
mysql> select @@session.wait_timeout;
+------------------------+
| @@session.wait_timeout |
| 28800 |
1 row in set (0.00 sec)
mysql> set @@session.wait_timeout=14400;
Query OK, 0 rows affected (0.00 sec)
| 14400 |
set global var_name=value;
set @@global.var_name=value;
set session var_name=value;
set @@session.var_name=value;
不指定級别表示預設設定會話級别的變量
狀态變量對應使用者來說是隻讀的,是以隻改變系統變量的值。
在修改系統變量的值時并非永久生效的,重新開機後将失效。
運作時修改global級别的變量,對修改之前建立的會話沒有影響,僅對修改後建立的會話有效。
運作時修改session級别的變量,僅對目前會話有效,且立即生效。
如果要使設定永久生效,需要設定配置檔案。
三、使用者帳戶管理
1.檢視目前庫中的使用者
select user,host,authentication_string from mysql.user;
+------------+-----------+-------------------------------------------+
| user | host | authentication_string |
| root | localhost | *AC241830FFDDC8943AB31CBD47D758E79F7953EA |
注意:從5.7以後密碼字段改為authentication_string
host:表示使用者能夠通過哪些用戶端主機IP登入到目前伺服器上的mysql服務,host可以為主機名,也可以為IP位址,但是mysql認為主機名和Ip位址屬于不同的主機;
可以使用通配符:
_ 表示任意單個字元
% 表示任意長度的任意字元
2.建立使用者
1)使用create user指令建立使用者
mysql> create user 'linux'@'localhost';
Query OK, 0 rows affected (0.01 sec)
mysql> create user 'linuxse'@'%' identified by '123';
2)使用grant授權使用者時自動建立使用者
grant all on *.* to 'zzz'@'localhost' identified d by '123';
3.删除使用者
注意使用delete删除使用者時,不會删除使用者授權,是以下次再建立相同的使用者時就會報錯,可以使用drop删除使用者授權,重新建立。
mysql> delete from mysql.user where user='zzz' and host='localhost';
Query OK, 1 row affected (0.00 sec)
mysql> create user 'zzz'@'localhost';
ERROR 1396 (HY000): Operation CREATE USER failed for 'zzz'@'localhost'
mysql> drop user zzz@localhost;
4.重命名使用者
rename user OldName to NewName; 指定舊和新使用者名
mysql> select user,host from mysql.user;
+------------+-----------+
| user | host |
| linuxse | % |
| mysql.sys | localhost |
| root | localhost |
8 rows in set (0.00 sec)
mysql> rename user linuxse to aaaa;
| aaaa | % |
5.修改使用者密碼
1)系統指令中修改密碼
mysqladmin -uzhang -p123 password 123
如果沒有密碼就不用指定密碼
mysqladmin -uzhang password 123
2)登入到mysql修改密碼
set password for 'zhang'@'%'=password('123');
flush privileges;
3)修改表字段修改密碼,注意5.7以後密碼字段為authentication_string
mysql> update mysql.user set authentication_string=password('456') where user='zhang' and host='%';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 1
mysql> flush privileges;
4)忘記密碼修改,重置
停止資料庫
/etc/init.d/mysqld stop
繞過使用者驗證啟動mysql
/usr/local/mysql/bin/mysqld_safe --skip-grant-tables &
登入mysql:
mysql -uroot
修改使用者密碼:
mysql> update mysql.user set authentication_string=password('456') where user='root' and host='localhost';
Query OK, 1 row affected, 1 warning (0.01 sec)
重新整理後退出:
mysql>\q
重新正常啟動
mysqladmin-uroot -p123 shutdown
ps-ef|grep -v grep|grep mysql
/etc/init.d/mysqldstart
四、mysql授權管理
Create: 建立新的資料庫或資料表。
Delete: 删除表的記錄。
Drop: 删除資料表或資料庫。
INDEX: 建立或删除索引。
Insert: 增加表的記錄。
Select: 顯示/搜尋表的記錄。
Update: 修改表中已存在的記錄。
全局管理MySQL使用者權限:
file: 在MySQL伺服器上讀寫檔案。
PROCESS: 顯示或殺死屬于其它使用者的服務線程。
RELOAD: 重載通路控制表,重新整理日志等。
SHUTDOWN: 關閉MySQL服務。
特别的權限:
ALL: 允許做任何事(和root一樣)。
USAGE: 隻允許登入--其它什麼也不允許做。
1、使用者權限
授權文法:
grant all [privileges] on db.table to 'username'@'host' identified by 'password'
授權zhang使用者對所有庫所有表所有權限,并設定密碼,允許在任何地方登入
mysql> grant all privileges on *.* to 'zhang'@'%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.01 sec)
授權zzz使用者對zabbix庫中的所有表有insert,delete,update,select權限:
mysql> grant insert,delete,update,select on zabbix.* to zzz@'localhost';
授權使用者遠端登入時,必須使用SSL建立會話:
mysql> grant usage on *.* to 'xin'@'%' require ssl;
撤銷強制使用SSL建立會話的限制:
mysql> grant usage on *.* to 'xin'@'%' require none;
使用with grant option使授權使用者也擁有授予其他使用者同樣的權限:
授權使用者xin有select權限,同時它可以授權别的使用者同樣的權限。
grant select on *.* to 'xin'@'%' with grant optiontion;
其他限制:
MAX_QUERIES_PER_HOUR:限制使用者每個小時執行的查詢語句次數
MAX_UPDATES_PER_HOUR:限制使用者每小時執行的更新語句次數
MAX_CONNECTIONS_PER_HOUR:限制使用者每小時連接配接資料庫的次數
MAX_USER_CONNECTIONS:限制使用者使用目前帳号同時連接配接伺服器的連接配接數
grant select on *.* to 'xin'@'%' with max_queries_per_hour 20;
grant select on *.* to 'xin'@'%' with max_updates_per_hour 10;
grant select on *.* to 'xin'@'%' with max_connections_per_hour 15;
grant select on *.* to 'xin'@'%' with max_user_connections 2;
上面的資料改為0表示不限制。
2.檢視授權
show grants for xin@'%';
從資料庫中檢視使用者授權:
文法:select * from mysql.db where Db="資料庫名"
select * from mysql.db where Db='mysql'\G
3.删除授權
文法:revoke 權限 on 資料庫.表 from 使用者@host;
删除使用者建立視圖權限:
revoke create view on *.* from zhang@'%';
五、庫管理語句
1.建立資料庫
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
在其他關系型資料庫中,database與schema是有差別的,但在mysql 5.0.2以後,我們建立的資料庫時可以不加區分的使用database和schema
if not exists表示在對應的資料庫不存在的時候才會建立,它是可選的。
create_specitification表示我們可以在建立資料庫時指定對應的資料庫規範:
可以指定資料庫的字元集,使用character set對應的字元集名稱,可以指定資料庫字元集,如果使用了default關鍵字,那麼這個資料庫中建立的所有表預設都繼承這個資料庫的字元集,可以使用"show character set"指令檢視所有可用的字元集,同時我們還可以指定建立資料庫時指定資料庫的排序規則,排序規則是針對字元集的,每個字元集都有自己預設的排序規則,使用"show collation"指令可以檢視所有可用的排序方式,以及排序對應的字元集,default為可選指令,與指定字元集作用相同。
建立testdb資料庫:
mysql> create database testdb;
如果testdb資料庫不存在,則建立:
mysql> create database if not exists testdb;
如果testdb資料庫不存在,則建立,并指定其預設字元集為utf8:
mysql> create database if not exists testdb default character set utf8;
建立testdb資料庫,指定字元集為utf8并指定排序方式:
create database if not exists testdb default character set utf8 collate utf8_general_ci;
2.查詢資料庫
檢視所有存在的資料庫:
show databases;
檢視資料庫語句結構:
show create database testdb;
檢視可用的字元集:
show character set;
檢視字元集排序方式:
show collation;
檢視目前資料庫與目前連接配接的概要資訊:
root@mysql 11:50:50>use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
遇到上面的提示資訊,表示mysql要預讀資料庫資訊,如果資料過大會導緻連接配接變慢,可以在連接配接資料時指定-A連接配接關閉此功能,也可以在配置檔案my.cnf的用戶端中添加字段:no-auto-rehash重新加載,關閉預讀功能。
Database changed
root@mysql 11:56:20>status
--------------
mysql Ver 14.14 Distrib 5.7.16, for Linux (x86_64) using EditLine wrapper
Connection id: 1315 #目前連接配接的ID号
Current database: mysql #目前選中使用的資料庫
Current user: root@localhost #目前連接配接的登入使用者
SSL: Not in use #是否使用了ssl
Current pager: stdout #
Using outfile: ''
Using delimiter: ; #目前會話行終結符
Server version: 5.7.16-log Source distribution #版本号
Protocol version: 10 #協定版本
Connection: Localhost via UNIX socket #使用的連接配接類型,通過本機的套接字檔案進行連接配接
Server characterset: utf8 #伺服器使用的字元集
Db characterset: utf8 #資料庫使用的字元集
Client characterset: utf8 #用戶端使用的字元集
Conn. characterset: utf8 #目前連接配接使用的字元集
UNIX socket: /tmp/mysql.sock #套接字檔案路徑
Uptime: 23 hours 26 min 5 sec #資料庫的啟動時長
Threads: 17 Questions: 54562 Slow queries: 0 Opens: 1920 Flush tables: 1 Open tables: 99 Queries per second avg: 0.646
3.修改資料庫
ALTER {DATABASE | SCHEMA} [db_name]
alter_specification ...
ALTER {DATABASE | SCHEMA} db_name
UPGRADE DATA DIRECTORY NAME
alter_specification:
檢視字元集:
show variables like 'character%';
修改資料庫字元集:
alter database testdb character set gbk;
alter database testdb default character set gbk;
4.删除資料庫
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
删除testdb資料庫:
drop database if exists testdb;
六、表管理語句
1.檢視表
use mysql
show tables;
檢視表的具體屬性資訊:
show table status\G
指定檢視某張表的屬性:
show table status like 'user'\G
檢視表結構語句:
desc table_name
desc user\G
檢視表的建立語句:
show create table user\G
2.建立表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
auto_increment設定字段為自增長,此字段必須被定義為key或者索引。預設隻設定字段主鍵為自增
primary key(col1[,col2,...])用于定義主鍵,一個表中隻能有一個主鍵,一個主鍵可以包含多個字段。
unique key(col1[col2,...])用于定義唯一鍵,一個表中可以有多個唯一鍵。
foreign key用于定義外鍵
chech(expr)用于定義檢查性限制
index ind_name(id)|key ind_name(id)可以使用兩種方法建立索引
fulltext|spatial如果資料庫存儲引擎為myisam可以建立全文索引和空間索引,innodb引擎不支援全文索引和空間索引。
執行個體:
建立表:
建立資料庫指定字元集和排序方式:
root@mysql 01:20:53>create database test default character set utf8 collate utf8_general_ci;
Query OK, 1 row affected (0.01 sec)
root@mysql 01:22:47>use test;
建立test表指定字段id和name的類型分别為int和varchare
root@mysql 01:23:12>create table test1(
-> id int(11),
-> name varchar(58)
-> );
Query OK, 0 rows affected (0.02 sec)
在目前字段設定主鍵,并設定字段不能為空,添加注釋字段:
root@mysql 01:31:20>create table test2(
-> id int(11) key,
-> name varchar(58) not null comment 'student name'
在表級别定義主鍵:
root@mysql 01:32:28>create table test3(
-> name varchar(34) not null comment 'sutdent name',
-> primary key(id)
建立聯合主鍵:
root@mysql 01:34:28>create table test4(id int(10),name varchar(34) not null,primary key(id,name));
建立索引,可以使用index ind_name()和key ind_name()兩種方法建立索引:
root@mysql 01:36:24>create table test5(id int(11) auto_increment,name varchar(58) not null,primary key(id),index ind_name(name));
Query OK, 0 rows affected (0.03 sec)
root@mysql 01:41:39>create table test6(id int(11) auto_increment,name varchar(58) not null,primary key(id),key ind_name(name));
root@mysql 01:43:44>create table test7(id int(11) auto_increment,name varchar(58) not null,primary key(id),index(name));
複制表資料:
還可以根據查詢的資料建立一個新表,将資料填充到建立的表中,需要注意字段中的限制無法複制過去:
root@mysql 01:49:31>desc test7;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(58) | NO | MUL | NULL | |
2 rows in set (0.00 sec)
root@mysql 01:49:38>select * from test7;
+----+-------+
| id | name |
| 4 | haha |
| 3 | hehe |
| 1 | zhang |
| 2 | zhang |
4 rows in set (0.00 sec)
root@mysql 01:49:56>create table test8 select id,name from test7;
Query OK, 4 rows affected (0.03 sec)
Records: 4 Duplicates: 0 Warnings: 0
root@mysql 01:51:26>desc test8;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
| id | int(11) | NO | | 0 | |
| name | varchar(58) | NO | | NULL | |
root@mysql 01:51:39>select * from test8;
複制表結構:
使用like來将test5的表結構包括字段限制和索引都複制到建立的新表中test9:
root@mysql 01:57:19>desc test5;
root@mysql 01:57:26>create table test9 like test5;
root@mysql 01:57:53>desc test9;
使用engine選項還指定資料引擎,還可以指定自增長和字元集等:
root@mysql 01:58:04>create table test10(id int(11) primary key auto_increment,name varchar(34) not null,index(name))engine=InnoDB auto_increment=2 default charset=utf8;
其他資訊可檢視幫助資訊:
root@mysql 02:06:41>help create table;
3.删除表
drop table table_name;
drop table if exists table_name1,table_name2;
4.修改表
重命名表名:
alter table test1 rename sa test2;
添加字段:
alter table test add column age int(11);
修改表的字段,可以省略column:
alter table test add age int(11);
為表添加字段,同時為添加字段設定限制:
alter table test add age int not null default 0;
alter table test column age int not null default 0;
為表添加字段,同時指定添加字段在表中的位置,下面為添加字段為第一個字段:
alter table test add id int first;
指定添加字段的位置為name字段的後面:
alter table test add column age int after name;
删除字段
alter table test drop name;
重命名字段,修改字段名稱
alter table test change name name1 varchar(48);
修改字段類型
alter table test change age age char(10);
alter table test modify age int;
本文轉自 80後小菜鳥 51CTO部落格,原文連結:http://blog.51cto.com/zhangxinqi/1927980