mysql 清理 reley_MySQL之日志管理

本文详细介绍了MySQL日志系统,包括事务日志(transactionlog)、错误日志(errorlog)、查询日志(querylog)、慢查询日志(slowquerylog)和二进制日志(binarylog)等,涉及各种日志的用途、配置参数以及优化建议。例如,事务日志用于保证数据一致性,错误日志记录运行时问题,慢查询日志则用于定位性能瓶颈。二进制日志对于数据复制和恢复至关重要。此外,还提到了日志清理和管理策略,如expire_logs_days和PURGE BINARY LOGS命令。

b7bb6b1c20d1e2785f7db8a9cd1b744e.png

日志

事务日志:transaction log

错误日志:error log

查询日志:query log

慢查询日志:slow query log

二进制日志:binary log

中继日志:reley log

命令日志:~/.mysql_history,记录各自终端输过的mysql命令

事务日志

事务日志:transaction log

事务型存储引擎自行管理和使用

redo log

undo log

Innodb事务日志相关配置:

show variables like '%innodb_log%';

innodb_log_file_size 5242880每个日志文件大小(建议按生产情况调大,如1G,否则执行大的事务可能会直接提交,无法回滚)

innodb_log_files_in_group 2日志组成员个数(建议按生产情况调多,如3个)

innodb_log_group_home_dir ./事务文件路径(建议事务日志跟数据存放在不同目录中)

中继日志:relay log

主从复制架构中,从服务器用于保存从主服务器的二进制日志中读取到的事件

optimize table tbl_name整理表,例如进行大量修改|删除操作后,表文件大小并不会减小,执行此命令后可减小

错误日志

错误日志

mysqld启动和关闭过程中输出的事件信息

mysqld运行中产生的错误信息

event scheduler运行一个event时产生的日志信息

在主从复制架构中的从服务器上启动从服务器线程时产生的信息

错误日志相关配置

SHOW GLOBAL VARIABLES LIKE 'log_error'

错误文件路径:

log_error=/PATH/TO/LOG_ERROR_FILE

是否记录警告信息至错误日志文件

log_warnings=1|0默认值1

通用日志

通用日志:记录查询操作

文件:file,默认值

表:table

通用日志相关设置

general_log=ON|OFF(通用日志,谁操作都记录,量会很大,不建议开启)

general_log_file=HOSTNAME.log

log_output=TABLE|FILE|NONE(日志记录在表里/文件里)

慢查询日志

慢查询日志:记录执行查询时长超出指定时长的操作

slow_query_log=ON|OFF开启或关闭慢查询

long_query_time=N慢查询的阀值,单位秒

slow_query_log_file=HOSTNAME-slow.log慢查询日志文件

log_slow_filter = admin,filesort,filesort_on_disk,full_join,

full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk

log_queries_not_using_indexes=ON不使用索引也没有达到慢查询阀值的语句是否记录日志,默认OFF,即不记录(可以开启,看哪些命令记录得多了可以优化,例如加上索引)

log_slow_rate_limit = 1多少次查询才记录,mariadb特有

log_slow_verbosity= Query_plan,explain记录内容

log_slow_queries = OFF同slow_query_log新版已废弃

例:

select sleep(1),name from students;每查一项休眠1秒

再show profile;查看命令各阶段执行的时间,需先set profiling=1,

二进制日志

记录导致数据改变或潜在导致数据改变的SQL语句

记录已提交的日志

不依赖于存储引擎类型

功能:通过“重放”日志文件中的事件来生成数据副本

注意:建议二进制日志和数据文件分开存放

二进制日志记录格式

二进制日志记录三种格式

基于“语句”记录:statement,记录语句,默认模式

基于“行”记录:row,记录数据,日志量较大(生产中强烈建议基于“行”记录)

混合模式:mixed,让系统自行判定该基于哪种方式进行

格式配置

show variables like '%binlog_format%';

二进制日志文件的构成

有两类文件

日志文件:mysql|mariadb-bin.文件名后缀,二进制格式

如:mysql-bin.000001

索引文件:mysql|mariadb-bin.index,文本格式

二进制日志相关的服务器变量:

sql_log_bin=ON|OFF:是否记录二进制日志,默认ON(此项可以动态更改,例如硬盘满了想临时不记录日志,可以临时关掉)

log_bin=/PATH/BIN_LOG_FILE:指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可(此项不支持动态更改,需写入配置文件中,需重启服务)

binlog_format=STATEMENT|ROW|MIXED:二进制日志记录的格式,默认STATEMENT(强烈建议改成ROW)

max_binlog_size=1073741824:单个二进制日志文件的最大体积,到达最大值会自动滚动,默认为1G

