mysql高级1

125 阅读7分钟

高级mysql框架.png

MYSQL用户管理

修改密码
方法1: 用SET PASSWORD命令 
首先登录MySQL。 
格式:mysql> set password for 用户名@localhost = password('新密码'); 
例子:mysql> set password for root@localhost = password('123'); 

方法2:用mysqladmin 
格式:mysqladmin -u用户名 -p旧密码 password 新密码 
例子:mysqladmin -uroot -p123456 password 123 

方法3:用UPDATE直接编辑user表 
首先登录MySQL。 
mysql> use mysql; 
mysql> update user set password=password('123') where user='root' 
and host='localhost'; 
mysql> flush privileges; 

方法4:在忘记root密码的时候,可以这样 
以windows为例: 
1. 关闭正在运行的MySQL服务。 
2. 打开DOS窗口,转到mysql\bin目录。 
3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL
服务的时候跳过权限表认证。 
4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。 
5. 输入mysql回车,如果成功,将出现MySQL提示符 >。 
6. 连接权限数据库: use mysql; 。 
7. 改密码:update user set password=password("123")
8.  where user="root";(别忘了最后加分号) 。 
9. 刷新权限(必须步骤):flush privileges; 。 
10. 退出 quit。 
11. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。

删除MySQL
1、双击安装包,点击下一步,然后点击remove。卸载。
2、手动删除Program Files中的MySQL目录。
3、手动删除ProgramData目录(这个目录是隐藏的。)中的MySQL。


创建用户

创建用户
create user zhang3 identified by '123123';
表示创建名称为zhang3的用户,密码设为123123

了解User表

查看用户
select host,user,password,select_priv,insert_priv,drop_priv from mysql.user;

select * from user\G;
将 user 中的数据以行的形式显示出来(针对列很长的表可以采用这个方法 )


userbi.png

host :   表示连接类型
      % 表示所有远程通过 TCP方式的连接
      IP 地址 如 (192.168.1.2,127.0.0.1) 通过制定ip地址进行的TCP方式的连接
     机器名   通过制定i网络中的机器名进行的TCP方式的连接
      ::1   IPv6的本地ip地址  等同于IPv4的 127.0.0.1
      localhost 本地方式通过命令行方式的连接 ,比如mysql -u xxx -p 123xxx 方式的连接。
User:表示用户名
     同一用户通过不同方式链接的权限是不一样的。

password : 密码
     所有密码串通过 password(明文字符串) 生成的密文字符串。加密算法为MYSQLSHA1 ,不可逆 。
      mysql 5.7 的密码保存到 authentication_string 字段中不再使用password 字段。

select_priv , insert_priv等 
      为该用户所拥有的权限。



设置密码

修改当前用户的密码:
set password =password('123456')
 
修改某个用户的密码:
update mysql.user set password=password('123456') where user='li4';
flush privileges;   #所有通过user表的修改,必须用该命令才能生效。


修改用户

修改用户名:
update mysql.user set user='li4' where user='wang5';
flush privileges;   #所有通过user表的修改,必须用该命令才能生效。


删除用户

drop user li4 ;

权限管理

 授予权限

授权命令: 
grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’;
该权限如果发现没有该用户,则会直接新建一个用户。
比如  
grant select,insert,delete,drop on cqmdb.* to li4@localhost  ;
#给li4用户用本地命令行方式下,授予cqmdb这个库下的所有表的插删改查的权限。

grant all privileges on *.* to joe@'%'  identified by '123'; 
#授予通过网络方式登录的的joe用户 ,对所有库所有表的全部权限,密码设为123.
就算 all privileges 了所有权限,grant_priv 权限也只有 root 才能拥有。

给 root 赋连接口令 grant all privileges on *.* to root@'%'  ;后新建的连接没有密码,需要设置密码才能远程连接。
update user set password=password('root') where user='root' and host='%';


收回权限

授权命令: 
revoke  权限1,权限2,…权限n on 数据库名称.表名称  from  用户名@用户地址 ;

REVOKE ALL PRIVILEGES ON mysql.* FROM joe@localhost;
#若赋的全库的表就 收回全库全表的所有权限

REVOKE select,insert,update,delete ON mysql.* FROM joe@localhost;
#收回mysql库下的所有表的插删改查权限
对比赋予权限的方法。
必须用户重新登录后才能生效


查看权限

查看当前用户权限
show grants;
 
查看某用户的全局权限
select  * from user ;
 
查看某用户的某库的权限
select * from  db;
 
查看某用户的某个表的权限
select * from tables_priv;

通过工具远程访问

1、先 ping 一下数据库服务器的ip 地址确认网络畅通。
 
2、关闭数据库服务的防火墙
    service iptables stop
 
3、 确认Mysql中已经有可以通过远程登录的账户
    select  * from mysql.user where user='li4' and host='%';
 
如果没有用户,先执行如下命令:
    grant all privileges on *.*  to li4@'%'  identified by '123123';
 
4、测试连接:


mysql的一些杂项配置

SHOW VARIABLES LIKE '%lower_case_table_names%'
windows系统默认大小写不敏感,但是linux系统是大小写敏感的
默认为0,大小写敏感。
设置1,大小写不敏感。创建的表,数据库都是以小写形式存放在磁盘上,
对于sql语句都是转换为小写对表和DB进行查找。
设置2,创建的表和DB依据语句上格式存放,凡是查找都是转换为小
写进行。 
 
 
设置变量常采用 set lower_case_table_names = 1; 的方式,
但此变量是只读权限,所以需要在配置文件中改。
当想设置为大小写不敏感时,要在my.cnf这个配置文件 [mysqld] 中加入
lower_case_table_names = 1 ,然后重启服务器。
但是要在重启数据库实例之前就需要将原来的数据库和表转换为小写,
否则更改后将找不到数据库名。
在进行数据库参数设置之前,需要掌握这个参数带来的影响,
切不可盲目设置。

sql_mode

MySQL的sql_mode合理设置
sql_mode是个很容易被忽视的变量,默认值是空值,在这种
设置下是可以允许一些非法操作的,比如允许一些非法数据
的插入。在生产环境必须将这个值设置为严格模式,所以开发、
测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。

使用 set sql_mode=ONLY_FULL_GROUP_BY; 的方式设置会将之前的设置覆盖掉
同时设置多个限制:set sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO';
 
sql_mode常用值如下: 
ONLY_FULL_GROUP_BY:
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY
中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
 
NO_AUTO_VALUE_ON_ZERO:
该值影响自增长列的插入。默认设置下,插入0NULL代表生成下
一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,
那么这个选项就有用了。
 
STRICT_TRANS_TABLES:
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的
操作,对非事务表不做限制
NO_ZERO_IN_DATE:
在严格模式下,不允许日期和月份为零
 
NO_ZERO_DATE:
设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误
而不是警告。
 
ERROR_FOR_DIVISION_BY_ZERO:
在INSERTUPDATE过程中,如果数据被零除,则产生错误而非警告。
如果未给出该模式,那么数据被零除时MySQL返回NULL
 
NO_AUTO_CREATE_USER:
禁止GRANT创建密码为空的用户
 
NO_ENGINE_SUBSTITUTION:
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,
用默认的存储引擎替代,并抛出一个异常
 
PIPES_AS_CONCAT:
将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,
也和字符串的拼接函数Concat相类似
 
ANSI_QUOTES:
启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解
释为识别符
 
ORACLE:
  设置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.