1、MySQL简介
前面已经介绍过,MySQL属于传统的关系型数据库产品,其开放式的架构使得用户的选择性很强,而且随着技术的逐渐成熟,MySQL支持的功能也越来越多,性能也在不断地提高,对平台的支持也在增多,此外,社区的开发与维护人数也很多。当下,MySQL因为其功能稳定、性能卓越,且在遵守GPL协议的前提下,可以免费使用与修改,因此深受用户喜爱。
我们知道,关系型数据库的特点是将数据保存在不同的表中,再将这些表放入不同的数据库中,而不是将所有的数据统一放在一个大仓库里,这样的设计加快了MySQL的读取速度,而且它的灵活性和可管理性也得到了很大的提高。访问及管理MySQL数据库的最常用标准化语言为SQL——结构化查询语言。SQL使得对数据库进行存储、更新和存取信息的操作变得更加容易。例如,你能用SQL为一个网站检索产品信息及存储用户信息、博文、帖子等,有关SQL的知识后文会详细讲解。
2、 MariaDB数据库的诞生背景介绍
自甲骨文公司收购MySQL之后,MySQL在商业数据库与开源数据库领域的市场占有份额都跃居第一,这样的格局引起了部分业内人士的担忧,因为商业数据库的老大有可能将MySQL闭源,为了避免Oracle将MySQL闭源,而无开源的类MySQL数据库可用,MySQL社区采用了分支的方式——MariaDB数据库就这样诞生了,MariaDB是一个向后兼容的数据库产品,可能会在以后替代MySQL,其官方地址为https://mariadb.org/。不过,这里还是建议大家选择更稳定且使用更广泛的MySQL数据库,可以先测试MariaDB数据库,等使用的人员多一些,社区更活跃后再正式考虑使用也不迟。
3、yum/rpm方式安装MySQL
MySQL官方网站及相关镜像网站提供了不同版本的RPM安装包,并且针对不同的硬件或操作系统平台,安装包的类型也会有区别。在使用时,可以到官方网站的下载页面进行选择,国内有一些互联网公司提供了镜像文件下载,比如搜狐、阿里云公司提供的镜像资源就非常不错。
下面是搜狐网提供的数据库软件镜像地址:http://mirrors.sohu.com/mysql,如果本书使用的版本不再发布,那么可以选择5.6的其他相关版本注意:yum/rpm安装方式适合所有MySQL软件产品。
1.rpm包方式安装MySQL
rpm包的安装方式非常简单,这里以el6平台下的MySQL 5.6.40版本为例,首先,要通过上述搜狐镜像地址下载到如下四个MySQL相关软件安装包。
MySQL-client-5.6.40-1.el6.x86_64.rpm
MySQL-devel-5.6.40-1.el6.x86_64.rpm
MySQL-server-5.6.40-1.el6.x86_64.rpm
MySQL-shared-5.6.40-1.el6.x86_64.rpm
一般来说,其中的MySQL-server-5.6.40-1.el6.x86_64.rpm和MySQL-client-5.6.40-1.el6.x86_64.rpm这两个软件包是必须要安装的,至于另外两个软件包,则可视实际需要进行安装,不过一般建议一起安装。
可以把这四个rpm包上传到服务器的目录中,然后执行如下rpm命令进行安装:
[root@oldboy tools]# rpm -qa|grep mysql #<==查找已经安装的mysql的包。
mysql-libs-5.1.73-7.el6.x86_64
rpm -e mysql-libs-5.1.73-7.el6.x86_64 --nodeps #<==卸载系统已经安装的mysql依赖包。
rpm -ivh MySQL-client-5.6.40-1.el6.x86_64.rpm
rpm -ivh MySQL-devel-5.6.40-1.el6.x86_64.rpm
rpm -ivh MySQL-shared-5.6.40-1.el6.x86_64.rpm
rpm -ivh MySQL-server-5.6.40-1.el6.x86_64.rpm
这里的el6表示适合操作系统的版本,还有el5、el7等。i686表示适合32位的系统,x86_64表示适合64位的系统。
执行上述命令即可完成MySQL软件的安装。
在采用rpm包安装方式时,必须要官方或第三方提供了现成的rpm软件包,否则是无法使用该方式安装的。另外,和直接采用yum的安装方式相比,rpm包的安装方式往往可以选择更新的版本,但是rpm包安装也有自身的问题,例如,无法满足定制化安装,比如,不能进行编译参数、路径等的更改。
4、yum方式安装MySQL
yum方式安装MySQL数据库时,只需要执行一个命令“yum install mysql-server-y”即可,yum方式的安装原理是在执行yum安装命令之后,其会自动从yum源地址下载相应名称的MySQL数据库rpm包,然后到系统上安装,并自动解决各种软件包之间的依赖问题。这是一个非常不错的安装软件的方式,不仅仅是针对MySQL,安装其他软件也是如此。
yum安装方式的最大优点就是超级简单,但是它也有自身的问题:例如它继承了rpm包的无法定制化安装的问题;另外一个缺点是采用默认的yum安装时,一般随yum源附带的软件版本都比较低,使用CentOS 6.9 Linux默认yum安装的MySQL版本仅为5.1.73。
yum install mysql-server mysql-devel mysql-libs -y
5、如何正确选择MySQL的安装方式
若是对数据库要求不太高的场景,则可以采用yum/rpm方式安装MySQL,例如,并发不大,只是在公司内部(wiki系统)、企业内部(Zabbix监控系统,OpenStack后台管理)等需要数据库的一些应用场景,当然,生产场景下也是可以选择yum或rpm方式进行安装的。
但是,有很多大型网站或门户网站,在安装MySQL时,往往会有各种定制化、初始化的需求,这时,要根据企业的需求先把源码包制作成rpm包,然后搭建自己的yum仓库,最终采用“yum install mysql-server-y”的方式进行安装,这样做的优点是既兼顾了yum/rpm安装方式简单的优点,又用到了源码包安装方式的可定制性,但是,使用这个方法需要一定的技术能力,此部分的内容建议参考如下博文。
6、启动与关闭MySQL
1、查看mysql服务的两种方式
[root@localhost bin]ps -ef|grep mysql
[root@localhost bin]netstat -nlp
2、启动服务的两种方式
命令行方式
[root@localhost bin]cd /usr/bin
[root@localhost bin]./mysqld_safe &
服务方式
[root@localhost ~]service mysql start 如果服务在启动状态,直接重启服务用以下命令:
[root@localhost ~]service mysql restart
3、关闭服务的两种方式
命令行方式:
[root@localhost ~]mysqladmin -u root shutdown
服务方式:
[root@localhost ~]service mysql stop
6、数据库练习
[root@localhost /]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.61-log MySQL Community Server (GPL)
Copyright © 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>
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| stumysql |
| stumysql1 |
| test |
±-------------------+
6 rows in set (0.00 sec)
mysql>
mysql> create database stumysql2;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mysql |
| performance_schema |
| stumysql |
| stumysql1 |
| stumysql2 |
| test |
±-------------------+
7 rows in set (0.00 sec)
mysql>
mysql> use stumysql2;
Database changed
mysql> create table student(
-> sid int primary key auto_increment,
-> snam varchar(30),
-> age int ,
-> rxrq date
-> );
Query OK, 0 rows affected (0.19 sec)
mysql> insert into student(snam,age,rxrq) values(‘lzy’,18,‘2017-09-01’);
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
±----±-----±-----±-----------+
| sid | snam | age | rxrq |
±----±-----±-----±-----------+
| 1 | lzy | 18 | 2017-09-01 |
±----±-----±-----±-----------+
1 row in set (0.00 sec)
mysql> insert into student(snam,age,rxrq) values(‘myq’,21,‘2017-09-01’),(‘lcb’,20,‘2017-09-01),(‘syc’,19,2017-09-01’);
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 ‘syc’,19,2017-09-01’)’ at line 1
mysql> insert into student(snam,age,rxrq) values(‘myq’,21,‘2017-09-01’),(‘lcb’,20,‘2017-09-01’),(‘syc’,19,2017-09-01’);
'> ;
'> insert into student(snam,age,rxrq) values(‘myq’,21,‘2017-09-01’),(‘lcb’,20,‘2017-09-01’),(‘syc’,19,‘2017-09-01’);
'>
'> ;
'> Ctrl-C – exit!
Aborted
[root@localhost /]# mysql
ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO)
[root@localhost /]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.61-log MySQL Community Server (GPL)
Copyright © 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>
mysql> use stumysql2;
Database changed
mysql> select * from student;
±----±-----±-----±-----------+
| sid | snam | age | rxrq |
±----±-----±-----±-----------+
| 1 | lzy | 18 | 2017-09-01 |
±----±-----±-----±-----------+
1 row in set (0.00 sec)
mysql> insert into student(snam,age,rxrq) values(‘myq’,21,‘2017-09-01’),(‘lcb’,20,‘2017-09-01’),(‘syc’,19,‘2017-09-01’);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
±----±-----±-----±-----------+
| sid | snam | age | rxrq |
±----±-----±-----±-----------+
| 1 | lzy | 18 | 2017-09-01 |
| 2 | myq | 21 | 2017-09-01 |
| 3 | lcb | 20 | 2017-09-01 |
| 4 | syc | 19 | 2017-09-01 |
±----±-----±-----±-----------+
4 rows in set (0.00 sec)
mysql> update student set age=20 where snam=‘myq’
-> ;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from student;
±----±-----±-----±-----------+
| sid | snam | age | rxrq |
±----±-----±-----±-----------+
| 1 | lzy | 18 | 2017-09-01 |
| 2 | myq | 20 | 2017-09-01 |
| 3 | lcb | 20 | 2017-09-01 |
| 4 | syc | 19 | 2017-09-01 |
±----±-----±-----±-----------+
4 rows in set (0.00 sec)
mysql> delete from student where sid=4;
Query OK, 1 row affected (0.00 sec)
mysql> select * from student;
±----±-----±-----±-----------+
| sid | snam | age | rxrq |
±----±-----±-----±-----------+
| 1 | lzy | 18 | 2017-09-01 |
| 2 | myq | 20 | 2017-09-01 |
| 3 | lcb | 20 | 2017-09-01 |
±----±-----±-----±-----------+
3 rows in set (0.00 sec)
mysql>
mysql> create table dept(
-> did int primary key auto_increment,
-> dnam varchar(30),
-> dleader varchar(30)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> create table emp(
-> eid int primary key auto_increment,
-> enam varchar(20),
-> did int,
-> eage int,
-> gzsj date,
-> job varchar(30),
-> sar decimal(14,4)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> insert into dept(dnam, dleader) (‘xsb’,‘zy’),(‘cwb’,‘wxx’),(‘rsb’,‘gpw’);
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 ‘‘xsb’,‘zy’),(‘cwb’,‘wxx’),(‘rsb’,‘gpw’)’ at line 1
mysql> insert into dept(dnam, dleader) values(‘xsb’,‘zy’),(‘cwb’,‘wxx’),(‘rsb’,‘gpw’);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql>
mysql> insert into emp(enam,did,eage,gzsj,job,sar) values(‘qxt’,1,18,‘2018-07-01’,‘wu’,6500);
Query OK, 1 row affected (0.00 sec)
mysql> insert into emp(enam,did,eage,gzsj,job,sar) values(‘lsh’,2,19,‘2017-07-01’,‘wu’,6600);
Query OK, 1 row affected (0.00 sec)
mysql> insert into emp(enam,did,eage,gzsj,job,sar) values(‘cjw’,3,19,‘2017-07-01’,‘wu’,6800);
Query OK, 1 row affected (0.00 sec)
mysql> insert into emp(enam,did,eage,gzsj,job,sar) values(‘zsz’,1,19,‘2018-09-01’,‘wu’,6080);
Query OK, 1 row affected (0.00 sec)
mysql>
mysql> select * from dept;
±----±-----±--------+
| did | dnam | dleader |
±----±-----±--------+
| 1 | xsb | zy |
| 2 | cwb | wxx |
| 3 | rsb | gpw |
±----±-----±--------+
3 rows in set (0.00 sec)
mysql> select * from emp;
±----±-----±-----±-----±-----------±-----±----------+
| eid | enam | did | eage | gzsj | job | sar |
±----±-----±-----±-----±-----------±-----±----------+
| 1 | qxt | 1 | 18 | 2018-07-01 | wu | 6500.0000 |
| 2 | lsh | 2 | 19 | 2017-07-01 | wu | 6600.0000 |
| 3 | cjw | 3 | 19 | 2017-07-01 | wu | 6800.0000 |
| 4 | zsz | 1 | 19 | 2018-09-01 | wu | 6080.0000 |
±----±-----±-----±-----±-----------±-----±----------+
4 rows in set (0.00 sec)
mysql> Ctrl-C – exit!
Aborted
[root@localhost /]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.5.61-log MySQL Community Server (GPL)
Copyright © 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>
mysql> select * from dept;
ERROR 1046 (3D000): No database selected
mysql> use stumysql2;
Database changed
mysql>
mysql> #需要给表Department增加一列字段notes,长度为10的字符串,默认值为‘0’ , 请写出相关SQL语句
mysql> alter table dept add notes varchar(10) default ‘0’;
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from dept;
±----±-----±--------±------+
| did | dnam | dleader | notes |
±----±-----±--------±------+
| 1 | xsb | zy | 0 |
| 2 | cwb | wxx | 0 |
| 3 | rsb | gpw | 0 |
±----±-----±--------±------+
3 rows in set (0.00 sec)
mysql> #查找工资大于2000元的员工记录,并按员工号id升序排列
mysql> 答:
->
-> ;
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 ‘答:’ at line 1
mysql> select * from emp where sar>6100 order by eage asc;
±----±-----±-----±-----±-----------±-----±----------+
| eid | enam | did | eage | gzsj | job | sar |
±----±-----±-----±-----±-----------±-----±----------+
| 1 | qxt | 1 | 18 | 2018-07-01 | wu | 6500.0000 |
| 2 | lsh | 2 | 19 | 2017-07-01 | wu | 6600.0000 |
| 3 | cjw | 3 | 19 | 2017-07-01 | wu | 6800.0000 |
±----±-----±-----±-----±-----------±-----±----------+
3 rows in set (0.00 sec)
mysql> select * from emp where sar>6100 order by eage desc;
±----±-----±-----±-----±-----------±-----±----------+
| eid | enam | did | eage | gzsj | job | sar |
±----±-----±-----±-----±-----------±-----±----------+
| 2 | lsh | 2 | 19 | 2017-07-01 | wu | 6600.0000 |
| 3 | cjw | 3 | 19 | 2017-07-01 | wu | 6800.0000 |
| 1 | qxt | 1 | 18 | 2018-07-01 | wu | 6500.0000 |
±----±-----±-----±-----±-----------±-----±----------+
3 rows in set (0.00 sec)
mysql> select * from emp where sar>6100 order by eage desc,enam asc;
±----±-----±-----±-----±-----------±-----±----------+
| eid | enam | did | eage | gzsj | job | sar |
±----±-----±-----±-----±-----------±-----±----------+
| 3 | cjw | 3 | 19 | 2017-07-01 | wu | 6800.0000 |
| 2 | lsh | 2 | 19 | 2017-07-01 | wu | 6600.0000 |
| 1 | qxt | 1 | 18 | 2018-07-01 | wu | 6500.0000 |
±----±-----±-----±-----±-----------±-----±----------+
3 rows in set (0.00 sec)
mysql>
mysql> #查找工资大于2000元的员工所在部门、部门编号、部门经理、员工名称
mysql> select * from dept d,emp e where d.did=e.did;
±----±-----±--------±------±----±-----±-----±-----±-----------±-----±----------+
| did | dnam | dleader | notes | eid | enam | did | eage | gzsj | job | sar |
±----±-----±--------±------±----±-----±-----±-----±-----------±-----±----------+
| 1 | xsb | zy | 0 | 1 | qxt | 1 | 18 | 2018-07-01 | wu | 6500.0000 |
| 2 | cwb | wxx | 0 | 2 | lsh | 2 | 19 | 2017-07-01 | wu | 6600.0000 |
| 3 | rsb | gpw | 0 | 3 | cjw | 3 | 19 | 2017-07-01 | wu | 6800.0000 |
| 1 | xsb | zy | 0 | 4 | zsz | 1 | 19 | 2018-09-01 | wu | 6080.0000 |
±----±-----±--------±------±----±-----±-----±-----±-----------±-----±----------+
4 rows in set (0.00 sec)
mysql> select dnam,e.did,dleader,enam from dept d,emp e where d.did=e.did and sar>2000
-> ;
±-----±-----±--------±-----+
| dnam | did | dleader | enam |
±-----±-----±--------±-----+
| xsb | 1 | zy | qxt |
| cwb | 2 | wxx | lsh |
| rsb | 3 | gpw | cjw |
| xsb | 1 | zy | zsz |
±-----±-----±--------±-----+
4 rows in set (0.00 sec)
mysql>
mysql>
7、sql语句分类
8、MySQL数据库用户安全策略介绍
安装完MySQL数据库之后,默认的管理员root密码为空,这很不安全。因此需要为root用户设置一个密码。如下图查询之后为空。
1、为root用户设置密码
进入mysql数据库:use mysql;
更改root用户密码: update user set password=password(‘song123’) where user=root;
退出: exit;
注意:如上操作是不会生效的,再用“mysql -u root”登录的时候,依然是无密码状态,原因在于mysql服务为加速系统效率,会先将用户权限更新到内存中,除非使用实时生效命令会更次刷新内存权限数据。在mysql命令行中执行flush privileges,或重启服务,service mysqld restart
接下来无密码方式就不能登录,要采用以下方式登录
Mysql -u root -p 回车后,会提示输入密码,输入自己设置的密码就好
2、忘记密码如何处理
首先停止MySQL服务,示例如下: service mysql stop
然后,使用mysqld_safe附带的“–skip-grant-tables”(忽略授权登录验证)启动MySQL服务。示例如下:
mysqld_safe --skip-grant-tables --user=mysql >/dev/null 2>&1 &[1] 57303 #<==在启动时加–skip-grant-tables参数,表示忽略授权表验证。
ss -lnt|grep 330
LISTEN 0 80 :::3306 ::😗
现在,无须密码即可登录MySQL,然后修改新密码,示例如下:
这时,可以将root密码修改为新密码了,示例如下:
mysql> update mysql.user set password=PASSWORD(“oldboy123”) where user=“root” and host=“localhost”;
mysql> flush privileges; #<==刷新权限使得修改密码生效。
Query OK, 0 rows affected (0.01 sec)
然后重启服务 service mysql restart
9、数据库备份与恢复
对于绝大多数企业来讲,失去数据就相当于失去商机、失去产品、失去客户,甚至会造成公司倒闭,那么,在所有的数据中,最核心的数据又是哪些呢?这恐怕要属数据库中的数据了,当然,并不是说其他数据不重要,只是这一部分更具代表性。既然数据库中的数据地位这么高,那么数据库备份与恢复的重要性就不言而喻了。
1、mysql数据库备份
基本备份输入命令:
mysqldump -u root -p stumysql1>/home/bak/2019-04-11/stumysql1.sql
Enter password: song123
此时,已成功将数据库stumysql1备份到/home/bak/2015-9-10目录下的test.sql中.
加-B参数备份的实践:
下面以备份stumysql1库时加-B参数为例进行讲解。
备份命令如下
mysqldump -B -u root -p stumysql1 >/home/bak/2019-04-11/stumysql.sql
Enter password: song123
指定压缩命令gzip压缩备份stumysql1数据库,命令如下:
mysqldump -B -u root -p stumysql1|gzip>/home/mysql_bak_B.sql.gz
#<==注意压缩命令前要加管道。
2、mysql数据库恢复
使用mysql命令
mysql -u root -p test < /home/bak/2019-04-11/stumysql1.sql
Enter password:song123
使用source命令恢复数据库的说明
进入mysql数据库控制台后,切换到想恢复数据的数据库。
mysql>use 数据库
接着,使用source命令进行恢复,后面接.sql文件,即上文使用mysqldump备份的文件或者人工编辑的SQL语句文件:
mysql>source /home/stumysql.sql
这个stumysql.sql文件是系统的相对路径,默认是登录MySQL前的系统路径,也可以使用完整的路径。
解压压缩包
gzip -d /home/mysql_bak_B.sql.gz
再用以上方式还原即可
10、MySQL数据库日志知识与企业应用实践
为了帮助管理员快速发现数据库的相关运行信息,MySQL为用户提供了几种日志种类,具体见表
默认情况下,以上所有的日志都处于非激活状态(Linux环境)。当激活日志时,所有的日志都默认配置在数据文件的目录下。管理员也可以对上述日志进行轮询切割,实现该功能常见的命令是mysqladmin flush-logs、mysqldump的“-F”或“–master-data”参数等,下面就分别介绍这几种日志知识。
(1)错误日志的介绍与配置
1.错误日志的介绍
MySQL的错误日志用于记录MySQL服务进程mysqld在启动/关闭或运行过程中遇到的错误信息。
2.错误日志的记录配置
MySQL的错误日志通常由mysqld或mysqld_safe程序产生,前文已经讲解过MySQL的启动原理,因此,可利用如下方法配置记录MySQL错误日志。
方法1:在my.cnf配置文件中调整,注意,是在[mysqld_safe]或[mysqld]模块的下面进行配置。命令如下:
[mysqld]
log-error = /data/mysql/error.err
方法2:在启动MySQL服务的命令里加入记录错误日志的参数。
示例如下:
log-error=/data/mysql/error/error.err
查看到的最终结果为:
show variables like ‘log_error%’;
3.错误日志轮询
管理员可以使用命令轮询错误日志,例如可以按天轮询,具体方法如下:
[root@songls~]# cd /data/mysql/error/error.err #<==切换到日志目录下。
[root@songls mysql]# mv error.err error_$(date +%F).err #<==将错误日志按天
移动改名。
[root@songls data]# mysqladmin flush-logs #<==执行刷新日志命令。
[root@songls data]# ls -l error.err
-rw-rw----. 1 mysql mysql 0 Mar 19 19:34 oldboy.err #<==新的错误日志诞生了。
4.数据库故障排查案例分析
新手安装数据库时,遇到数据库无法启动时的排查方法具体如下。
1)先清空错误日志文件,然后重新启动MySQL服务,再查看日志文件报什么错误,并根据错误日志进行处理。
2)如果无法解决,则删除数据文件,重新初始化数据库。
假设在排查故障时,得到的错误日志提示为:
180321 17:36:26 InnoDB: Completed initialization of buffer pool
180321 17:36:26 InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
根据提示可知,该错误是权限问题导致的问题,可对数据目录递归执行权限,然后再重启数据库。命令如下:
[root@songls data]# chown -R mysql:mysql /data/mysql/error
(2)慢查询日志
1.慢查询日志介绍
简单地理解,慢查询日志(slow query log)就是记录执行时间超出指定值(long_query_time)或其他指定条件(例如,没有使用到索引,结果集大于1000行)的SQL语句。
2.慢查询日志相关参数说明
慢查询的参数,对于数据库SQL的优化非常重要,是SQL优化的前提,因此,这里以表的形式进行说明,具体见表
3.慢查询日志重要参数配置
企业中常见的配置慢查询的参数为:
slow-query-log = ON #<==慢查询开启开关
long_query_time = 2 #<==记录大于2秒的SQL语句。
log_queries_not_using_indexes = ON #<==没有使用到索引的SQL语句。
slow-query-log-file = /data/mysql/slow/slow.log #<==记录SQL语句的文件。
min_examined_row_limit = 800 #<==记录结果集大于800行的SQL语句。
可将上述参数配置到my.cnf里,配置完毕重启MySQL服务,并进行检查:
mysql> show variables like ‘slow_query%’;
±--------------------±----------------------------+
| Variable_name | Value |
±--------------------±----------------------------+
| slow_query_log | ON | #<==开关已打开。
| slow_query_log_file | /data/mysql/slow.log | #<==文件路径已生效。
±--------------------±----------------------------+
2 rows in set (0.00 sec)
mysql> show variables like ‘%long_query%’;
±----------------±---------+
| Variable_name | Value |
±----------------±---------+
| long_query_time | 2.000000 | #<==记录大于2秒的查询已生效。
±----------------±---------+
1 row in set (0.01 sec)
mysql> show variables like ‘%log_queries_not%’;
±------------------------------±------+
| Variable_name | Value |
±------------------------------±------+
| log_queries_not_using_indexes | ON | #<==记录没有使用索引的查询已生效。
±------------------------------±------+
1 row in set (0.00 sec)
mysql> show variables like ‘%min_examined_row_limit%’;
±-----------------------±------+
| Variable_name | Value |
±-----------------------±------+
| min_examined_row_limit | 800 | #<==记录查询结果集大于800行的SQL已生效。
±-----------------------±------+
1 row in set (0.00 sec)
到此,就已经设定好记录慢查询SQL语句的条件了,那么,对于每天所产生的大量慢查询,又该如何处理和分析呢?
4.慢查询日志的刷新方法
在工作中,可以利用定时任务按天对慢查询日志进行切割,然后再分析。
示例切割脚本如下:
[root@oldboy data]# mkdir /server/scripts/ -p
[root@oldboy data]# cat /server/scripts/cut_slow_log.sh
export PATH=/application/mysql/bin:/sbin:/bin:/usr/sbin:/usr/bin
cd /data/mysql/slow
mv slow.log slow.log.$(date +%F)
mysqladmin flush -log
将上述脚本放入定时任务,每天0点执行切割任务,配置结果如下:
[root@oldboy data]# tail -2 /var/spool/cron/root
#cut mysql slow log by oldboy at 20180324
00 00 * * * /bin/sh /server/scripts/cut_slow_log.sh >/dev/null 2>&1
5.使用工具分析慢查询日志案
实际工作中,慢查询的日志可能非常多,给运维人员的优化工作带来了一定的困难,MySQL官方提供了慢查询的分析工具mysqldumpslow,有兴趣的读者可以参考官方手册。
下面为大家介绍一款很不错的第三方分析工具mysqlsla(需要单独安装该工具)。
(1)安装mysqlsla
请提前下载好mysqlsla-2.03.tar.gz到指定目录下,然后执行如下命令安装:
yum install perl-devel perl-DBI perl-DBD-MySQL -y
rpm -qa perl-devel perl-DBI perl-DBD-MySQL
tar xf mysqlsla-2.03.tar.gz
cd mysqlsla-2.03
perl Makefile.PL
make
make install
(2)利用mysqlsla工具分析慢查询
mysqlsla命令的默认路径为:/usr/local/bin/mysqlsla。
简单语法如下:
mysqlsla -lt slow [SlowLogFilePath] > [ResultFilePath]
在实际工作中,通常使用脚本调用mysqlsla工具进行分析,然后每天早晨8点,把分析结果发给企业的核心人员(DBA、运维总监、CTO、研发总监、核心开发),最后由DBA配合核心开发共同优化这些棘手的SQL慢查询。
简单的案例脚本如下,注意切割日志和分析合并为一个脚本了:
[root@oldboy mysqlsla-2.03]# cat /server/scripts/slow_log_analyze.sh