MySQL数据库

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。
MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL 是开源的,所以你不需要支付额外的费用。
MySQL 使用标准的SQL数据语言形式。
MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
MySQL 支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。可以处理拥有上千万条记录的大型数据库。
MySQL 是可以定制的,采用了GPL协议,你可以修改源码来开发自己的 MySQL 系统。

一、MySQL安装

  1. Mac下安装MySQL
    • 下载dmg包安装
      1.进入 官网, 点击下方的DOWNLOADS : MySQL Community Server。
      2.进入系统偏好设置,点击MySQL,开启MySQL服务。
      3.环境变量配置(windows也是这样run的。可以不配置, 但每次必须在msyql的安装目录下,执行mysql命令。)
      这时候我们就需要将mysql加入到环境变量中去:
      执行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
      
    启动MySQL mysql.server start | bash mysql.server start
    mysql -uroot 登录
    卸载brew uninstall mysql
    不需要环境变量配置
    • 使用MAMP安装MYSQL
      环境变量配置

二、MySQL 管理

{start|stop|restart|reload|force-reload|status}

  1. 启动 MySQL 服务器
    mysql.server start
  2. 关闭 MySQL 服务器
    mysql.server stop
  3. MySQL 用户连接
    mysql -h host -u user –p
    其中host是主机地址,如果是本机,可以写127.0.0.1或localhost;如果是本机登录,也可以省略地址;
    user是用户名,即你在安装MySQL时自己设置的名字。user->root;无密码不需要-p
    mysql>表示mysql准备好了接收你的命令。
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 &回车
此时mysql会启动,这个命令是让我们暂时越过权限机制,不需要password,直接登录MySQL。

  1. 文件配置
  • 注意区分mac版mysql与Windows版的mysql配置文件扩展名不同:
    mac下: my.cnf
    windows下: my.ini
  • 在mac 上使用 brew 安装 mysql 后,发现 /etc/my.cnf 并不存在。
    即 通过 brew 安装的 MySQL 的配置文件为:/usr/local/etc/my.cnf
  • 在配置文件中,你可以指定不同的错误日志文件存放的目录,一般你不需要改动这些配置。
  1. mysqladmin命令
    可以使用 mysql mysqladmin 命令来创建数据库。
    mysqladmin -u root -p create RUNOOB
    mysqladmin -u root -p drop RUNOOB
  2. mysqld命令
    mysqld启动MYSQL服务mysqldSQL后台程序(即MySQL服务器)。要想使用客户端程序,该程序必须运行,因为客户端通过连接服务器来访问数据库。
mysqld --verbose --help//显示服务器选项和可配置变量一览
-? //--help 查看简短帮助信息
--ansi //使用标准ANSI,SQL语法
-b //--basedir mysql安装目录
--big-tables //保存大的结果集到临时文件
--bind-address //服务器要监听的IP地址格式

三、MySQL 基本常用语句

  1. 语法规则:
    1.一条命令通常由一个SQL语句后跟一个分号(;)组成。有一些情况会省略分号,比如QUIT。
    2.输入命令后,mysql将命令传给服务器执行,显示结果,之后又显示mysql>表示准备好接收下一条命令。
    3.mysql以表格形式显示结果,第一行显示列名(或所查询的表达式),后面的行显示查询结果。
    4.mysql会显示查询返回了多少行,并且附上查询所花费的时间(但是这个时间不准确)。
    5.命令不区分大小写。
    6.一行可以写多个命令
    7.可以将一条命令分行写,直到看到分号才认为是一条命令的结束。
    8.如果输入到一半想取消,可以输入\c (注意c是小写)。
    9.字符串可以用单引号或者双引号包围,如果左右不对应,换行后会有提示。
  2. MySQL 用户设置:
  • 修改root密码:
    update MySQL.user set authentication_string=password('123456') where user='root' ;
  • 如果你需要添加 MySQL 用户,你只需要在 mysql 数据库中的 user 表添加新用户即可。
    以下为添加用户的的实例,用户名为guest,密码为guest123,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:
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
错语原因:
mysql用户表的中某些字段不能为空,没有默认值,其实是操作错误,mysql添加用户是不能这样直接insert user表的。
解决方法:
my-default.ini中有一条语句:
指定了严格模式,为了安全,严格模式禁止通过 insert 这种形式直接修改 mysql 库中的 user 表进行添加新用户
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。
原因:
因为新版的的mysql版本已经将创建账户和赋予权限的方式分开了
解决办法:
创建账户:create user '用户名'@'访问主机' identified by '密码';
赋予权限:grant 权限列表 on 数据库 to '用户名'@'访问主机' ;(修改权限时在后面加with grant option)


