目录
数据库环境准备(所有机器,以node1为例)
一,下载glibc版本的Mysql
二,新建用户以安全方式运行进程
三,安装并初始化mysql
四,修改mysql提供主配置文件
五,为mysql提供sysv服务脚本
六、启动mysql
七、修改mysql的root密码
九,登录mysql数据库
MYSQL日志管理
一,数据库中数据丢失或被破坏可能原因
二,MySQL日志
1,MySQL日志--错误日志
2,MySQL日志--通用查询日志
3,MySQL日志--慢查询日志
4,MySQL日志--二进制日志
mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
下载完成后查看
[root@node1 ~]# ll
(1)创建系统组mysql,指定组id为306,-r:系统组
[root@node1 ~]# groupadd -r -g 306 mysql
(2)创建系统用户mysql,指定组id为306,组id为306
[root@node1 ~]# useradd -g 306 -r -u 306 mysql
(3)查看结果
[root@node1 ~]# id mysql
(1)把mysql包解压到/usr/lcoal/下面
[root@node1 ~]# tar xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
(2)切换到/usr/local目录下面为mysql包做个软链接名为mysql
[root@node1 ~]# cd /usr/local/
[root@node1 local]# ln -sv mysql-5.7.36-linux-glibc2.12-x86_64/ mysql
(3)修改所有有关mysql的权限
[root@node1 local]# chown -R mysql.mysql mysql/*
(4)初始化(指定用户为mysql,数据放在/usr/local/mysql/data)
[root@node1 local]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data
保存三台主机的临时密码
node1: root@localhost: &L1i+dYhLCKG
node2: root@localhost: kPfqwfbnN6/U
node3:root@localhost: akU08RdXZ0+9
(1)编辑配置文件/etc/my.cnf
[root@node1 local]# vim /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data 数据目录存放路径
socket=/tmp/mysql.sock 套接字存放路径
[mysqld_safe]
log-error=mysql.log 日志存放路径
pid-file=mysql.pid pid存放路径
(2)重启mysqld服务
[root@node1 local]# systemctl restart mysqld
[root@node1 local]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
添加为系统服务
[root@node1 local]# chkconfig --add mysqld
开机自启动
[root@node1 local]# chkconfig mysqld on
[root@node1 local]# systemctl start mysqld
查看是否启动成功
[root@node1 local]# systemctl status mysqld
(1)配置环境变量
[root@node1 local]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
(2)生效
[root@node1 local]# source /etc/profile.d/mysql.sh
八,修改数据库的登录密码
三台机器分别修改密码
语法:mysqladmin -uroot -p '旧密码' password '新密码'
node1主机
[root@node1 local]# mysqladmin -uroot -p'&L1i+dYhLCKG' password '123456'
node2主机
[root@node1 local]# mysqladmin -uroot -p'kPfqwfbnN6/U' password '123456'
node3主机
[root@node3 local]# mysqladmin -uroot -p'akU08RdXZ0+9' password '123456'
[root@node1 local]# mysql -uroot -p123456
(1)误删除数据库
(2)数据库工作时,意外断电或程序意外终止
(3)由于病毒造成的数据库损坏或丢失
(4)文件系统损坏后,系统进行自检操作
(5)升级数据库时,命令语句不严格
(6)设备故障等等
(7)自然灾害
(8)盗窃
日志类型
MySQL有几个不同的日志文件,可以帮助你找出mysqld内部发生的事情:
日志文件 |
记入文件中的信息类型 |
错误日志 |
记录启动、运行或停止时出现的问题。 |
查询日志 |
记录建立的客户端连接和执行的语句。 |
二进制日志 |
记录所有更改数据的语句。主要用于复制和即时点恢复。 |
慢日志 |
记录所有执行时间超过long_query_time秒的所有查询或不使用索引的查询。 |
事务日志 |
记录InnoDB等支持事务的存储引擎执行事务时产生的日志。 |
默认情况下,所有日志创建于mysqld数据目录中。通过刷新日志,你可以强制 mysqld来关闭和重新打开日志文件(或者在某些情况下切换到一个新的日志)。当你执行一个FLUSH LOGS语句或执行mysqladmin flush-logs或mysqladmin refresh时,出现日志刷新。如果你正使用MySQL复制功能,从复制服务器将维护更多日志文件,被称为接替日志。
错误日志主要记录如下几种日志:
服务器启动和关闭过程中的信息
服务器运行过程中的错误信息
事件调度器运行一个时间时产生的信息
在从服务器上启动从服务器进程是产生的信息
错误日志定义:
可以用--log-error[=file_name](在命令行中配置)选项来指定mysqld保存错误日志文件的位置。如果没有给定file_name值,mysqld使用错误日志名host_name.err 并在数据目录中写入日志文件。如果你执行FLUSH LOGS,错误日志用-old重新命名后缀并且mysqld创建一个新的空日志文件。(如果未给出--log-error选项,则不会重新命名)。
日志文件在/usr/local/mysql/data下面的/mysql.log
[root@node1 local]# ll /usr/local/mysql/data
可以登录到数据库中查询当前错误日志配置
mysql> show variables like '%log_error%';
查看警告日志配置
mysql> show variables like '%log_warnings%';
启动开关:general_log={ON|OFF}
日志文件变量:general_log_file[=/PATH/TO/file]
全局日志开关:log={ON|OFF} 该开关打开后,所有日志都会被启用
记录类型:log_output={TABLE|FILE|NONE}:
因此,要启用通用查询日志,需要至少配置general_log=ON,log_output={TABLE|FILE}。而general_log_file如果没有指定,默认名是host_name.log。
开启通用查询日志
(1)此时的general_log日志默认关闭
mysql> show variables like '%log';
(2)在配置文件/etc/my.cnf下永久开启通用查询日志
在[mysqld]下面进行下面两行配置
general_log=ON
general_log_file=node1.log
(3)重启配置文件
[root@node1 data]# systemctl restart mysqld
(4)此时查看通用日志,发现通用日志已经开启,保存的位置在/usr/local/mysql/data/node1.log
mysql> show variables like '%general_log%';
[root@node1 data]# pwd
[root@node1 data]# ll
(5)此时打开日志文件node1.log;会发现在数据库中执行的查询命令已经存储到此文件中
[root@node1 data]# more node1.log
MySQL如果启用了slow_query_log=ON选项,就会记录执行时间超过long_query_time的查询(初使表锁定的时间不算作执行时间)。日志记录文件为slow_query_log_file[=file_name],如果没有给出file_name值, 默认为主机名,后缀为-slow.log。如果给出了文件名,但不是绝对路径名,文件则写入数据目录。
默认与慢查询相关变量:
mysql> SHOW GLOBAL VARIABLES LIKE '%slow_query_log%';
默认没有启用慢查询,为了服务器调优,建议开启
开启方法:
SET GLOBAL slow_query_log=ON; 当前生效,永久有效配置文件中设置
使用mysqldumpslow命令获得日志中显示的查询摘要来处理慢查询日志
# mysqldumpslow slow.log
那么多久算是慢呢?
如果查询时长超过long_query_time的定义值(默认10秒),即为慢查询:
mysql> SHOW GLOBAL VARIABLES LIKE 'long_query_time';
可以看到慢日志默认关闭,且存储的日志路径如下所示:
mysql> show variables like '%slow%';
慢日志的查询的时间默认为10秒,可以修改
mysql> show variables like '%long%';
二进制日志启动开关:log-bin [= file_name]
在5.6及以上版本一定要手动指定。5.6以下版本默认file_name为$datadir/mysqld-binlog
查看二进制日志的工具为:mysqlbinlog
二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句
语句以“事件”的形式保存,它描述数据更改。二进制日志还包含关于每个更新数据库的语句的执行时间信息。它不包含没有修改任何数据的语句。
二进制日志的主要目的是在数据库存在故障时,恢复时能够最大可能地更新数据库(即时点恢复),因为二进制日志包含备份后进行的所有更新。二进制日志还用于在主复制服务器上记录所有将发送给从服务器的语句。
二进制日志是记录执行的语句还是执行后的结果数据呢?
第一种情况:假如一个表有10万行数据,而现在要执行一个如下语句将amount字段的值全部在原来的基础上增加1000:
UPDATE sales.january SET amount=amount+1000;
此时如果要记录执行后的结果数据的话,日志会非常大。
因此在这种情况下应记录执行语句。这种方式就是基于语句的二进制日志。
第二种情况:如果向某个字段插入的是当前的时间呢?如下:
INSERT INTO tb SET Birthdate=CURRENT_TIME();
此时就不能记录语句了,因为不同时间执行的结果是不一样的。这是应该记录这一行的值,这种就是基于行(row)的二进制日志。
在有些情况,可能会结合两种方式来记录,这种叫做混合方式的二进制日志。
二进制日志的管理
日志滚动
在my.cnf中设定max_binlog_size = 200M,表示限制二进制日志最大尺寸为200M,超过200M后进行滚动。MySQL的滚动方式与其他日志不太一样,滚动时会创建一个新的编号大1的日志用于记录最新的日志,而原日志名字不会被改变。
每次重启MySQL服务,日志都会自动滚动一次。
另外如果需要手动滚动,则使用命令 mysql> FLUSH LOGS;
日志查看
查看有哪些二进制日志文件:mysql> SHOW BINARY LOGS;
查看当前正在使用的是哪一个二进制日志文件:mysql> SHOW MASTER STATUS;
查看二进制日志内容:mysql> SHOW BINLOG EVENTS IN 'mysqld-binlog.000002';
##该语句还可以加上Position(位置),指定显示从哪个Position(位置)开始:
mysql> SHOW BINLOG EVENTS IN 'mysqld-binlog.000002' FROM 203;
使用命令mysqlbinlog查看二进制日志内容:mysqlbinlog [options] log-files
使用二进制日志还原数据:
使用mysqlbinlog读取需要的日志内容,使用标准输入重定向到一个sql文件,然后在mysql服务器上导入即可,如下:
[root@localhost mysql]# mysqlbinlog mysqld-binlog.000002 >/root/temp_date.sql
删除二进制日志文件:
二进制日志文件不能直接删除的,如果使用rm等命令直接删除日志文件,可能导致数据库的崩溃。
必须使用命令PURGE删除日志,语法如下:PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
开启二进制日志文件
(1)此时的二进制日志文件默认关闭,需要开启
mysql> show variables like '%log_bin%';
(2)在配置文件/etc/my.cnf中开启二进制日志文件
要配置server_id,每台主机都唯一
log_bin
server_id=1
(3)重启mysqld服务
[root@node1 data]# systemctl restart mysqld
(4)此时查看二进制日志文件,发现已经开启;默认的名字为node1-bin
mysql> show variables like '%log_bin%';
(5)我们也可以手动为二进制日志文件改名,存储位置/usr/local/mysql/data/mysql-bin
log_bin=mysql-bin
server_id=1
(6)重启服务
[root@node1 data]# systemctl restart mysqld
(7)此时查看二进制日志文件,发现已经改为自己配置的
mysql> show variables like '%log_bin%';
刷新日志或者重启mysql服务器时,二进制日志文件的编号就会增加
(1)刷新前的二进制日志文件为1-2
(2)刷新二进制日志文件
[root@node1 data]# mysqladmin -uroot -p123456 flush-log
(3)刷新后的二进制日志文件为1-3,编号增加了1 个
查看二进制日志文件:mysqlbinlog
[root@node1 data]# mysqlbinlog mysql-bin.000001
删除二进制日志文件
(1)查询有哪些二进制日志文件
mysql> show binary logs;
(2)删除二进制日志文件mysql-bin.000001;把2只前的删掉
mysql> purge binary logs to 'mysql-bin.000002';