MySQL數(shù)據(jù)庫

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安裝

  1. 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 mysql

          mysql_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
      
    啟動(dòng)MySQL 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}

  1. 啟動(dòng) MySQL 服務(wù)器
    mysql.server start
  2. 關(guān)閉 MySQL 服務(wù)器
    mysql.server stop
  3. 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。

  1. 文件配置
  • 注意區(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)這些配置。
  1. mysqladmin命令
    可以使用 mysql mysqladmin 命令來創(chuàng)建數(shù)據(jù)庫。
    mysqladmin -u root -p create RUNOOB
    mysqladmin -u root -p drop RUNOOB
  2. 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 基本常用語句

  1. 語法規(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ì)有提示。
  2. 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é)果按列打印
  1. 向表中填入數(shù)據(jù)
mysql> INSERT INTO pet
  -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);

注意用INSERT插入時(shí),字符串和日期要用引號(hào)包圍,并且空值是NULL。對(duì)于一些沒有的值,用\N插入NULL值.

  1. 查詢語句
    查詢語句的一般形式:
    SELECT what_to_select
    FROM which_table
    WHERE conditions_to_satisfy;
    具體語句還有很多,用時(shí)查詢手冊(cè)吧。
  2. 添加新用戶建議 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 語句。

  1. 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í)行各種命令。)
    1. 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用戶并不能刪除用戶。
    2. select
      必須有select的權(quán)限,才可以使用select table
      mysql> grant select on pyt.* to 'p1'@'localhost';
      mysql> select * from shop;
    3. create
      必須有create的權(quán)限,才可以使用create table
    4. 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)建者:
    5. create temporary tables(注意這里是tables,不是table)
      必須有create temporary tables的權(quán)限,才可以使用create temporary tables.
    6. create view
      必須有create view的權(quán)限,才可以使用create view
    7. create user
      要使用CREATE USER,必須擁有mysql數(shù)據(jù)庫的全局CREATE USER權(quán)限,或擁有INSERT權(quán)限。
    8. insert
      必須有insert的權(quán)限,才可以使用insert into ….. values….
    9. alter
      必須有alter的權(quán)限,才可以使用alter table
      alter table shop modify dealer char(15);
    10. alter routine
      必須具有alter routine的權(quán)限,才可以使用{alter |drop} {procedure|function}
    11. update
      必須有update的權(quán)限,才可以使用update table
      mysql> update shop set price=3.5 where article=0001 and dealer=’A';
    12. delete
      必須有delete的權(quán)限,才可以使用delete from ….where….(刪除表中的記錄)
    13. drop
      必須有drop的權(quán)限,才可以使用drop database db_name; drop table tab_name;
      drop view vi_name; drop index in_name;
    14. show database
      通過show database只能看到你擁有的某些權(quán)限的數(shù)據(jù)庫,除非你擁有全局SHOW DATABASES權(quán)限。
      對(duì)于p1@localhost用戶來說,沒有對(duì)mysql數(shù)據(jù)庫的權(quán)限,所以以此身份登陸查詢時(shí),無法看到mysql
    15. 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;
    16. index
      必須擁有index權(quán)限,才能執(zhí)行[create |drop] index
mysql> grant index on pyt.* to p1@localhost;

mysql> create index ix_shop on shop(article);

mysql> drop index ix_shop on shop;
  1. excute
  2. 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;
  1. references
    有了REFERENCES權(quán)限,用戶就可以將其它表的一個(gè)字段作為某一個(gè)表的外鍵約束。
  2. reload
    必須擁有reload權(quán)限,才可以執(zhí)行flush [tables | logs | privileges]
  3. replication client
    擁有此權(quán)限可以查詢master server、slave server狀態(tài)。
  4. replication slave
    擁有此權(quán)限可以查看從服務(wù)器,從主服務(wù)器讀取二進(jìn)制日志。
  5. Shutdown
    關(guān)閉MySQL:
  6. grant option
    擁有g(shù)rant option,就可以將自己擁有的權(quán)限授予其他用戶(僅限于自己已經(jīng)擁有的權(quán)限)
  7. file
    擁有file權(quán)限才可以執(zhí)行 select ..into outfile和load data infile…操作,但是不要把file, process, super權(quán)限授予管理員以外的賬號(hào),這樣存在嚴(yán)重的安全隱患。
  8. super
    這個(gè)權(quán)限允許用戶終止任何查詢;修改全局變量的SET語句;使用CHANGE MASTER,PURGE MASTER LOGS。
  9. 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后面必須跟.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容