一、下载安装

一、官方文档

1、文档地址:MySQL :: MySQL Documentation

可以对相应的命令、功能进行搜索

postgresql dba证书 mysql dba证书_慢查询


postgresql dba证书 mysql dba证书_postgresql dba证书_02


2、下载安装

MySQL :: MySQL Downloads

postgresql dba证书 mysql dba证书_html_03

进去开源版本的页面后:

postgresql dba证书 mysql dba证书_慢查询_04


postgresql dba证书 mysql dba证书_数据库_05

 GA版本一般指稳定版本,一般也是下载GA版本。dmr是开发版本,不稳定的。一般下载的平台版本是通用版本:

postgresql dba证书 mysql dba证书_慢查询_06

 这样依次下载5.6、5.7、8.0的tar包。企业版是会比社区开源版多一些功能特性的。


二、安装mysql5.7

1、使用scp将tar包上传到linux服务器:
例如:scp D:/abc.txt root@47.100.34.95:/root/   (window传到linux需要用绝对路径,一般路径不要中文,加上-r表示上传文件夹)

2、下载依赖,解压mysql

yum install libaio

tar -zxvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /usr/local

cd /usr/local

创建软连接(类似于快捷方式)

ln -s mysql-5.7.18-linux-glibc2.5-x86_64 mysql

3、卸载自带的mariadb、查看之前是否有mysql用户、是否安装过mysql等

# 查看系统自带的Mariadb [root@CDH-141 ~]# rpm -qa|grep mariadb mariadb-libs-5.5.44-2.el7.centos.x86_64 # 卸载系统自带的Mariadb [root@CDH-141 ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7.centos.x86_64

# 检查mysql是否存在 [root@CDH-141 ~]# rpm -qa | grep mysql

# 检查mysql组和用户是否存在,如无则创建 [root@CDH-141 ~]# cat /etc/group | grep mysql [root@CDH-141 ~]# cat /etc/passwd | grep mysql

4、创建mysql组和mysql用户

为centos添加mysql用户组和mysql用户(-s /bin/false参数指定mysql用户仅拥有所有权,而没有登录权限):

groupadd mysql useradd -r -g mysql -s /bin/false mysql

5、修改当前目录拥有者为新建的mysql用户,命令如下:

cd /usr/local/mysql

chown -R mysql:mysql ./

6、

安装初始化mysql,命令如下:

./bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize

安装完成,出现如下信息,将随机生成的登录密码记录下来:

postgresql dba证书 mysql dba证书_postgresql dba证书_07


7、

开启mysql服务,命令如下:

./support-files/mysql.server start

如果Starting MySQL... ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.localdomain.pid).  一般是端口占用:
ps -ef|grep mysqld
将占用进程kill掉即可。

8、将mysql进程放入系统进程中,命令如下:

cp support-files/mysql.server /etc/init.d/mysqld

.重新启动mysql服务,命令如下:

service mysqld restart

9.使用随机密码登录mysql数据库,命令如下:

mysql -u root -p

等待系统提示,输入随机密码(刚才记录的密码,忘了用cat /root/.mysql_secret 获取),即可登录。

10、重新设置密码

进入mysql操作行,为root用户设置新密码(小编设为rootroot):

alter user 'root'@'localhost' identified by 'rootroot';

11、设置远程连接

use mysql

update user set user.Host='%' where user.User='root';

刷新权限:

flush privileges;

12、设置mysql开机自启动。


13、设置mysql开机自启动

chkconfig --add mysqld
# 检查mysqld服务是否已经生效
chkconfig --list mysqld


14、可以完/etc下添加my.cnf配置文件,mysql开启时会默认去/etc/my.cnf 加载该配置文件

可以先加入一些简单的配置例如:(这里我修改client的内容可以生效,但是修改port端口不生效,也不知道怎么回事)

postgresql dba证书 mysql dba证书_mysql_08

[client]是mysql客户端执行的时候才会加载的选项组,如mysql命令,是mysql客户端的其中之一,我们在[client]中配置的变量值是mysql命令执行时候的相关命令选项的默认值。

 5.7及之后会默认生成随机密码。而且5.6和5.7的初始化方式命令不同。

Centos系统通过tar.gz包安装Mysql5.7 - 旧城孤音 - 博客园

linux mysql 5.7 离线安装(tar.gz)_臭小子的博客-CSDN博客_linux mysql5.7离线安装

Centos7环境下离线安装mysql 5.7 / mysql 8.0_Yore - Home-CSDN博客_离线安装mysql5.7