第三种:
CREATE USER 'laowang'@'localhost' IDENTIFIED BY '123456';
授予账户权限的方法如下:
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON *.* TO 'laowang'@'localhost';
授予所有权限:
GRANT ALL PRIVILEGES ON *.* TO 'laowang'@'localhost';
查看用户权限:
show grants for 'laowang'@'localhost';

all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。
on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user
to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。比如:”yangxin”@”192.168.0.%”,表示yangxin这个用户只能在192.168.0IP段登录
identified by:指定用户的登录密码
with grant option:表示允许用户将自己的权限授权给其它用户
可以使用GRANT给用户添加权限,权限会自动叠加,不会覆盖之前授予的权限,比如你先给用户添加一个SELECT权限,后来又给用户添加了一个INSERT权限,那么该用户就同时拥有了SELECT和INSERT权限。
  • 刷新权限:flush privileges;
  • SELECT host, user, authentication_string FROM user WHERE user = 'root';

4.操纵数据库

mysql> SHOW DATABASES;#展示Server上的数据库,列出 MySQL 数据库管理系统的数据库列表。
mysql> CREATE DATABASE mydatabase1;//  创建数据库:mydatabase1是新的数据库的名称,数据库名称是大小写敏感的。
mysql> USE mydatabase1; // 使用数据库 选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。
mysql> SELECT DATABASE();//查看当前选取的是什么数据库
mysql> DROP DATABASE mydatabase1;//删除数据库

5.操纵数据库中的表

mysql> SHOW TABLES;//显示指定数据库的所有表,使用该命令前需要使用 use 命令来选择要操作的数据库。
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
  -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);//创建表(注意表名也是区分大小写):
mysql> DESCRIBE pet;//查看表
mysql> DROP TABLE pet;//删除表
mysql> SHOW COLUMNS FROM runoob_tbl;//显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。
mysql> SHOW INDEX FROM runoob_tbl;//显示数据表的详细索引信息,包括PRIMARY KEY(主键)。
mysql> SHOW TABLE STATUS  FROM RUNOOB;   # 显示数据库 RUNOOB 中所有表的信息
mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%';     # 表名以runoob开头的表的信息
mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G   # 加上 \G,查询结果按列打印
  1. 向表中填入数据
mysql> INSERT INTO pet
  -> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);

注意用INSERT插入时,字符串和日期要用引号包围,并且空值是NULL。对于一些没有的值,用\N插入NULL值.

  1. 查询语句
    查询语句的一般形式:
    SELECT what_to_select
    FROM which_table
    WHERE conditions_to_satisfy;
    具体语句还有很多,用时查询手册吧。
  2. 添加新用户建议 GRANT 命令
    一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
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 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。

grant 创建、修改、删除 MySQL 数据表结构权限。
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 外键权限。
grant references on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 临时表权限。
grant create temporary tables on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 索引权限。
grant index on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 视图、查看视图源代码 权限。
grant create view on testdb.* to developer@'192.168.0.%';
grant show view on testdb.* to developer@'192.168.0.%';
grant 操作 MySQL 存储过程、函数 权限。
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 管理某个 MySQL 数据库的权限。

grant all privileges on testdb to dba@'localhost'

其中,关键字 privileges 可以省略。
四、grant 高级 DBA 管理 MySQL 中所有数据库的权限。

grant all on *.* to dba@'localhost'

五、MySQL grant 权限,分别可以作用在多个层次上。

1. grant 作用在整个 MySQL 服务器上:
grant select on *.* to dba@localhost; -- dba 可以查询 MySQL 中所有数据库中的表。
grant all on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有数据库
2. grant 作用在单个数据库上:
grant select on testdb.* to dba@localhost; -- dba 可以查询 testdb 中的表。
3. grant 作用在单个数据表上:
grant select, insert, update, delete on testdb.orders to dba@localhost;
这里在给一个用户授权多张表时,可以多次执行以上语句。例如:
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 作用在存储过程、函数上:
grant execute on procedure testdb.pr_add to 'dba'@'localhost'
grant execute on function testdb.fn_add to 'dba'@'localhost'

六、查看 MySQL 用户权限

查看当前用户(自己)权限:
show grants;
查看其他 MySQL 用户权限:
show grants for dba@localhost;

