一.日志管理
(一)、六种日志
1、错误日志
记录的内容:
服务器启动和关闭过程中的信息
服务器运行中的错误信息
事务调度器运行一个事件时产生的信息
在从服务器上启动从服务器进程是产生的信息
错误日志文件名格式:主机名.err 默认位置存放于数据目录下
log_warnings 警告 值为1则将警告信息记录到错误日志中
log.err
2、二进制日志 *
记录任何引起或可能引起数据变化的操作,不会记录查询语句的,对于数据恢复有着至关重要的作用
二进制日志作用:即时点恢复、主从复制
二进制日志在5.5中默认开启的,5.6默认是关闭的。
日志文件名:mysql-bin.XXXXXX
mysql-bin.index 二进制文件的索引
二进制日志格式:
基于行:row
基于语句:statement
混合: mixed
二进制事件所记录的内容:
产生的时间 starttime、相对位置 position、语句或行等
mysql> SHOW BINARY LOGS; 查看有哪些二进制日志文件
mysql> SHOW MASTER STATUS; 当前正在使用的二进制日志文件
mysql> SHOW BINLOG EVENTS IN '二进制日志文件'; 查看指定二进制日志中记录的事件
mysql> PURGE BINARY LOGS TO '日志文件'; 删除指定二进制日志文件前的二进制日志文件
二进制日志滚动
1)重启服务
2)flush logs;
mysql> FLUSH LOGS; 二进制日志滚动 将当前的日志中断并产生一个新的日志文件
binlog_format 二进制日志的格式
log-bin={YES|NO}
是否启用二进制日志,如果为mysqld设定了--log-bin选项,则其值为ON,否则则为OFF。其仅用于显示是否启用了二进制日志,并不反应log-bin的设定值。作用范围为全局级别,属非动态变量。
sql_log_bin={ON|OFF}
用于控制二进制日志信息是否记录进日志文件。默认为ON,表示启用记录功能。用户可以在会话级别修改此变量的值,但其必须具有SUPER权限。作用范围为全局和会话级别,属动态变量。
sync_binlog=#
设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次。当autocommit的值为1时,每条语句的执行都会引起二进制日志同步,否则,每个事务的提交会引起二进制日志同步。
max_binlog_size 二进制日志文件最大值
max_binlog_cache_size 二进制日志缓存的大小
expire_logs_days 二进制日志文件过期的天数,0永远不过期
3、一般查询日志 :记录所有对数据库的请求信息(包括登录和查询等),默认不开启
日志量较大,占用磁盘空间
默认文件名:主机名.log 默认位置在数据目录
general_log 是否启用 默认关闭
general_log_file 一般查询日志存放的位置
log={OFF|ON} 是否启用记录所有语句的日志信息于一般查询日志中。5.6中已经弃用
log_output={FILE|TABLE|NONE} 将日志记录在表、文件或不记录
4、慢查询日志:记录的是查询时间超过指定时间的查询语句,一般用于优化查询。
默认也是不开启的。
long_query_time=#
设定区别慢查询与一般查询的语句执行时间长度。这里的语句执行时长为实际的执行时间,而非在CPU上的执行时长,因此,负载较重的服务器上更容易产生慢查询。其最小值为0,默认值为10,单位是秒钟。它也支持毫秒级的解析度。作用范围为全局或会话级别,可用于配置文件,属动态变量。
slow_query_log={OFF|ON} 是否启用慢查询日志
slow_query_log_file 慢查询日志所记录的文件
5、事务日志
是ACID(原子性、一致性、隔离性、持久性)的重要组件 将随机IO转换为顺序IO 需要存储引擎支持事务
innodb_flush_log_at_trx_commit:
0: 每秒同步,并执行磁盘flush操作;
1:每事务同步,并执行磁盘flush操作;
2: 每事务同步,但不执行磁盘flush操作;
innodb_log_buffer_size 缓存大小 默认10M
innodb_log_file_size 日志文件大小 默认5M
innodb_log_files_in_group 组中包含的日志文件个数
innodb_log_group_home_dir 日志组的位置
innodb_mirrored_log_groups 日志组的镜像
6、中继日志
应用于主从同步
(二)、开启各种日志,修改配置文件
1、开启通用查询日志,指定文件名
[root@mysql ~]# vim /etc/my.cnf
在mysqld段添加如下行:
log=general_select_log //等号的右边是日志文件的名字,自定义的
2、开启慢查询日志,指定文件名,设置超时时间
[root@mysql ~]# vim /etc/my.cnf
在mysqld段添加如下行:
log-slow-queries=slow_log //开启慢查询日志,规定文件名
long_query_time=5 //设置慢查询超时时间
3、错误日志,修改前缀名
[root@mysql ~]# vim /etc/my.cnf
在mysqld段添加如下行:
log-error=errorlog //错误日志文件名变为errorlog.err
4、开启二进制日志
在mysqld段添加如下行
log-bin=mysql-bin //5.5默认开启
[root@mysql ~]# /etc/init.d/mysqld restart
[root@mysql ~]# ls /data/mysql/slow_log
/data/mysql/slow_log
[root@mysql ~]# ls /data/mysql/general_select_log
/data/mysql/general_select_log
[root@mysql ~]# ls /data/mysql/errorlog.err
/data/mysql/errorlog.err
1)验证通用查询日志:
mysql> show databases;
mysql> select * from dept;
ERROR 1046 (3D000): No database selected
mysql> select * from up.dept;
[root@mysql ~]# cat /data/mysql/general_select_log
/usr/local/mysql5.5/bin/mysqld, Version: 5.5.11-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
150915 14:24:08 1 Connect root@localhost on
1 Query show databases
150915 14:25:57 1 Query select * from dept
150915 14:26:02 1 Query select * from up.dept
2)验证慢查询日志
mysql> select sleep(8);
+----------+
| sleep(8) |
+----------+
| 0 |
+----------+
1 row in set (8.00 sec)
[root@mysql ~]# cat /data/mysql/slow_log
/usr/local/mysql5.5/bin/mysqld, Version: 5.5.11-log (Source distribution). started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
# Time: 150915 14:28:35
# User@Host: root[root] @ localhost []
# Query_time: 8.001211 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1442298515;
select sleep(8);
(三)、二进制日志的查看 mysqlbinlog
[root@mysql ~]# cd /data/mysql/
[root@mysql mysql]# mysqlbinlog mysql-bin.000011
[root@mysql mysql]# mysqlbinlog mysql-bin.000011 | more //分页查看
# at 4 //事件发生的位置信息
#150914 16:30:27 //事件发生的时间信息
(四)、如何使用二进制日志进行数据恢复?
假设凌晨2点做一次完全备份,之后每小时做一次增量备份,比如数据库在早上9点半出现问题,恢复数据怎么办?
首先使用全备份恢复到凌晨2点;之后分别将3~9点的增量备份恢复,恢复到9点的状态;
剩余的半个小时,利用二进制日志进行恢复。
1、根据时间点进行数据恢复
mysql> use up;
mysql> insert into test values(1);
mysql> insert into test values(2);
mysql> insert into test values(3);
mysql> insert into test values(4);
mysql> delete from test where id>=3; //假装误删除
mysql> select * from test;
+------+
| id |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.00 sec)
[root@mysql mysql]# mysqlbinlog mysql-bin.000012 | less
#150915 15:00:09
#150915 15:01:05
[root@mysql mysql]# mysqlbinlog --start-datetime='2016-06-01 15:00:09' --stop-datetime='2016-06-01 15:01:05' mysql-bin.000012 //找到起始点和结束点
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#150915 14:21:19 server id 1 end_log_pos 107 Start: binlog v 4, server v 5.5.11-log created 150915 14:21:19 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
37j3VQ8BAAAAZwAAAGsAAAABAAQANS41LjExLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADfuPdVEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'/*!*/;
# at 554
#150915 15:00:09 server id 1 end_log_pos 620 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1442300409/*!*/;
SET @@session.pseudo_thread_id=1/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 620
#150915 15:00:09 server id 1 end_log_pos 707 Query thread_id=1 exec_time=0 error_code=0
use up/*!*/;
SET TIMESTAMP=1442300409/*!*/;
insert into test values(3)
/*!*/;
# at 707
#150915 15:00:09 server id 1 end_log_pos 734 Xid = 10
COMMIT/*!*/;
# at 734
#150915 15:00:12 server id 1 end_log_pos 800 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1442300412/*!*/;
BEGIN
/*!*/;
# at 800
#150915 15:00:12 server id 1 end_log_pos 887 Query thread_id=1 exec_time=0 error_code=0
SET TIMESTAMP=1442300412/*!*/;
insert into test values(4)
/*!*/;
# at 887
#150915 15:00:12 server id 1 end_log_pos 914 Xid = 11
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
[root@mysql mysql]# mysqlbinlog –start-datetime=’2016-06-01 15:00:09’ –stop-datetime=’2016-06-01 15:01:05’ mysql-bin.000012 | mysql -u root -p //恢复数据
Enter password:
2、根据位置点进行恢复
–start-position=4
–stop-position=107
[root@mysql mysql]# mysqlbinlog –start-position=620 –stop-position=914 mysql-bin.000012 | mysql -u root -p
(五)、对日志的管理
删除日志 不要轻易删除
1)删除某个日志之前的所有日志
mysql> purge master logs to ‘mysql-bin.000006’; //删除6以前的日志(不包含6)
2)删除多少天以前的日志文件
mysql> purge master logs before date_sub(current_date,interval 1 day); //删除一天以前的日志
3)重置二进制日志
mysql> reset master; //从000001开始重新计数
4)手动生成新的二进制日志文件
mysql> flush logs;
查看日志信息
mysql> show master logs; //显示二进制日志文件的名字和大小的
+——————+———–+
| Log_name | File_size |
+——————+———–+
| mysql-bin.000001 | 150 |
| mysql-bin.000002 | 107 |
+——————+———–+
2 rows in set (0.00 sec)
二.keepalived+mysql
环境描述:
OS:redhat6.5_X64
MASTER:192.168.0.202
BACKUP:192.168.0.203
VIP:192.168.0.204
1、配置两台Mysql主主同步
[root@master ~]# yum install mysql-server mysql -y
[root@master ~]# service mysqld start
[root@master ~]# mysqladmin -u root password 123.com
[root@master ~]# vi /etc/my.cnf #开启二进制日志,设置id
[mysqld]
server-id = 1 #backup这台设置2
log-bin = mysql-bin
binlog-ignore-db = mysql,information_schema #忽略写入binlog日志的库
auto-increment-increment = 2 #字段变化增量值
auto-increment-offset = 1 #初始字段ID为1
slave-skip-errors = all #忽略所有复制产生的错误
[root@master ~]# service mysqld restart
#先查看下log bin日志和pos值位置
mysql>show master status;
master配置如下:
[root@ master ~]# mysql -u root -p123.com
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.0.%' IDENTIFIED BY 'replication';
mysql> flush privileges;
mysql> change master to
-> master_host='192.168.0.203',
-> master_user='replication',
-> master_password='replication',
-> master_log_file='mysql-bin.000002',
-> master_log_pos=106; #对端状态显示的值
mysql> start slave; #启动同步
backup配置如下:
[root@backup ~]# mysql -u root -p123.com
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.0.%' IDENTIFIED BY 'replication';
mysql> flush privileges;
mysql> change master to
-> master_host='192.168.0.202',
-> master_user='replication',
-> master_password='replication',
-> master_log_file='mysql-bin.000002',
-> master_log_pos=106;
mysql> start slave;
mysql>show slave status\G;(查看同步状态)
建库、插入数据验证是否同步
2、配置keepalived实现热备
[root@backup ~]# yum install -y pcre-devel openssl-devel popt-devel #安装依赖包
[root@master ~]# wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
[root@master ~]# tar zxvf keepalived-1.2.7.tar.gz
[root@master ~]# cd keepalived-1.2.7
[root@master ~]# --prefix=/usr/local/keepalived
make && make install
yum groupinstall -y "Develepment Tools"
#将keepalived配置成系统服务
[root@master ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@master ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@master ~]# mkdir /etc/keepalived/
[root@master ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@master ~]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@master ~]# vi /etc/keepalived/keepalived.conf
! Configuration File forkeepalived
global_defs {
notification_email {
test@sina.com
}
notification_email_from admin@test.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MYSQL_HA #标识,双主相同
}
vrrp_instance VI_1 {
state BACKUP #两台都设置BACKUP
interface eth0
virtual_router_id 51 #主备相同
priority 100 #优先级,backup设置90
advert_int 1
nopreempt #不主动抢占资源,只在master这台优先级高的设置,backup不设置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.204
}
}
virtual_server 192.168.0.204 3306 {
delay_loop 2
#lb_algo rr #LVS算法,用不到,我们就关闭了
#lb_kind DR #LVS模式,如果不关闭,备用服务器不能通过VIP连接主MySQL
persistence_timeout 50 #同一IP的连接60秒内被分配到同一台真实服务器
protocol TCP
real_server 192.168.0.202 3306 { #检测本地mysql,backup也要写检测本地mysql
weight 3
notify_down /usr/local/keepalived/mysql.sh #当mysq服down时,执行此脚本,杀死keepalived实现切换
TCP_CHECK {
connect_timeout 3 #连接超时
nb_get_retry 3 #重试次数
delay_before_retry 3 #重试间隔时间
}
}
[root@master ~]# vi /usr/local/keepalived/mysql.sh
#!/bin/bash
pkill keepalived
[root@master ~]# chmod +x /usr/local/keepalived/mysql.sh
[root@master ~]# /etc/init.d/keepalived start
#backup服务器只修改priority为90、nopreempt不设置、real_server设置本地IP。
#授权两台Mysql服务器允许root远程登录,用于在其他服务器登陆测试!
mysql> grant all on *.* to'root'@'192.168.0.%' identified by '123.com';
mysql> flush privileges;
3、测试高可用性
1、通过Mysql客户端通过VIP连接,看是否连接成功。
2、停止master这台mysql服务,是否能正常切换过去,可通过ip addr命令来查看VIP在哪台服务器上