MySQL管理基础
#
第一个功能:连接数据库(在前面mysql命令的使用里面讲解了,这里就不讲解了)
第二个功能:mysql客户端自带的命令功能
mysql命令的使用(mysql --help)
选项:
-u 用户名
-p 密码
-P 端口号(默认3306)
-h mysql的连接IP地址
-S 后接socket文件存放位置【可以本地登录的方式;(相当于:mysql -uroot -p -S /tmp/sock.mysql) 】
-e 免交互执行mysql命令(eg:mysql -uroot -p -e "show databases;")
< 导入SQL文件到mysql中(mysql -uroot -p < /tmp/world.sql)
--protocol=
--help
--version
####补充说明:如果使用了-h 参数和-S参数的话,即默认使用-h参数(即使用TCP/IP连接)
举例:
No1: mysql
No2:本地Socket连接方式 mysql -uroot -p123 [-S xzxzxz]
No3:应用远程连接:(完整的tcp/ip的连接串模式,是通用的连接方式) mysql -uroot -p123 -h 10.0.0.51 -P 3306
# mysql客户端自带的命令参数讲解
help (\h) 帮助信息
? (\?) 相当于help
clear (\c) 相当于Ctrl + c,结束当前命令的运行
connect (\r)
delimiter (\d)
edit (\e)
ego (\G) 把查询的数据结构化为键值对的模式(select * from mysql.user\G;)
exit (\q) 退出数据库
quit (\q) 退出数据库
go (\g)
nopager (\n)
notee (\t)
pager (\P)
print (\p)
prompt (\R)
rehash (\#)
source (\.) 运行SQL脚本文件(source /root/world.sql)
status (\s)
system (\!) 在mysql里面运行一个Linux操作系统命令(system ls)
tee (\T) 开一个日志文件,保存以后的操作日志(tee /tmp/sql.log)
use (\u) 切换到指定的数据库(use world)
charset (\C)
warnings (\W)
nowarning (\w)
mysqladmin命令说明
查看帮助文档:mysqladmin --help
参数说明(和mysql命令参数基本上差不多):
-u -p -S -h -P
常用参数:
mysqladmin -uroot -p password 123 # 修改密码
Enter password:
mysqladmin -uroot -p shutdown # 停止mysql服务
1)用户的作用
(1)登录mysql数据库
(2)管理数据库对象(库/表)
2)用户的定义
(1)格式:'username'@'主机域'
主机域格式:
'10.0.0.51'
'10.0.0.5%'
'10.0.0.%'
'%'
'10.0.0.0/255.255.255.0'
'db01'
说明:还可以使用iptables来控制访问
*************************************************************************
# 创建用户
mysql> create user oldguo@'10.0.0.%' identified by 'XXX';
帮助文档查看
mysql> help create user;
# 删除用户
mysql> drop user oldguo@'10.0.0.%';
# 查询用户
mysql> select user,host,password from mysql.user; --> 适用于5.7版本及其以下版本
# 设置(修改)用户密码
mysql>set password for oldguo@'10.0.0.%'=PASSWORD('YYY');
补明:在MySQL5.8版本以后,不支持以下命令
grant all no 库名.表名 to '用户名'@'主机域' identified by '密码'; ---> 错误语句 ,5.8版本以后不支持在用户授权的时候创建用户和设置密码
# 一、刚装完mysql数据库该做的事情
# No1:设定初始密码(root@localhost)
mysqladmin -uroot -p password 'XXX'
Enter password: ----> 默认的初始密码不存在
Warning: Using a password on the command line interface can be insecure.
--> 密码显示再屏幕上面,不安全
# No2:使用密码登录
mysql -uroot -pXXX
# No3:清理无效用户
mysql> select user,host,password from mysql.user;
mysql> drop user root@'db01';
【说明:没有用户名的和没有密码的都是有安全隐患的用户,我们需要清理掉】
# No4:查看用户属性
mysql> select * from mysql.user \G;
# 二、 用户的创建、查看、删除
# 三、修改用户密码
# No1: 修改用户密码
set password for 用户名@'10.0.0.%'=PASSWORD('YYY');
# No2:推荐使用grant(重点记忆)
# No3:忘记密码才会使用以下命令修改
5.6和5.6以前的版本:
update user set password=PASSWORD('XXX') where user='root' and host='localhost';
flush privileges;
5.7版本的话,
update mysql.user set authentication_string=PASSWORD('XXX') where='test' and host='10.0.0.%';
# 作用对象: 库、表
# 权限命令:
GRANT SELECT INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS,FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES,LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW,CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE
补充说明:权限命令不包括grant 、revoke 命令
grant 权限 on 库名.表名 to 用户名@'主机域' identified by '密码';
***************************************************************
No1:适合版本在5.8以下才能够使用上面的命令
如果版本是5.8及其以上的话,在授权的时候,必须要先创建用户;且在授权的时候不能设置密码
No2:作用对象分析
权限: 就是上面说的权限命令,也可以使用ALL来代替所有权限命令
且权限命令不包括grant和revoke 命令
在工作当中,给员工的一个普通用户,里面最多只能包含insert 、select 、update
库名.表名:
*.* 指当前mysql数据中所有的库下的所有表(全局库)
wordpress.* 指当前mysql数据中wordpress库下的所有表(单库级别)
wordpress.t1 指当前mysql数据中wordpress库下的t1表(单表级别)
***************************************************************
show grants from 用户名@'主机域';
示列:show grants for wordpress@'10.0.0.%';
revoke 权限 on 库名.表名 from 用户名@'主机域';
示列:revoke all on wordpress.* from wordpress@'10.0.0.%';
如果是普通用户:
show grants from 用户名@'主机域';
示列:show grants for wordpress@'10.0.0.%';
如果是管理员账户:
第一步:查看权限
show grants for admin@'%';
第二步:如果第一步查看不出来的话,执行第二步(删除某一个权限)
revoke select on *.* from admin@'%';
第三步:再次查看权限
show grants for admin@'10.0.0.%';
第四步:把第二步删除的权限设置回来
[说明:在显示里面的权限加上select就是ALL所有的权限]
需求:
1.开一个管理员用户admin,能通过10.0.0.%这个网段管理mysql (WITH GRANT OPTION )
mysql> grant all on *.* to admin@'10.0.0.%' identified by '123' with grant option;
2.开一个应用用户app,能通过10.0.0.%这个网段对app库下所有表进行SELECT,INSERT, UPDATE, DELETE
mysql> grant SELECT,INSERT, UPDATE, DELETE on app.* to app@'10.0.0.%' identified by '123';
# 补充说明:
账号开好了,我们需要先进行测试,再拿给相应的工作人员使用
测试方法:使用我们刚才创建的用户进行登录测试:
mysql -uadmin -h 10.0.0.51 -p123
补充说明:我们还需要在/etc/my.cnf配置文件里的[mysqld]模块里添加skip_name_resolve模块,(作用是禁止域名解析)重启数据库,进行上面的命令测试
开发人员说:请给我开(授权)一个用户
解决思路:根据授权命令来解决
grant 权限 on 库名.表名 to 用户名@'主机域' identified by '密码';
询问内容?
No1:权限范围,你需要做什么?
No2:你需要对哪些库或者表做开发操作?
No3:登录地址范围:你从哪里连接过来?
No4:用户名有没有要求没有?
No5:你的密码设置为什么?(密码设置最好安全一点)
最后补充一句:密码请妥善保管,千万不要示意他人或在公共场合使用
# 启动文件说明:
mysql.server: 是mysql的启动的二进制文件,相当于/etc/init.d/ 下面的配置文件
mysql_safe: 也是mysql服务的启动文件,它是在启动mysql.server之后,会被引导启动的文件,它后面可以接一些启动参数
mysqld : 是mysql的服务的守护进程
# MySQL的启动流程:(☆☆☆☆☆)
最先启动 再次启动 最后生成
mysql.server start mysql_safe & mysqld守护进程
使用mysql.server 启动 /etc/init.d/mysqld start
使用mysqld_safe启动 mysqld_safe --skip-grant-tables --skip-networking &
方法一: /etc/init.d/mysqld stop
方法二: mysqladmin -uroot -p123 [-h 10.0.0.51] shutdown
方法三:利用以下系统进程管理命令关闭MySQL 【kill -9 进程号】(最好不要使用)
kill pid pid为数据库服务对应的进程号
killall mysqld mysqld是数据库服务对应的进程名字
pkill mysqld mysqld是数据库服务对应的进程名字
案例分享
http://oldboy.blog.51cto.com/2561410/1431161
http://oldboy.blog.51cto.com/2561410/1431172
目的:为了能够让mysql,按照我们管理员的思维启动和运行,方便后期维护。
#(1) 预编译的时候修改(A) cmake时指定参数,一般建议修改一些不会经常变化的参数 #(2) 初始化配置文件 (B) MySQL配置文件加载顺序 命令:mysqld --help --verbose |grep my.cnf /etc/my.cnf [如果是单实例的话,规范是把配置信息添加到该配置文件里面] /etc/mysql/my.cnf ?etc/my.cnf.d/ ----> MySQL5.7里面默认存在 /application/mysql-5.6.38/etc/my.cnf ~/.my.cnf 补充说明: mysqld_safe --defaults-file=/tmp/my3306.cnf # 说明:如果使用./bin/mysqld_safe 守护进程启动mysql数据库时,使用了 --defaults-file=<配置文件的绝对路径>参数,这时只会使用这个参数指定的配置文件,其他配置文件将失效。 件,其他配置文件将失效。 #(3) 使用命令行参数,干预mysql启动(C) eg: mysql_safe --socket=/tmp/mysql.sock --port=8806 &
总结:配置文件读取优先级
在正常的情况下,配置文件的优先级是: C > B > A (优先级高的后读取,会覆盖前面的配置文件),如果一旦使用了--defaults-file=/PATH 参数的话,那么该参数对应路径文件优先级最高,其他配置文件将失效。
配置文件结构、模板(单实例)
说明:这里拿/etc/my.cnf来说明,具体配置文件位置需要看程序读取配置文件的优先级;
# 配置文件结构
[标签1]
a=XXX
[标签2]
b=YYY
# 标签的分类
服务器标签:(影响了数据库的启动)
[server]
[mysqld]
[mysql_safe]
客户端标签:(作用:影响了本地客户端的连接)
[client]
[mysql]
[mysqladmin]
[Mysqldump]
# 配置文件模板
vim /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
socket=/application/mysql/tmp/mysql.sock
port=3306
log_error=/var/log/mysql.log # 日志路径
server_id=6 # 实例的ID
skip_name_resolve # 禁止域名解析
[mysql]
user=root
password=123
socket=/application/mysql/tmp/mysql.sock
prompt=\\ oldguo [\\d]> # mysql客户端的命令提示符
#提示说明:
修改了配置文件,需要重启才能生效: /etc/init.d/mysqld restart
多实例配置
多实例是什么意思?
实际上就是在一台高性能服务器上配置多个数据库管理系统,以来提高服务器的性能
怎么配置多实例?
配置多实例就和配置Tomcat多实例一样,需要软件部分实例和数据部分实例
软件部分:编写配置文件(多port、多socket、多日志、多server_id....)
数据部分:初始化多套数据
# 多实例(3个)配置过程:
第一步:创建多个专用目录
mkdir /data/330{7..9}/data -p
第二步:准备多个配置文件
vim /data/3307/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
port=3307
log-error=/data/3307/mysql.log
skip-name-resolve
server-id=7
--------------------------
vim /data/3308/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log-error=/data/3308/mysql.log
skip-name-resolve
server-id=8
------------------
vim /data/3309/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
port=3309
log-error=/data/3309/mysql.log
skip-name-resolve
server-id=9
第三步:初始化多次数据库
初始化三套数据:
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3307/data
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3308/data
/application/mysql/scripts/mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3309/data
第四步:修改权限
touch /data/330{7..9}/mysql.log
chown -R mysql.mysql /data/330*
第五步:启动数据库
/application/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf &
/application/mysql/bin/mysqld_safe --defaults-file=/data/3308/my.cnf &
/application/mysql/bin/mysqld_safe --defaults-file=/data/3309/my.cnf &
第六步:验证、连接测试
验证:
netstat -lnp|grep 330
连接测试:
mysql -S /data/3307/mysql.sock -e "show variables like 'server_id'"
mysql -S /data/3308/mysql.sock -e "show variables like 'server_id'"
mysql -S /data/3309/mysql.sock -e "show variables like 'server_id'"
第七步:启动数据库多实例
方法一是使用socket连接启动;
方法二是使用TCP/IP连接启动
第八步:关闭数据库多实例
mysqladmin -S /data/3307/mysql.sock shutdown
mysqladmin -S /data/3308/mysql.sock shutdown
mysqladmin -S /data/3309/mysql.sock shutdown