说明:文件达到上限时的大小未必为指定的精确值

sync_binlog=1|0:设定是否启动二进制日志即时同步磁盘功能,默认0,由操作系统负责同步日志到磁盘(即时的话效率低,好处是不会丢东西,一般情况0就行)

expire_logs_days=N:二进制日志可以自动删除的天数。 默认为0,即不自动删除(可留个30天)

二进制日志相关配置

查看mariadb自行管理使用中的二进制日志文件列表,及大小

SHOW {BINARY | MASTER} LOGS

查看使用中的二进制日志文件

SHOW MASTER STATUS

查看二进制文件中的指定内容

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]

show binlog events in ‘mysql-bin.000001' from 6516 limit 2,3

mysqlbinlog

mysqlbinlog:二进制日志的客户端命令工具

命令格式:

mysqlbinlog [OPTIONS] log_file…

--start-position=#指定开始位置

--stop-position=#

--start-datetime=

--stop-datetime=

时间格式:YYYY-MM-DD hh:mm:ss

--base64-output[=name]

示例:

mysqlbinlog --start-position=6787 --stop-position=7527 /var/lib/mysql/mariadb-bin.000003

mysqlbinlog --start-datetime="2018-01-30 20:30:10" --stop-datetime="2018-01-30 20:35:22" mariadb-bin.000003;

二进制日志事件的格式:

# at 328

#151105 16:31:40 server id 1 end_log_pos 431 Query thread_id=1 exec_time=0 error_code=0

use `mydb`/*!*/;

SET TIMESTAMP=1446712300/*!*/;

CREATE TABLE tb1 (id int, name char(30))

/*!*/;

事件发生的日期和时间:151105 16:31:40

事件发生的服务器标识:server id 1

事件的结束位置:end_log_pos 431

事件的类型:Query

事件发生时所在服务器执行此事件的线程的ID:thread_id=1

语句的时间戳与将其写入二进制文件中的时间差:exec_time=0

错误代码:error_code=0

事件内容:

GTID:Global Transaction ID,mysql5.6以mariadb10以上版本专属属性:GTID

清除指定二进制日志:

PURGE { BINARY | MASTER } LOGS

{ TO 'log_name' | BEFORE datetime_expr }

示例:

PURGE BINARY LOGS TO‘mariadb-bin.000003’;删除3前日志

PURGE BINARY LOGS BEFORE '2017-01-23';

PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';

删除所有二进制日志,index文件重新记数