七、撤销已经赋予给 MySQL 用户权限的权限。

revoke 跟 grant 的语法差不多,只需要把关键字 to 换成 from 即可:
grant all on *.* to dba@localhost;
revoke all on *.* from dba@localhost;

八、MySQL grant、revoke 用户权限注意事项

1. grant, revoke 用户权限后,该用户只有重新连接 MySQL 数据库,权限才能生效。
2. 如果想让授权的用户,也可以将这些权限 grant 给其他用户,需要选项 grant option
grant select on testdb.* to dba@localhost with grant option;
这个特性一般用不到。实际中,数据库权限最好由 DBA 来统一管理。

注意:创建完成后需要执行 FLUSH PRIVILEGES 语句。

  1. 28个权限:下面是具体的权限介绍:转载的,记录一下:
    一.权限表
    mysql数据库中的3个权限表:user 、db、 host
    权限表的存取过程是:
    1)先从user表中的host、 user、 password这3个字段中判断连接的IP、用户名、密码是否存在表中,存在则通过身份验证;
    2)通过权限验证,进行权限分配时,按照useradbatables_privacolumns_priv的顺序进行分配。即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。
    二.MySQL各种权限(共27个)
    (以下操作都是以root身份登陆进行grant授权,以p1@localhost身份登陆执行各种命令。)
    1. usage
      连接(登陆)权限,建立一个用户,就会自动授予其usage权限(默认授予)。
      mysql> grant usage on *.* to 'p1'@'localhost' identified by '123';
      该权限只能用于数据库登陆,不能执行任何操作;且usage权限不能被回收,也即REVOKE用户并不能删除用户。
    2. select
      必须有select的权限,才可以使用select table
      mysql> grant select on pyt.* to 'p1'@'localhost';
      mysql> select * from shop;
    3. create
      必须有create的权限,才可以使用create table
    4. create routine
      必须具有create routine的权限,才可以使用{create |alter|drop} {procedure|function}
      当授予create routine时,自动授予EXECUTE, ALTER ROUTINE权限给它的创建者:
    5. create temporary tables(注意这里是tables,不是table)
      必须有create temporary tables的权限,才可以使用create temporary tables.
    6. create view
      必须有create view的权限,才可以使用create view
    7. create user
      要使用CREATE USER,必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。
    8. insert
      必须有insert的权限,才可以使用insert into ….. values….
    9. alter
      必须有alter的权限,才可以使用alter table
      alter table shop modify dealer char(15);
    10. alter routine
      必须具有alter routine的权限,才可以使用{alter |drop} {procedure|function}
    11. update
      必须有update的权限,才可以使用update table
      mysql> update shop set price=3.5 where article=0001 and dealer=’A';
    12. delete
      必须有delete的权限,才可以使用delete from ….where….(删除表中的记录)
    13. drop
      必须有drop的权限,才可以使用drop database db_name; drop table tab_name;
      drop view vi_name; drop index in_name;
    14. show database
      通过show database只能看到你拥有的某些权限的数据库,除非你拥有全局SHOW DATABASES权限。
      对于p1@localhost用户来说,没有对mysql数据库的权限,所以以此身份登陆查询时,无法看到mysql
    15. show view
      必须拥有show view权限,才能执行show create view。
      mysql> grant show view on pyt.* to p1@localhost;mysql> show create view v_shop;
    16. index
      必须拥有index权限,才能执行[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
    必须拥有lock tables权限,才可以使用lock tables
mysql> grant lock tables on pyt.* to p1@localhost;

mysql> lock tables a1 read;

mysql> unlock tables;
  1. references
    有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。
  2. reload
    必须拥有reload权限,才可以执行flush [tables | logs | privileges]
  3. replication client
    拥有此权限可以查询master server、slave server状态。
  4. replication slave
    拥有此权限可以查看从服务器,从主服务器读取二进制日志。
  5. Shutdown
    关闭MySQL:
  6. grant option
    拥有grant option,就可以将自己拥有的权限授予其他用户(仅限于自己已经拥有的权限)
  7. file
    拥有file权限才可以执行 select ..into outfile和load data infile…操作,但是不要把file, process, super权限授予管理员以外的账号,这样存在严重的安全隐患。
  8. super
    这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。
  9. process
    通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。默认情况下,每个用户都可以执行SHOW PROCESSLIST命令,但是只能查询本用户的进程。

另外,
管理权限(如 super, process, file等)不能够指定某个数据库,on后面必须跟.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容