centos7下使用mysql离线安装包安装mysql5.7 - cctext - 博客园

二、简单介绍

1、mysql

使用navicat连接mysql后

show databases;  用来查看mysql有几个数据库的

postgresql dba证书 mysql dba证书_html_09

 use mysq; 进入mysql这个数据库

show tables;查看mysql这个数据库的表

2、多个配置文件的替换原则

查看mysql去哪些路径加载配置文件:mysql --help --verbose | grep my.cnf

postgresql dba证书 mysql dba证书_mysql_10

也就是说mysql可以去加载多个目录下的配置文件。依次读取,如果多个配置文件中有通用的配置,此时就以最后一个的为准(参数替换原则,后面的替换掉前面的)。

 之前说过我在my.cnf中配置了port端口,却不起作用,就是因为我在其他路径下也配置了一个my.cnf文件,所以导致前面配置的没生效。后面我删除了其中的一个配置文件(~./my.cnf),则/etc/my.cnf配置生效了。

3、查看mysql配置的参数


 show variables like 'port';  进行模糊查询 (可以用%进行通配符配置(代表一个或多个字符),例如pro%)

postgresql dba证书 mysql dba证书_mysql_11

这个查出来的参数是会话级别的(session)。

如果要查询全局的,可以加上一个global参数,即show global variables like 'port';

在一个会话中设置全局参数,之后创建的会话才能生效,之前的会话是不会生效的。

设置参数,可以使用set直接赋值,例如set long_query_time = 9。要设置全局则只需加上global,即set global long_query_time =10.

不过有些参数会话或者mysql开启后就不能修改动态修改——只读参数。

除了可以用上面的命令查看参数,在5.7后,可以在performance_schema数据库中找到global_variables和session_variables这两种张表查看相应的参数信息(例如session_variables表中会存在各个线程id对应的参数信息)。

可以使用show processlist;来查看各个线程的操作等信息:

postgresql dba证书 mysql dba证书_mysql_12


4、mysql的用户权限管理

通过用户名+ip+密码验证,拿到信息后去mysq.user表中验证是否用户合法通过,再去mysql.db表中查看库权限,去mysql.table_priv表中查看表权限,去mysql.column_priv表中查看列权限。(如果手动去修改这些元数据表,需要在修改后只需flush privileges;进行刷新)

管理员用户对所有库有权限。

创建一个mysql的用户:create user  ‘user01’@‘%’  identified  by ‘123456’ ;

则表示创建了一个用户user01,密码为123456。%表示所有ip都可以访问(可以用网段例如192.168.211.%)。

 删除该用户:drop   ‘user01’@‘%’ ;

修改用户密码:alter  user  ‘user01’@‘%’  identified  by ‘111111’ ;

查看当前用户的权限:show grants; 查看其他用户:show grants for ‘user01’@‘%’;

授予用户权限:例如:grant select,update,delete,insert on {作用域} to ‘user01’@‘%’ ; 作用域可以为空(也可以用其他,例如*.*表示全局,例如mysql.*则对mysql库的所有表都有权限)。

添加用户权限还是用上面的grant用法。删除权限将grant改为revoke即可。然后to改为from即可:revoke select,update,delete,insert on {作用域} from  ‘user01’@‘%’ ;

(如果权限回收的是all,则是回收全部权限)

如果不仅给一个用户授予权限,这个用户还可以把这些权限授予给其他拥有(可以进行权限授予),则需要加上with grant option

grant select,update,delete,insert on {作用域} to ‘user01’@‘%’  with grant option ;(这样user01就可以给其他用户授权)

在mysql.user表中,在5.7中密码对应表中的authentication_string字段,该字段是通过mysql的password()函数得到的。(select password(”123456“)即可得到相应的密文。不可逆)

grant不仅可以对用户权限做限制,还可以对用户资源做限制(例如该用户每小时更新次数、最大的用户连接数、每小时查询次数、每小时连接最大次数等,不设置则对这些资源都不做限制)

mysql8.0之后有角色的权限

三、ssl加密连接

连接mysql实例的两种方式:

1、通过本地Socket进行连接:mysql  -S  /tmp/mysql.sock  -u  root  -p   (通过本地和mysql连接,同一台服务器)

socket在linux中就是一个文件的形式存在,该socket文件默认就是/tmp/mysql.sock,client和server通信就是通过这个文件。