RESET MASTER [TO #];日志文件从#开始记数,默认从1开始,一般是master第一次启动时执行,MariaDB10.1.6开始支持TO #

切换二进制日志文件:

FLUSH LOGS;

如何将以下两个程序结合起来 程序一: #include<reg52.h> sbit BEEP=P2^4; //定义蜂鸣器控制端P2.4 sbit L00=P0^0;//定义LED1灯 void Delayst(unsigned int i) //延时程序,i是形式参数,i为1时 延时约250us { unsigned int j; for(;i>0;i--) //变量i由实际参数传入一个值,因此i不能赋初值 for(j=0;j<31;j++) // 此数值为125时大约延时1ms 由此计算出为1时延时大约8us 31*8=248us≈250us {;} } void Delay(unsigned int i) //延时程序,i是形式参数,i为1时 延时约1ms { unsigned int j; for(;i>0;i--) //变量i由实际参数传入一个值,因此i不能赋初值 for(j=0;j<125;j++) {;} } void main() //主函数 { unsigned int j; while(1) //无限循环 一直执行以下程序 { L00=0; //点亮LED1灯 for(j=1000;j>0;j--) //蜂鸣器响大约500ms { BEEP = ~BEEP; Delayst(2); //延时500us 发出大约1KHz频率的响声 } L00=1; //熄灭LED1灯 BEEP=1; //蜂鸣器不响 Delay(500); //将实际参数500传递给形式参数i,延时500ms 也就是0.5S } } 程序2: #include<reg52.h> //包含单片机头文件 sbit Reley=P2^5; //定义继电器控制端P2.5 sbit L00=P0^0;//定义LED1灯 sbit SW18=P3^2; //定义SW18独立按键 sbit SW19=P3^3; //定义SW19独立按键 void Delay(unsigned int i) //延时程序,i是形式参数,i为1时 延时约1ms { unsigned int j; for(;i>0;i--) //变量i由实际参数传入一个值,因此i不能赋初值 for(j=0;j<125;j++) {;} } void main() //主函数 { while(1) //无限循环 一直执行以下程序 {
最新发布
04-22
<think>嗯,用户想合并两个基于reg52.h头文件的单片机C语言程序,让蜂鸣器、继电器和按键功能同时正常工作。首先,我得理清楚合并程序的基本步骤。可能需要先分析两个程序的结构,看看各自的初始化设置、函数定义和主循环结构。然后检查是否有冲突的引脚定义或资源占用,比如同一个IO口被不同功能重复使用,或者定时器配置不一致。 接下来,可能需要将两个程序的头文件合并,确保只包含一次reg52.h。然后统一引脚定义,避免重复或冲突。比如蜂鸣器和继电器可能使用不同的引脚,需要确认它们在两个程序中的定义是否一致,如果不一致就得调整。 然后是函数整合。两个程序可能都有延时函数,或者其他的功能函数,需要避免重复定义。比如Delay1ms函数可能有不同的实现,这时候需要选择其中一个或者调整参数。同时,中断服务函数如果有的话,也需要合并,确保中断向量不冲突。 主函数的结构也需要调整。原来的两个程序可能都是while(1)循环,合并后需要在一个主循环里处理所有功能,比如按键扫描、控制蜂鸣器和继电器。可能需要使用状态变量或者标志位来协调不同功能模块的执行顺序和条件。 另外,需要确保硬件资源如定时器、中断等配置正确。比如如果两个程序都用了同一个定时器,可能需要重新配置,或者分开使用不同的定时器。还要注意全局变量的使用,避免命名冲突。 可能遇到的问题包括引脚冲突导致功能异常,延时函数不准确影响时序,或者中断处理不当导致程序卡死。这时候需要通过仔细检查代码和硬件连接,逐步调试来解决。比如使用条件编译或者宏定义来切换不同的功能测试,逐步验证每个模块是否正常工作。 最后,测试整个程序,确保所有功能协同工作。按键按下时,蜂鸣器响的同时继电器动作,没有干扰或延迟。可能需要调整延时参数或优化代码结构,以提高响应速度和稳定性。</think>### 分步合并单片机程序的实现方法 #### 第一步:统一硬件资源定义 1. **引脚映射整合**:根据两个程序中的`sbit`定义,合并到同一头文件或主程序头部,避免重复定义。例如: ```c #include <reg52.h> sbit BEEP = P1^5; // 原程序1的蜂鸣器引脚 sbit RELAY = P2^3; // 原程序2的继电器引脚 sbit KEY = P3^2; // 新增按键引脚 ``` 2. **定时器配置冲突检查**:若两个程序都使用定时器中断,需统一配置方式。例如程序1使用定时器0,程序2使用定时器1: ```c void Timer_Init() { TMOD = 0x11; // 定时器0/1均工作在模式1 TH0 = 0xFC; TL0 = 0x18; // 1ms定时 TH1 = 0xA0; TL1 = 0x00; // 其他功能定时 ET0 = ET1 = 1; EA = 1; } ``` #### 第二步:功能模块化重构 1. **独立功能封装**:将蜂鸣器、继电器、按键功能拆分为独立函数 ```c void Beep_Control(uint duration) { BEEP = 0; delay(duration); BEEP = 1; } void Relay_Switch(bit state) { RELAY = state; // 0-吸合,1-释放 } bit Key_Scan() { return (KEY == 0); // 低电平有效 } ``` 2. **延时函数统一**:合并不同程序中的延时实现,采用精度更高的定时器延时 ```c volatile uint timer_count; // 全局计数变量 void Timer0_ISR() interrupt 1 { TH0 = 0xFC; TL0 = 0x18; timer_count--; } void delay_ms(uint ms) { timer_count = ms; TR0 = 1; while(timer_count); TR0 = 0; } ``` #### 第三步:主程序逻辑整合 ```c void main() { Timer_Init(); while(1) { if(Key_Scan()) { Relay_Switch(0); // 按键按下吸合继电器 Beep_Control(200); Relay_Switch(1); // 释放继电器 } // 可添加其他并行任务 } } ``` ### 关键问题解决方案 1. **I/O冲突处理**:使用万用表测量实际电路,确保P1.5、P2.3等引脚未连接其他外设 2. **中断优先级配置**:通过IP寄存器设置关键中断优先级 ```c PT0 = 1; // 提升定时器0中断优先级 ``` 3. **状态机设计**:对复杂交互采用状态机模式 ```c enum {IDLE, BEEPING, RELAY_ACTIVE} state; ``` ### 调试建议 1. 使用Keil的**逻辑分析仪**视图观察引脚波形 2. 通过串口打印调试信息: ```c void UART_Init() { SCON = 0x50; TMOD |= 0x20; TH1 = 0xFD; TR1 = 1; } void Send_Char(char c) { SBUF = c; while(!TI); TI = 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值