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安装
-
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.server start
|bash mysql.server start
mysql -uroot 登录
卸载brew uninstall mysql
不需要环境变量配置- 使用MAMP安装MYSQL
环境变量配置
二、MySQL 管理
{start|stop|restart|reload|force-reload|status}
- 启动 MySQL 服务器
mysql.server start
- 关闭 MySQL 服务器
mysql.server stop
- 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。
- 文件配置
- 注意区分mac版mysql与Windows版的mysql配置文件扩展名不同:
mac下: my.cnf
windows下: my.ini - 在mac 上使用 brew 安装 mysql 后,发现 /etc/my.cnf 并不存在。
即 通过 brew 安装的 MySQL 的配置文件为:/usr/local/etc/my.cnf - 在配置文件中,你可以指定不同的错误日志文件存放的目录,一般你不需要改动这些配置。
- mysqladmin命令
可以使用 mysql mysqladmin 命令来创建数据库。
mysqladmin -u root -p create RUNOOB
mysqladmin -u root -p drop RUNOOB
- mysqld命令
mysqld启动MYSQL服务mysqldSQL后台程序(即MySQL服务器)。要想使用客户端程序,该程序必须运行,因为客户端通过连接服务器来访问数据库。
mysqld --verbose --help//显示服务器选项和可配置变量一览
-? //--help 查看简短帮助信息
--ansi //使用标准ANSI,SQL语法
-b //--basedir mysql安装目录
--big-tables //保存大的结果集到临时文件
--bind-address //服务器要监听的IP地址格式
三、MySQL 基本常用语句
- 语法规则:
1.一条命令通常由一个SQL语句后跟一个分号(;)组成。有一些情况会省略分号,比如QUIT。
2.输入命令后,mysql将命令传给服务器执行,显示结果,之后又显示mysql>表示准备好接收下一条命令。
3.mysql以表格形式显示结果,第一行显示列名(或所查询的表达式),后面的行显示查询结果。
4.mysql会显示查询返回了多少行,并且附上查询所花费的时间(但是这个时间不准确)。
5.命令不区分大小写。
6.一行可以写多个命令
7.可以将一条命令分行写,直到看到分号才认为是一条命令的结束。
8.如果输入到一半想取消,可以输入\c (注意c是小写)。
9.字符串可以用单引号或者双引号包围,如果左右不对应,换行后会有提示。 - 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,查询结果按列打印
- 向表中填入数据
mysql> INSERT INTO pet
-> VALUES ('Puffball','Diane','hamster','f','1999-03-30',NULL);
注意用INSERT插入时,字符串和日期要用引号包围,并且空值是NULL。对于一些没有的值,用\N插入NULL值.
- 查询语句
查询语句的一般形式:
SELECT what_to_select
FROM which_table
WHERE conditions_to_satisfy;
具体语句还有很多,用时查询手册吧。 - 添加新用户建议 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 语句。
- 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身份登陆执行各种命令。)- usage
连接(登陆)权限,建立一个用户,就会自动授予其usage权限(默认授予)。
mysql> grant usage on *.* to 'p1'@'localhost' identified by '123';
该权限只能用于数据库登陆,不能执行任何操作;且usage权限不能被回收,也即REVOKE用户并不能删除用户。 - select
必须有select的权限,才可以使用select table
mysql> grant select on pyt.* to 'p1'@'localhost';
mysql> select * from shop;
- create
必须有create的权限,才可以使用create table - create routine
必须具有create routine的权限,才可以使用{create |alter|drop} {procedure|function}
当授予create routine时,自动授予EXECUTE, ALTER ROUTINE权限给它的创建者: - create temporary tables(注意这里是tables,不是table)
必须有create temporary tables的权限,才可以使用create temporary tables. - create view
必须有create view的权限,才可以使用create view - create user
要使用CREATE USER,必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。 - insert
必须有insert的权限,才可以使用insert into ….. values…. - alter
必须有alter的权限,才可以使用alter table
alter table shop modify dealer char(15); - alter routine
必须具有alter routine的权限,才可以使用{alter |drop} {procedure|function} - update
必须有update的权限,才可以使用update table
mysql> update shop set price=3.5 where article=0001 and dealer=’A'; - delete
必须有delete的权限,才可以使用delete from ….where….(删除表中的记录) - drop
必须有drop的权限,才可以使用drop database db_name; drop table tab_name;
drop view vi_name; drop index in_name; - show database
通过show database只能看到你拥有的某些权限的数据库,除非你拥有全局SHOW DATABASES权限。
对于p1@localhost用户来说,没有对mysql数据库的权限,所以以此身份登陆查询时,无法看到mysql - show view
必须拥有show view权限,才能执行show create view。
mysql> grant show view on pyt.* to p1@localhost;mysql> show create view v_shop;
- index
必须拥有index权限,才能执行[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
必须拥有lock tables权限,才可以使用lock tables
mysql> grant lock tables on pyt.* to p1@localhost;
mysql> lock tables a1 read;
mysql> unlock tables;
- references
有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。 - reload
必须拥有reload权限,才可以执行flush [tables | logs | privileges] - replication client
拥有此权限可以查询master server、slave server状态。 - replication slave
拥有此权限可以查看从服务器,从主服务器读取二进制日志。 - Shutdown
关闭MySQL: - grant option
拥有grant option,就可以将自己拥有的权限授予其他用户(仅限于自己已经拥有的权限) - file
拥有file权限才可以执行 select ..into outfile和load data infile…操作,但是不要把file, process, super权限授予管理员以外的账号,这样存在严重的安全隐患。 - super
这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。 - process
通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。默认情况下,每个用户都可以执行SHOW PROCESSLIST命令,但是只能查询本用户的进程。
另外,
管理权限(如 super, process, file等)不能够指定某个数据库,on后面必须跟.