第三章·DBA-MySQL版本区别及管理
MySQL5.6与MySQL5.7安装的区别
- cmake的时候加入了bostory
- 初始化时使用mysqld-initialize替代mysql_install_db,其他参数没有变化
- --initialize会生成一个临时密码
- 还可以用另外一个参数--initialize-insecure不生成密码
# 编译参数
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.7.20 \
-DMYSQL_DATADIR=/application/mysql-5.7.20/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.7.20/tmp/mysql.sock \
-DDOWNLOAD_BOOST=1 \ ## mysql-5.7.38.tar.gz没有boost需要添加该参数
-DWITH_BOOST=/usr/local/boost_1_59_0 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
yum安装MySQL
1.选择下载
2.选择社区版
3.选择yum安装
4.选择对应系统
5.选择不登录直接下载
# 1.下载MySQL的yum源
[root@db01 ~]# wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
# 2.安装MySQL的yum源
[root@db01 ~]# rpm -ivh mysql80-community-release-el7-6.noarch.rpm
# 3.查看仓库中mysql版本
[root@db01 ~]# yum list|grep mysql
# 4.修改yum源
[root@db01 yum.repos.d]# vim mysql-community.repo
[mysql57-community]
enabled=0 改成 1
[mysql80-community]
enabled=1 改成 0
# 5.安装mysql5.7
[root@db01 yum.repos.d]# yum install -y mysql-server
# 6.查看日志
[root@db01 yum.repos.d]# cat /var/log/mysqld.log
# 7.找密码
[root@db01 yum.repos.d]# grep 'root' /var/log/mysqld.log
2022-08-04T09:48:49.008364Z 1 [Note] A temporary password is generated for root@localhost: Q6>kAhmpY:0w
# 8.连接
[root@db01 yum.repos.d]# mysql -uroot -p'Q6>kAhmpY:0w'
# 9.修改配置文件MySQL使用简单密码
validate_password_length=1
validate_password_mixed_case_count=0
validate_password_number_count=0
validate_password_special_char_count=0
[root@db01 yum.repos.d]# systemctl restart mysqld
# 10.改密码
mysql> alter user root@'localhost' identified by '123@qqdianCOM';
Query OK, 0 rows affected (0.00 sec)
mysql> alter user root@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)
MySQL用户权限管理
- MySQL用户基础操作
Linux用户的作用:
- 登录系统
- 管理系统文件
Linux用户管理:
- 创建用户: useradd adduser
- 删除用户: userdel
- 修改用户: usermod
MySQL用户的作用:
- 登录MySQL数据库
- 管理数据库对象
MySQL用户管理:
- 创建用户: create user
- 删除用户: delete user drop user
- 修改用户: update
用户的定义:
- username@'主机域'
- 主机域: 可以理解为是MySQL登录的白名单
- 主机域格式:
- 10.0.0.51
- 10.0.0.5%
- 10.0.0.%
- 10.0.%.%
- 10.%.%.%
- %
- db01(不能直接连,需要做解析)
- 10.0.0.0/255.255.255.0 == 10.0.0.%
- 10.0.0.0/24 (不支持)
用户管理实战
误删除root用户或忘记root密码
# 1.停mysql
/etc/init.d/mysqld stop
# 2.跳过授权表,只能本地连接启动数据库
[root@m01 ~]# mysqld_safe --skip-grant-tables --skip-network &
# 3.刷新授权表
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
# 4.创建root用户
mysql> grant all on *.* to root@'localhost' identified by '123' with grant option;
Query OK, 0 rows affected (0.00 sec)
# 5.重启mysql
[root@m01 ~]# /etc/init.d/mysqld restart
#方法二
[root@db01 ~]# systemctl stop mysqld
[root@db01 ~]# mysqld --user=mysql --skip-grant-tables &
[root@db01 ~]# mysql
mysql> update mysql.user set authentication_string=PASSWORD('abc') where user='root' and host='localhost';
mysql> flush privileges;
## 重启mysql
用户管理及权限管理
用户的管理
增
# 5.6创建用户
mysql> create user lw2@'localhost';
mysql> create user lw2@'localhost' identified by '123';
# 5.7创建用户(必须给密码创建)
mysql> create user lw2@'localhost' identified by '123';
# 注意:以前的5.7不支持grant在用户不存在的情况下执行,现在版本支持。相当于直接用作创建用户
mysql> grant all on *.* to lw3@'localhost' identified by '123';
#grant授权命令
all == all privileges:所有权限,但不包括授权权限
grant all on root@'localhost' identified by '123' with grant option;
*.*:所有库,下面所有表
wordpress.*
wordpress.user
lw3@'localhost':完整用户
identified by '123':密码123
删
# drop user 用户名@'主机域';
mysql> drop user lw1@'10.0.0.0/255.255.255.0'; 相当于在linux删系统用户 userdel -r lw
# 直接操作表删除用户:
mysql> delete from mysql.user where user='lw2' and host='localhost'; 相当于在linux删系统用户,直接从/etc/passwd中删
改
## 改权限
# 添加权限
mysql> grant update on *.* to lw4@'localhost';
# 回收权限
mysql> revoke select on *.* from lw4@'localhost';
## 改密码
[root@db01 ~]# mysqladmin -uroot -p123 password '456'
mysql> grant all on *.* to root@'localhost' identified by '789';
mysql> alter user root@'localhost' identified by '123';
# 只能修改当前连接上的用户
mysql> set password=PASSWORD('JQK');
# 只有使用update想修改密码时,才需要执行flush privilege;
5.6:
mysql> update mysql.user set password=PASSWORD('abc') where user='root' and host='localhost';
mysql> flush privileges;
5.7:
mysql> update mysql.user set authentication_string=PASSWORD('abc') where user='root' and host='localhost';
mysql> flush privileges;
查
# 查看所有用户
mysql> select * from mysql.user\G;
# 查看指定字段
mysql> select user,host from mysql.user;
# 查看用户的权限
mysql> show grants for root@'localhost';
用户的权限
MySQL的权限定义
作用对象:库、表
权限
INSERT,SELECT, 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 all privileges on *.* to oldboy@’10.0.0.%’ identified by ‘123’;
权限 作用对象 归属 密码
作用对象分解
*.* [当前MySQL实例中所有库下的所有表]
wordpress.* [当前MySQL实例中wordpress库中所有表(单库级别)]
wordpress.user [当前MySQL实例中wordpress库中的user表(单表级别)]
3.企业中权限的设定
开发人员说: 请给我开一个用户
- 1、你需要对哪些库、表进行操作
- 2、你从哪里连接过来
- 3、用户名有没有要求
- 4、密码要求
- 5、发邮件
#一般给开发创建用户权限
grant select,update,delete,insert on *.* to oldboy@’10.0.0.%’ identified by ‘123’;
实验思考问题:
#创建wordpress数据库
create database wordpress;
#使用wordpress库
use wordpress;
#创建t1、t2表
create table t1 (id int);
create table t2 (id int);
#创建blog库
create database blog;
#使用blog库
use blog;
#创建t1表
create table tb1 (id int);
授权:
1、grant select on *.* to wordpress@’10.0.0.5%’ identified by ‘123’;
2、grant insert,delete,update on wordpress.* to wordpress@’10.0.0.5%’ identified by ‘123’;
3、grant all on wordpress.t1 to wordpress@’10.0.0.5%’ identified by ‘123’;
问:
一个客户端程序使用wordpress用户登陆到10.0.0.51的MySQL后,
- 1、对t1表的管理能力?
- 2、对t2表的管理能力?
- 3、对tb1表的管理能力?
解:
- 1、同时满足1,2,3,最终权限是1+2+3
- 2、同时满足了1和2两个授权,最终权限是1+2
- 3、只满足1授权,所以只能select
结论:
- 1、如果在不同级别都包含某个表的管理能力时,权限是相加关系。
- 2、但是我们不推荐在多级别定义重复权限。
- 3、最常用的权限设定方式是单库级别授权,即:wordpress.*
MySQL连接管理
1.连接工具
MySQL自带的连接工具(客户端)
- mysql
常见的特定于客户机的连接选项:
-u:指定用户
-p:指定密码
-h:指定主机
-P:指定端口
-S:指定sock
-e:指定SQL语句
--protocol=name:指定连接方式
- mysqladmin
- mysqldump(逻辑备份)
MySQL第三方的连接工具(客户端)
- Navicat
- SQLmanager
- SQLyog
注意:需要加载对应语言程序的API
2.连接方式
-
1.socket连接
-
2.TCP/IP
-
问题:你怎么判断你的MySQL数据库可以对外提供服务?
MySQL启动关闭流程
启动
/etc/init.d/mysqld start ------> mysqld_safe ------> mysqld
/etc/init.d/mysqld start
systemctl start mysqld
mysqld_safe --选项
关闭
/etc/init.d/mysqld stop
systemctl stop mysqld
mysqladmin -uroot -S /data/3309/data/3309.sock shutdown
#比较危险的关闭方式
kill -9 pid
killall mysqld
pkill mysqld
出现问题:
- 1、如果在业务繁忙的情况下,数据库不会释放pid和sock文件
- 2、号称可以达到和Oracle一样的安全性,但是并不能100%达到
- 3、在业务繁忙的情况下,丢数据(补救措施,高可用)
MySQL实例初始化配置
1.初始化配置文件的作用
场景:我要启动实例
问题:
1)我不知道我的程序在哪?
2)我也不知道我将来启动后去哪找数据库?
3)将来我启动的时候启动信息和错误信息放在哪?
4)我启动的时候sock文件pid文件放在哪?
5)我启动,你们给了我多少内存?
...
N)我还有很多问题需要在我启动之前告诉我,emmmmm....
- 1)预编译:cmake去指定,硬编码到程序当中去
- 2)命令行:设置启动初始化配置
- 3)初始化配置文件(/etc/my.cnf)
配置文件读取顺序:
/etc/my.cnf
/etc/mysql/my.cnf
$MYSQL_HOME/my.cnf(前提是在环境变量中定义了MYSQL_HOME变量)
--defaults-extra-file (类似include)==/opt/my.cnf
~/my.cnf
读取文件顺序是从上到下,因为读取到下面的配置文件会覆盖上面的配置文件,所以优先级是从下到上
注意:如果启动MySQL加了 --defaults-file=/etc/my.cnf 选项,其它位置的配置文件都不读取
思考:
#cmake:
socket=/application/mysql/tmp/mysql.sock
#命令行:
--socket=/tmp/mysql.sock
#配置文件:
/etc/my.cnf中[mysqld]标签下:socket=/opt/mysql.sock
#default参数:
--defaults-file=/tmp/a.txt配置文件中[mysqld]标签下:socket=/tmp/test.sock
socket文件会生成在哪???文件名叫什么???
优先级结论:
- 1.命令行
- 2.defaults-file
- 配置文件
- 预编译
2.初始化配置文件的使用
初始化配置文件功能
1)影响实例的启动(mysqld)
2)影响到客户端
- mysql
- mysqldump
- mysqladmin
如何配置初始化配置文件
[mysqld] [server] ## 这两个标签下的配置,都是来影响服务端启动的
[mysql][mysqladmin][mysqldump] ## 这几个标签,影响对应的客户端命令
[client] ## 这个标签,影响所有的客户端命令
注意:修改客户端配置,不需要重启mysql,修改服务端配置[mysqld]需要重启mysql
[mysqld]
skip_name_resolve
basedir=/application/mysql
datadir=/application/mysql/data
server_id=10
socket=/opt/mysql.sock
[client]
user=root
password=abc
socket=/opt/mysql.sock
MySQL多实例
单实例:一个后台进程 + 多个线程 + 一个预分配的内存结构
多实例:多个后台进程 + 多个线程 + 多个预分配的内存结构
多个配置文件
- 多个端口
- data目录
- socket文件
- 多个日志文件
- pid文件
多个启动脚本
# 1.准备多个配置文件
[root@m01 ~]# vim /data/3307/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3307/data
socket=/data/3307/data/3307.sock
log_error=/data/3307/data/3307.err
pid_file=/data/3307/data/3307.pid
port=3307
[root@m01 ~]# vim /data/3308/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3308/data
socket=/data/3308/data/3308.sock
log_error=/data/3308/data/3308.err
pid_file=/data/3308/data/3308.pid
port=3308
[root@m01 ~]# vim /data/3309/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/data/3309/data
socket=/data/3309/data/3309.sock
log_error=/data/3309/data/3309.err
pid_file=/data/3309/data/3309.pid
port=3309
# 2.创建数据目录
[root@m01 ~]# mkdir -p /data/330{7..9}
# 3.初始化
[root@m01 ~]# cd /application/mysql/scripts/
[root@m01 scripts]# ./mysql_install_db --defaults-file=/data/3307/my.cnf --user=mysql --basedir=/application/mysql --datadir=/data/3307/data
[root@m01 scripts]# ./mysql_install_db --defaults-file=/data/3308/my.cnf --user=mysql --basedir=/application/mysql --datadir=/data/3308/data
[root@m01 scripts]# ./mysql_install_db --defaults-file=/data/3309/my.cnf --user=mysql --basedir=/application/mysql --datadir=/data/3309/data
# 4.查看目录结构
[root@m01 scripts]# tree -L 2 /data/
/data/
├── 3307
│ ├── data
│ └── my.cnf
├── 3308
│ ├── data
│ └── my.cnf
└── 3309
├── data
└── my.cnf
# 5.启动
[root@m01 scripts]# mysqld --defaults-file=/data/3307/my.cnf --user=mysql &
[root@m01 scripts]# mysqld --defaults-file=/data/3308/my.cnf --user=mysql &
[root@m01 scripts]# mysqld --defaults-file=/data/3309/my.cnf --user=mysql &
#### 使用systemd管理
# 6.连接
[root@m01 scripts]# mysql -uroot -p -S /data/3307/data/3307.sock
[root@m01 scripts]# mysql -uroot -p -S /data/3308/data/3308.sock
[root@m01 scripts]# mysql -uroot -p -S /data/3309/data/3309.sock
# 7.连接小技巧
[root@m01 scripts]# vim /usr/bin/mysql3309
mysql -uroot -p -S /data/3309/data/3309.sock
[root@m01 scripts]# chmod +x /usr/bin/mysql3309
[root@m01 scripts]# vim /usr/bin/mysql3308
mysql -uroot -p -S /data/3308/data/3308.sock
[root@m01 scripts]# chmod +x /usr/bin/mysql3308
[root@m01 scripts]# vim /usr/bin/mysql3307
mysql -uroot -p -S /data/3307/data/3307.sock
[root@m01 scripts]# chmod +x /usr/bin/mysql3307
Comments | NOTHING