MySQL 是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典 MySQL AB 公司開發(fā),目前屬于 Oracle 公司。
MySQL 是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
MySQL 是開源的,所以你不需要支付額外的費(fèi)用。
MySQL 使用標(biāo)準(zhǔn)的SQL數(shù)據(jù)語言形式。
MySQL 可以運(yùn)行于多個(gè)系統(tǒng)上,并且支持多種語言。這些編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
MySQL 支持大型數(shù)據(jù)庫,支持5000萬條記錄的數(shù)據(jù)倉庫,32位系統(tǒng)表文件最大可支持4GB,64位系統(tǒng)支持最大的表文件為8TB??梢蕴幚頁碛猩锨f條記錄的大型數(shù)據(jù)庫。
MySQL 是可以定制的,采用了GPL協(xié)議,你可以修改源碼來開發(fā)自己的 MySQL 系統(tǒng)。
一、MySQL安裝
-
Mac下安裝MySQL
下載dmg包安裝
1.進(jìn)入 官網(wǎng), 點(diǎn)擊下方的DOWNLOADS : MySQL Community Server。
2.進(jìn)入系統(tǒng)偏好設(shè)置,點(diǎn)擊MySQL,開啟MySQL服務(wù)。
3.環(huán)境變量配置(windows也是這樣run的。可以不配置, 但每次必須在msyql的安裝目錄下,執(zhí)行mysql命令。)
這時(shí)候我們就需要將mysql加入到環(huán)境變量中去:
執(zhí)行vim ~/.bash_profile
在該文件中添加mysql/bin的目錄PATH=$PATH:/usr/local/mysql/bin
命令行輸入source ~/.bash_profile-
使用homebrew安裝MySQL
安裝命令brew install mysqlmysql_secure_installation MySQL is configured to only allow connections from localhost by default To connect run: mysql -uroot To have launchd start mysql now and restart at login: brew services start mysql Or, if you don't want/need a background service you can just run: mysql.server start
mysql.server start|bash mysql.server start
mysql -uroot 登錄
卸載brew uninstall mysql
不需要環(huán)境變量配置- 使用MAMP安裝MYSQL
環(huán)境變量配置
二、MySQL 管理
{start|stop|restart|reload|force-reload|status}
- 啟動(dòng) MySQL 服務(wù)器
mysql.server start - 關(guān)閉 MySQL 服務(wù)器
mysql.server stop - MySQL 用戶連接
mysql -h host -u user –p
其中host是主機(jī)地址,如果是本機(jī),可以寫127.0.0.1或localhost;如果是本機(jī)登錄,也可以省略地址;
user是用戶名,即你在安裝MySQL時(shí)自己設(shè)置的名字。user->root;無密碼不需要-p
mysql>表示mysql準(zhǔn)備好了接收你的命令。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.12 Homebrew
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
注:mysqld_safe --skip-grant-tables --skip-networking &回車
此時(shí)mysql會(huì)啟動(dòng),這個(gè)命令是讓我們暫時(shí)越過權(quán)限機(jī)制,不需要password,直接登錄MySQL。
- 文件配置
- 注意區(qū)分mac版mysql與Windows版的mysql配置文件擴(kuò)展名不同:
mac下: my.cnf
windows下: my.ini - 在mac 上使用 brew 安裝 mysql 后,發(fā)現(xiàn) /etc/my.cnf 并不存在。
即 通過 brew 安裝的 MySQL 的配置文件為:/usr/local/etc/my.cnf - 在配置文件中,你可以指定不同的錯(cuò)誤日志文件存放的目錄,一般你不需要改動(dòng)這些配置。
- mysqladmin命令
可以使用 mysql mysqladmin 命令來創(chuàng)建數(shù)據(jù)庫。
mysqladmin -u root -p create RUNOOB
mysqladmin -u root -p drop RUNOOB - mysqld命令
mysqld啟動(dòng)MYSQL服務(wù)mysqldSQL后臺(tái)程序(即MySQL服務(wù)器)。要想使用客戶端程序,該程序必須運(yùn)行,因?yàn)榭蛻舳送ㄟ^連接服務(wù)器來訪問數(shù)據(jù)庫。
mysqld --verbose --help//顯示服務(wù)器選項(xiàng)和可配置變量一覽
-? //--help 查看簡短幫助信息
--ansi //使用標(biāo)準(zhǔn)ANSI,SQL語法
-b //--basedir mysql安裝目錄
--big-tables //保存大的結(jié)果集到臨時(shí)文件
--bind-address //服務(wù)器要監(jiān)聽的IP地址格式
三、MySQL 基本常用語句
- 語法規(guī)則:
1.一條命令通常由一個(gè)SQL語句后跟一個(gè)分號(hào)(;)組成。有一些情況會(huì)省略分號(hào),比如QUIT。
2.輸入命令后,mysql將命令傳給服務(wù)器執(zhí)行,顯示結(jié)果,之后又顯示mysql>表示準(zhǔn)備好接收下一條命令。
3.mysql以表格形式顯示結(jié)果,第一行顯示列名(或所查詢的表達(dá)式),后面的行顯示查詢結(jié)果。
4.mysql會(huì)顯示查詢返回了多少行,并且附上查詢所花費(fèi)的時(shí)間(但是這個(gè)時(shí)間不準(zhǔn)確)。
5.命令不區(qū)分大小寫。
6.一行可以寫多個(gè)命令
7.可以將一條命令分行寫,直到看到分號(hào)才認(rèn)為是一條命令的結(jié)束。
8.如果輸入到一半想取消,可以輸入\c (注意c是小寫)。
9.字符串可以用單引號(hào)或者雙引號(hào)包圍,如果左右不對(duì)應(yīng),換行后會(huì)有提示。 - MySQL 用戶設(shè)置:
- 修改root密碼:
update MySQL.user set authentication_string=password('123456') where user='root' ; - 如果你需要添加 MySQL 用戶,你只需要在 mysql 數(shù)據(jù)庫中的 user 表添加新用戶即可。
以下為添加用戶的的實(shí)例,用戶名為guest,密碼為guest123,并授權(quán)用戶可進(jìn)行 SELECT, INSERT 和 UPDATE操作權(quán)限:
mysql> use mysql
Database changed
第一種添加用戶方法:
mysql> INSERT INTO user (host,user,authentication_string,select_priv, insert_priv, update_priv) VALUES ('localhost','guest','password(guest)','Y','Y','Y');
ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
錯(cuò)語原因:
mysql用戶表的中某些字段不能為空,沒有默認(rèn)值,其實(shí)是操作錯(cuò)誤,mysql添加用戶是不能這樣直接insert user表的。
解決方法:
my-default.ini中有一條語句:
指定了嚴(yán)格模式,為了安全,嚴(yán)格模式禁止通過 insert 這種形式直接修改 mysql 庫中的 user 表進(jìn)行添加新用戶
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
將 STRICT_TRANS_TABLES 刪掉之后即可使用 insert 添加
第二種添加用戶方法:
mysql> GRANT USAGE ON *.* TO 'user01'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY '123456' WITH GRANT OPTION' at line 1。
原因:
因?yàn)樾掳娴牡膍ysql版本已經(jīng)將創(chuàng)建賬戶和賦予權(quán)限的方式分開了
解決辦法:
創(chuàng)建賬戶:create user '用戶名'@'訪問主機(jī)' identified by '密碼';
賦予權(quán)限:grant 權(quán)限列表 on 數(shù)據(jù)庫 to '用戶名'@'訪問主機(jī)' ;(修改權(quán)限時(shí)在后面加with grant option)
第三種:
CREATE USER 'laowang'@'localhost' IDENTIFIED BY '123456';
授予賬戶權(quán)限的方法如下:
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON *.* TO 'laowang'@'localhost';
授予所有權(quán)限:
GRANT ALL PRIVILEGES ON *.* TO 'laowang'@'localhost';
查看用戶權(quán)限:
show grants for 'laowang'@'localhost';
all privileges:表示將所有權(quán)限授予給用戶。也可指定具體的權(quán)限,如:SELECT、CREATE、DROP等。
on:表示這些權(quán)限對(duì)哪些數(shù)據(jù)庫和表生效,格式:數(shù)據(jù)庫名.表名,這里寫“*”表示所有數(shù)據(jù)庫,所有表。如果我要指定將權(quán)限應(yīng)用到test庫的user表中,可以這么寫:test.user
to:將權(quán)限授予哪個(gè)用戶。格式:”用戶名”@”登錄IP或域名”。%表示沒有限制,在任何主機(jī)都可以登錄。比如:”yangxin”@”192.168.0.%”,表示yangxin這個(gè)用戶只能在192.168.0IP段登錄
identified by:指定用戶的登錄密碼
with grant option:表示允許用戶將自己的權(quán)限授權(quán)給其它用戶
可以使用GRANT給用戶添加權(quán)限,權(quán)限會(huì)自動(dòng)疊加,不會(huì)覆蓋之前授予的權(quán)限,比如你先給用戶添加一個(gè)SELECT權(quán)限,后來又給用戶添加了一個(gè)INSERT權(quán)限,那么該用戶就同時(shí)擁有了SELECT和INSERT權(quán)限。
- 刷新權(quán)限:flush privileges;
- SELECT host, user, authentication_string FROM user WHERE user = 'root';
4.操縱數(shù)據(jù)庫
mysql> SHOW DATABASES;#展示Server上的數(shù)據(jù)庫,列出 MySQL 數(shù)據(jù)庫管理系統(tǒng)的數(shù)據(jù)庫列表。
mysql> CREATE DATABASE mydatabase1;// 創(chuàng)建數(shù)據(jù)庫:mydatabase1是新的數(shù)據(jù)庫的名稱,數(shù)據(jù)庫名稱是大小寫敏感的。
mysql> USE mydatabase1; // 使用數(shù)據(jù)庫 選擇要操作的Mysql數(shù)據(jù)庫,使用該命令后所有Mysql命令都只針對(duì)該數(shù)據(jù)庫。
mysql> SELECT DATABASE();//查看當(dāng)前選取的是什么數(shù)據(jù)庫
mysql> DROP DATABASE mydatabase1;//刪除數(shù)據(jù)庫
5.操縱數(shù)據(jù)庫中的表
mysql> SHOW TABLES;//顯示指定數(shù)據(jù)庫的所有表,使用該命令前需要使用 use 命令來選擇要操作的數(shù)據(jù)庫。
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);//創(chuàng)建表(注意表名也是區(qū)分大小寫):
mysql> DESCRIBE pet;//查看表
mysql> DROP TABLE pet;//刪除表
mysql> SHOW COLUMNS FROM runoob_tbl;//顯示數(shù)據(jù)表的屬性,屬性類型,主鍵信息 ,是否為 NULL,默認(rèn)值等其他信息。
mysql> SHOW INDEX FROM runoob_tbl;//顯示數(shù)據(jù)表的詳細(xì)索引信息,包括PRIMARY KEY(主鍵)。
mysql> SHOW TABLE STATUS FROM RUNOOB; # 顯示數(shù)據(jù)庫 RUNOOB 中所有表的信息
mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'; # 表名以runoob開頭的表的信息
mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G # 加上 \G,查詢結(jié)果按列打印
- 向表中填入數(shù)據(jù)
mysql> INSERT INTO pet
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
注意用INSERT插入時(shí),字符串和日期要用引號(hào)包圍,并且空值是NULL。對(duì)于一些沒有的值,用\N插入NULL值.
- 查詢語句
查詢語句的一般形式:
SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;
具體語句還有很多,用時(shí)查詢手冊(cè)吧。 - 添加新用戶建議 GRANT 命令
一、grant 普通數(shù)據(jù)用戶,查詢、插入、更新、刪除 數(shù)據(jù)庫中所有表數(shù)據(jù)的權(quán)利。
grant select on testdb.* to common_user@'%'
grant insert on testdb.* to common_user@'%'
grant update on testdb.* to common_user@'%'
grant delete on testdb.* to common_user@'%'
或者,用一條 MySQL 命令來替代:
grant select, insert, update, delete on testdb.* to common_user@'%'
二、grant 數(shù)據(jù)庫開發(fā)人員,創(chuàng)建表、索引、視圖、存儲(chǔ)過程、函數(shù)。。。等權(quán)限。
grant 創(chuàng)建、修改、刪除 MySQL 數(shù)據(jù)表結(jié)構(gòu)權(quán)限。
grant create on testdb.* to developer@'192.168.0.%';
grant alter on testdb.* to developer@'192.168.0.%';
grant drop on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 外鍵權(quán)限。
grant references on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 臨時(shí)表權(quán)限。
grant create temporary tables on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 索引權(quán)限。
grant index on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 視圖、查看視圖源代碼 權(quán)限。
grant create view on testdb.* to developer@'192.168.0.%';
grant show view on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 存儲(chǔ)過程、函數(shù) 權(quán)限。
grant create routine on testdb.* to developer@'192.168.0.%'; -- now, can show procedure status
grant alter routine on testdb.* to developer@'192.168.0.%'; -- now, you can drop a procedure
grant execute on testdb.* to developer@'192.168.0.%';
三、grant 普通 DBA 管理某個(gè) MySQL 數(shù)據(jù)庫的權(quán)限。
grant all privileges on testdb to dba@'localhost'
其中,關(guān)鍵字 privileges 可以省略。
四、grant 高級(jí) DBA 管理 MySQL 中所有數(shù)據(jù)庫的權(quán)限。
grant all on *.* to dba@'localhost'
五、MySQL grant 權(quán)限,分別可以作用在多個(gè)層次上。
1. grant 作用在整個(gè) MySQL 服務(wù)器上:
grant select on *.* to dba@localhost; -- dba 可以查詢 MySQL 中所有數(shù)據(jù)庫中的表。
grant all on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有數(shù)據(jù)庫
2. grant 作用在單個(gè)數(shù)據(jù)庫上:
grant select on testdb.* to dba@localhost; -- dba 可以查詢 testdb 中的表。
3. grant 作用在單個(gè)數(shù)據(jù)表上:
grant select, insert, update, delete on testdb.orders to dba@localhost;
這里在給一個(gè)用戶授權(quán)多張表時(shí),可以多次執(zhí)行以上語句。例如:
grant select(user_id,username) on smp.users to mo_user@'%' identified by '123345';
grant select on smp.mo_sms to mo_user@'%' identified by '123345';
4. grant 作用在表中的列上:
grant select(id, se, rank) on testdb.apache_log to dba@localhost;
5. grant 作用在存儲(chǔ)過程、函數(shù)上:
grant execute on procedure testdb.pr_add to 'dba'@'localhost'
grant execute on function testdb.fn_add to 'dba'@'localhost'
六、查看 MySQL 用戶權(quán)限
查看當(dāng)前用戶(自己)權(quán)限:
show grants;
查看其他 MySQL 用戶權(quán)限:
show grants for dba@localhost;
七、撤銷已經(jīng)賦予給 MySQL 用戶權(quán)限的權(quán)限。
revoke 跟 grant 的語法差不多,只需要把關(guān)鍵字 to 換成 from 即可:
grant all on *.* to dba@localhost;
revoke all on *.* from dba@localhost;
八、MySQL grant、revoke 用戶權(quán)限注意事項(xiàng)
1. grant, revoke 用戶權(quán)限后,該用戶只有重新連接 MySQL 數(shù)據(jù)庫,權(quán)限才能生效。
2. 如果想讓授權(quán)的用戶,也可以將這些權(quán)限 grant 給其他用戶,需要選項(xiàng) grant option
grant select on testdb.* to dba@localhost with grant option;
這個(gè)特性一般用不到。實(shí)際中,數(shù)據(jù)庫權(quán)限最好由 DBA 來統(tǒng)一管理。
注意:創(chuàng)建完成后需要執(zhí)行 FLUSH PRIVILEGES 語句。
- 28個(gè)權(quán)限:下面是具體的權(quán)限介紹:轉(zhuǎn)載的,記錄一下:
一.權(quán)限表
mysql數(shù)據(jù)庫中的3個(gè)權(quán)限表:user 、db、 host
權(quán)限表的存取過程是:
1)先從user表中的host、 user、 password這3個(gè)字段中判斷連接的IP、用戶名、密碼是否存在表中,存在則通過身份驗(yàn)證;
2)通過權(quán)限驗(yàn)證,進(jìn)行權(quán)限分配時(shí),按照useradbatables_privacolumns_priv的順序進(jìn)行分配。即先檢查全局權(quán)限表user,如果user中對(duì)應(yīng)的權(quán)限為Y,則此用戶對(duì)所有數(shù)據(jù)庫的權(quán)限都為Y,將不再檢查db, tables_priv,columns_priv;如果為N,則到db表中檢查此用戶對(duì)應(yīng)的具體數(shù)據(jù)庫,并得到db中為Y的權(quán)限;如果db中為N,則檢查tables_priv中此數(shù)據(jù)庫對(duì)應(yīng)的具體表,取得表中的權(quán)限Y,以此類推。
二.MySQL各種權(quán)限(共27個(gè))
(以下操作都是以root身份登陸進(jìn)行g(shù)rant授權(quán),以p1@localhost身份登陸執(zhí)行各種命令。)- usage
連接(登陸)權(quán)限,建立一個(gè)用戶,就會(huì)自動(dòng)授予其usage權(quán)限(默認(rèn)授予)。
mysql> grant usage on *.* to 'p1'@'localhost' identified by '123';
該權(quán)限只能用于數(shù)據(jù)庫登陸,不能執(zhí)行任何操作;且usage權(quán)限不能被回收,也即REVOKE用戶并不能刪除用戶。 - select
必須有select的權(quán)限,才可以使用select table
mysql> grant select on pyt.* to 'p1'@'localhost';
mysql> select * from shop; - create
必須有create的權(quán)限,才可以使用create table - create routine
必須具有create routine的權(quán)限,才可以使用{create |alter|drop} {procedure|function}
當(dāng)授予create routine時(shí),自動(dòng)授予EXECUTE, ALTER ROUTINE權(quán)限給它的創(chuàng)建者: - create temporary tables(注意這里是tables,不是table)
必須有create temporary tables的權(quán)限,才可以使用create temporary tables. - create view
必須有create view的權(quán)限,才可以使用create view - create user
要使用CREATE USER,必須擁有mysql數(shù)據(jù)庫的全局CREATE USER權(quán)限,或擁有INSERT權(quán)限。 - insert
必須有insert的權(quán)限,才可以使用insert into ….. values…. - alter
必須有alter的權(quán)限,才可以使用alter table
alter table shop modify dealer char(15); - alter routine
必須具有alter routine的權(quán)限,才可以使用{alter |drop} {procedure|function} - update
必須有update的權(quán)限,才可以使用update table
mysql> update shop set price=3.5 where article=0001 and dealer=’A'; - delete
必須有delete的權(quán)限,才可以使用delete from ….where….(刪除表中的記錄) - drop
必須有drop的權(quán)限,才可以使用drop database db_name; drop table tab_name;
drop view vi_name; drop index in_name; - show database
通過show database只能看到你擁有的某些權(quán)限的數(shù)據(jù)庫,除非你擁有全局SHOW DATABASES權(quán)限。
對(duì)于p1@localhost用戶來說,沒有對(duì)mysql數(shù)據(jù)庫的權(quán)限,所以以此身份登陸查詢時(shí),無法看到mysql - show view
必須擁有show view權(quán)限,才能執(zhí)行show create view。
mysql> grant show view on pyt.* to p1@localhost;mysql> show create view v_shop; - index
必須擁有index權(quán)限,才能執(zhí)行[create |drop] index
- usage
mysql> grant index on pyt.* to p1@localhost;
mysql> create index ix_shop on shop(article);
mysql> drop index ix_shop on shop;
- excute
- lock tables
必須擁有l(wèi)ock tables權(quán)限,才可以使用lock tables
mysql> grant lock tables on pyt.* to p1@localhost;
mysql> lock tables a1 read;
mysql> unlock tables;
- references
有了REFERENCES權(quán)限,用戶就可以將其它表的一個(gè)字段作為某一個(gè)表的外鍵約束。 - reload
必須擁有reload權(quán)限,才可以執(zhí)行flush [tables | logs | privileges] - replication client
擁有此權(quán)限可以查詢master server、slave server狀態(tài)。 - replication slave
擁有此權(quán)限可以查看從服務(wù)器,從主服務(wù)器讀取二進(jìn)制日志。 - Shutdown
關(guān)閉MySQL: - grant option
擁有g(shù)rant option,就可以將自己擁有的權(quán)限授予其他用戶(僅限于自己已經(jīng)擁有的權(quán)限) - file
擁有file權(quán)限才可以執(zhí)行 select ..into outfile和load data infile…操作,但是不要把file, process, super權(quán)限授予管理員以外的賬號(hào),這樣存在嚴(yán)重的安全隱患。 - super
這個(gè)權(quán)限允許用戶終止任何查詢;修改全局變量的SET語句;使用CHANGE MASTER,PURGE MASTER LOGS。 - process
通過這個(gè)權(quán)限,用戶可以執(zhí)行SHOW PROCESSLIST和KILL命令。默認(rèn)情況下,每個(gè)用戶都可以執(zhí)行SHOW PROCESSLIST命令,但是只能查詢本用戶的進(jìn)程。
另外,
管理權(quán)限(如 super, process, file等)不能夠指定某個(gè)數(shù)據(jù)庫,on后面必須跟.