MySQL日志

一.日志管理

(一)、六种日志

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在哪台服务器上
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值