2、通过TCP/IP协议远程连接:mysql  -h192.168.211.10 -P3306 -uroot -p(可以远程和mysql连接,不同服务器)

postgresql dba证书 mysql dba证书_mysql_13

而TCP/IP还有一种连接方式就是通过SSL连接方式(安全的加密连接方式)

如果TCP/IP方式传输的是明文,可能信息会在传输过程被盗取、劫持等。而ssl协议可以对信息进行加密(例如http--https就是在http基础上用来ssl加密方式)。

其实按照官网安装mysql,是默认会开启ssl连接方式。

postgresql dba证书 mysql dba证书_postgresql dba证书_14

 如果安装过程没有执行,则可以通过下面方法开启。

mysql启动时会默认去查找mysql的公密钥文件是否存在,如果不存在就会在日志中打印一个警告:

[Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key

此时我们可以自己去生成一个公密钥文件出来:此时只要执行 mysql_ssl_rsa_setup 命令,就会生成相应的文件。

这时候去存放data的目录查看就会新生成一些.pem的公密钥文件。

postgresql dba证书 mysql dba证书_慢查询_15

 然后将这些文件的权限设置为mysql用户:chown mysql:mysql  *.pem    (之前在my.cnf配置文件中配置了启动用户为mysql)

postgresql dba证书 mysql dba证书_数据库_16

 此时重启,show variables like '%ssl%'    则会发现已经开启了ssl连接

postgresql dba证书 mysql dba证书_mysql_17

         如果本地连接使用socket方式进行连接,是用不到ssl连接的。如果用TCP/IP且mysql开启了ssl,则远程连接mysql自己会启用ssl进行加密连接。(如果ssl启动了,5.7是模式会使用该ssl进行加密连接,5.6不会)(加上ssl可能性能有一些性能消耗,如果是内网部署且数据不是非常机密之类的,可以不开启ssl)

可以在连接的时候加上 --ssl-mode=DISABLED  指明不使用ssl。或者给某个用户设置权限用不用ssl。

ssl连接还有一种连接方式就是X509:即client要提供mysql服务器上的客户端的密钥文件(CA、CERT、Key文件)。

postgresql dba证书 mysql dba证书_mysql_18

507可以连接时指定或者用户权限指定。 

四、密码插件

 该插件会强制要求用户密码符合某种程度的规范。

postgresql dba证书 mysql dba证书_html_19

 

postgresql dba证书 mysql dba证书_mysql_20

此时就可以查看密码插件对用户密码的限制:8位长度以上,大小写、字母数字等。

该密码插件还有更加细粒度的配置:例如不能是字典文件的关键字、可以只满足长度即可之类的配置。

五、多实例安装

 一台服务器上安装多个mysql实例(可以充分利用硬件资源)

通过mysqld_multi程序即可。

1、在my,cnf中加入配置内容:

postgresql dba证书 mysql dba证书_mysql_21

2、初始化该实例

 mysqld --initialize --datadir=/usr/local/mysql/data1

此时查看下是否初始化完成:

postgresql dba证书 mysql dba证书_html_22

 3、在my.cnf文件中加上mysqld_multi配置:

postgresql dba证书 mysql dba证书_postgresql dba证书_23

mysqld的配置是用哪个命令(mysql_safe)去启动mysql的。mysqladmin则指定哪个命令(mysqladmin)去关闭mysql。

 保存后输入mysqld_multi  report去读取配置文件

cd到bin目录下,执行./mysqld_multi  report

postgresql dba证书 mysql dba证书_postgresql dba证书_24

 此时可以检测出这个实例1是没有运行的。

此时我们启动这个实例1:   ./mysqld_multi start 1     (stop关闭)

postgresql dba证书 mysql dba证书_慢查询_25

此时就可以用随机密码去连接这个实例。 (可以去对应的data目录下的log文件中查看随机密码)

多个mysql实例时,有着继承替换原则,即后面的实例会继承前面实例的配置,如果有相同配置则执行替换原则。

如果要关闭这些实例,是需有用户名和密码的,则可以在配置文件中再加入用户名和密码的配置:

postgresql dba证书 mysql dba证书_html_26


注意:这里密码是用pass,而不是password。

六、mysql启动和关闭

1、启动

mysql的启动是去安装目录的/bin目录下找到mysqld的命令。

可以进去bin目录执行mysqld开启mysql。例如:mysqld  --defaults-file=/etc/my.cnf   (则可以按照my.cnf配置文件启动mysql)

mysqld  --defaults-file=/etc/my.cnf  &   表示后台启动。

也可以用service mysqld start进行启动。

bin目录下还有个mysql_safe,这个命令就是一个shell脚本,也可以用来进行mysql的启动。mysql_safe启动会有启动两个进程:一个mysql_safe、一个mysqld。mysql_safe是一个守护进程,可以对mysqld进行监控,如果msyqld进程挂了会对其进行重启之类操作。

2、关闭

bin目录下有mysqladmin命令进行mysql服务关闭,或者进入mysql后使用shutdown命令进行关闭。

而关闭mysql我们也可以用service mysqld  stop。(实际调用的是kill命令)


其实这些mysqld、mysql_safe实质都是一些脚本。可以自己打开看看大概是怎么实现的。

3、如果忘记密码怎么办?
可以在配置文件中的加入skip-grant-tables。这样就会在登录的时候不进行密码验证。

postgresql dba证书 mysql dba证书_mysql_27

 加了这个配置再进行修改密码时会报错。此时再去修改mysql的user表的数据:

postgresql dba证书 mysql dba证书_mysql_28

 修改完后注释掉之前配置文件的配置即可。

七、mysql的一些概念

1、数据库和数据库实例
数据库:物理的文件集合datadir(例如二进制文件、数据文件等等)

数据库实例:数据库后台进程/线程+共享内存区组成。(共享内存可以被运行后的进程/线程共享)

数据库实例才是用来操作数据库文件的。我们都是使用数据库实例通过sql语句去读取数据库(通过一些api接口去读取这些文件数据)(数据库文件)

mysql的数据库实例和数据库是一对一的关系,单进程多线程。(Oracle是一对多,多进程)

postgresql dba证书 mysql dba证书_慢查询_29

 一个mysql实例对应一个database(数据库),也对应一个schema(架构)。一个Schema/database对应多张表。

创建、删除一个数据库:create database/schema  test;  (可以使用database,也可以使用schema)  drop  database/schema  tets;


 数据库文件都存放在我们之前配置的datadir参数的目录下。一个数据库对应一个文件夹,每张表对应一组文件。例如我们查看下我们刚才建的数据库:

postgresql dba证书 mysql dba证书_html_30

此时可以看到这个数据库就对应一个目录。

 我们再在test数据库中创建一张表(5.7每张表对应三个文件,8.0每张表对应一个文件),例如mysql数据库下的tables_priv表则对应下面这三个文件。

postgresql dba证书 mysql dba证书_数据库_31


八、

1、错误日志

之前配置的log_error参数。

2、表结构定义文件

每个表对应一个表结构文件,该文件以.frm结尾,表结构文件都是二进制文件。(可以用mysqlfrm工具查看表结构文件信息)

mysqlfrm --diagnostic  user.frm (默认没有字符集的信息,要加一些参数调整)

或者show create  表名   来查看表定义信息。


3、慢查询日志(重要)

mysql会将运行超过某个时间阈值的sql语句记录到文件(mysql可以将慢查询记录到表中),该文件的默认名称:机器名-slow.log。

慢查询相关的参数:

postgresql dba证书 mysql dba证书_html_32

 例如查看慢查询日志默认地址:

postgresql dba证书 mysql dba证书_mysql_33

5.7 默认的慢查询是不开启的,可以在配置文件中加上slow_query_log 的配置(默认运行时间阈值10秒)

我们此时在配置文件中加入如下配置:

postgresql dba证书 mysql dba证书_html_34

这个慢查询文件是默认放在datadir的目录下的(即我们之前配的/usr/local/mysql/data目录下)

启动mysql,此时可以看到慢查询文件。 

postgresql dba证书 mysql dba证书_慢查询_35

 为了演示,我将mysql的时间阈值从10秒改为2秒。然后执行一个睡眠函数sleep(2).

postgresql dba证书 mysql dba证书_慢查询_36

 此时的慢查询日志就会记录该条语句,以及相应的执行时间、执行者等信息。(如果刚好是2秒,是不会记录进来的)

可以对这些慢查询参数进行动态配置:
例如:set global  long_query_time = 3; 之类的。

如果慢查询日志太大了怎么办??或者我该sql已经优化了要怎么对这些记录进行删除?
 1、先备份移动慢查询日志文件

mv  slow.log   slow.log.2021  (此时后面慢查询日志都写到了slow.log.2021,因为mv是剪切操作)

剪切后则没有了slow.log这个文件了

2、重新生成一个slow.log文件(注意我这里是先配置了慢查询日志文件为slow.log的)

flush slow logs;   此时就会再次生成一个slow.log文件,并且关闭之前的慢查询日志文件(即我们剪切过去的slow.log.2021文件)。之后的慢查询都会写到新生成的slow.log文件中。


min_examined_row_limit参数:例如我们配置这个参数为·100。现在有个查询语句耗时3秒,按道理是要记录进慢查询的,但是我们配置了这个参数,如果这个语句扫描的表行数不大于100行,则不会被记录到慢查询日志中。

log-queries-not-using-indexes:没用索引就会被记录。

log_timestamps:5,7版本配置了会写入时区信息(UTC时间,比中国上海时区相差8个小时).此时就可以配置为服务器的时间:

postgresql dba证书 mysql dba证书_html_37

 因为这个参数在5.7才有,所以我们可以把他配置成5.7版本就启动的配置:

postgresql dba证书 mysql dba证书_html_38

 log_output:该参数可以配置慢查询日志的输出

例如我现在set  global  log_output = 'table';   则会将慢查询的日志输出记录到表中。这张表就是mysql.slow_log。(记录到表开销大,对数据库做备份时数据太大浪费,但查询比较容易简单)

也可以设置的是文件,set global log_output = 'file' 。则会记录到文件,默认记录到文件(即我们直接配置的慢查询日志文件)。

当然也可以两者都记录:set global log_output = 'file,table';


4、通用日志:
记录数据库的所有操作。默认名:机器名.log  

我们可以将其改为general.log。在配置文件中配置general_log参数。

同样可以将其日志保存到表中(mysql.general_log表)

postgresql dba证书 mysql dba证书_postgresql dba证书_39

 此时重启mysql:service mysqld restart。则会创建通用日志文件

postgresql dba证书 mysql dba证书_数据库_40

 由于是将所有操作都记录,所以开启了的性能会明显下降。如果不是非必须场景一般不要开启。


 对于上面将的配置文件my.cnf、表结构定义文件.frm、错误文件error.log、慢查询文件slow.log、通用文件general.log。

一般启动或运行错误看错误文件,性能问题看慢查询文件,审计等场景看通用文件。


有一些情况下sql执行时间很长,但没有记录到慢查询日志中:
并发情况下,会话1对某个数据进行for update操作,然后会话2要对这个数据进行更新操作,但是此时该数据已经被会话1进行加锁了,所以会话2只能等待。等到会话2执行完成后,即使会话2的sql执行很长也不会记录到慢查询日志中。

postgresql dba证书 mysql dba证书_数据库_41

慢查询日志的记录中会有query_time和lock_time两个信息,分别代表整个过程的时间、过程中数据被加锁了等待时间。而慢查询时间阈值是根据两者之差去记录的。

所以并发下的锁等待时间是不计入慢查询时间阈值的。

九、存储引擎

这里将非innodb存储引擎的介绍。后面会对innodb进行专门的讲解。现在基本都是用innodb存储引擎。

存储引擎:用来处理数据库的相关crud操作。

一些存储引擎是不支持事务的(msyql中的innodb是支持事务的)

可以使用show engines;查看mysql中支持哪些存储引擎:

postgresql dba证书 mysql dba证书_postgresql dba证书_42

 一般只要innodb存储引擎,也是默认的存储引擎。

5.5之前默认的存储引擎:MyISAM(不支持事务、表锁、容易丢失数据、性能低,所以一般不要使用)

postgresql dba证书 mysql dba证书_html_43

 Memory存储引擎:纯内存,不支持事务、表锁。性能也是比较低,(其实innodb基本也是基于内存的)

postgresql dba证书 mysql dba证书_html_44

postgresql dba证书 mysql dba证书_html_45

 mysql的临时表操作就会用到该存储引擎。(注意:虽然说一般用innodb存储引擎,事实上就是以innodb为主体,一些操作如果其他存储引擎好mysql内部还是会用到其他的存储引擎的,例如这里的临时表操作mysql内部就会用到memory存储引擎,所以该引擎不能被禁用)

CSV存储引擎:

像之前的slow.log、general_log这些表的存储引擎就是用CSV。

postgresql dba证书 mysql dba证书_postgresql dba证书_46

即一种纯文本文件(csv文件用逗号分割)。 

Federated存储引擎:默认没开启。

postgresql dba证书 mysql dba证书_postgresql dba证书_47

 

postgresql dba证书 mysql dba证书_html_48

mysql8.0 将移除MyISAM