【MYSQL】手工日志清理

本文详细介绍了MySQL中binlog和relaylog的手工清理方法,包括查看当前binlog状态、清理指定日期前或日志前的日志,以及如何安全地清理relaylog并确保系统稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先可以设置日志的保留策略。
即通过参数  expire_logs_days = 10  进行设置(保留多少天)。
但手工清理是必需要了解的。

一、手工binlog清理

1.1 当前binlog查看

show binary logs;

1.2 清理

---清理指定日期之前的日志
purge master logs before '2018-10-01 00:00:00'
---清理指定日志以前的日志
purge master logs to 'mysql-bin.000005';

二、relay log清理

以下方法为安全的清理方法,但不总是生效。
若以下方法搞不定的话,只能手工rm删除了。
---检查relay log开关设置
show variable like 'relay_log_purge%'
---开启relay log 清理开关
set global relay_log_purge=1;
----清理relay log
----该命令并不很快生效,有时候需要多执行几次。
----若多次执行后,仍无法清除,则需要手工进行操作系统rm。
flush logs;
----清理完成后,将开关恢复原样
set global relay_log_purge=0;
<think>我们被要求将Python应用的日志存储到MySQL数据库。这通常意味着我们需要配置Python的logging模块,使其使用一个能够将日志记录写入MySQL数据库的处理器(Handler)。 步骤: 1. 确保有一个MySQL数据库,并创建用于存储日志的表。 2. 安装必要的Python库,例如`mysql-connector-python`或`pymysql`,以及`logging`。 3. 创建一个自定义的logging Handler,该Handler将日志记录写入MySQL数据库。 4. 配置logging模块,使用这个自定义Handler。 但是,我们也可以使用现成的第三方库,例如`mysql-logging`,但为了灵活性和学习,我们可以自己实现一个Handler。 参考引用[1]中提到了手工修改文件并重新安装,但这里我们不需要,因为我们将编写自己的代码。 参考引用[2]展示了日志的输出,但我们的需求是将日志存入MySQL。 参考引用[3]提到了一些调度库,但和日志记录无关。 因此,我们将按照以下步骤进行: 步骤1:创建数据库表 假设我们有一个MySQL数据库,并在其中创建一个表来存储日志。表结构可以如下: ```sql CREATE TABLE log ( id INT AUTO_INCREMENT PRIMARY KEY, created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, name VARCHAR(255) NOT NULL, # 记录logger的名称 levelno INT NOT NULL, # 日志级别的数值(如DEBUG=10, INFO=20, WARNING=30, ERROR=40, CRITICAL=50) levelname VARCHAR(50) NOT NULL, # 日志级别的名称 message TEXT NOT NULL, # 日志消息 pathname VARCHAR(255), # 产生日志的源文件路径 lineno INT, # 产生日志的行号 funcname VARCHAR(255), # 函数名 exc_info TEXT, # 异常信息(如果有) exc_text TEXT # 异常文本(如果有) ); ``` 步骤2:安装必要的库 使用pip安装`mysql-connector-python`(或者`pymysql`): ```bash pip install mysql-connector-python # 或者 # pip install pymysql ``` 步骤3:编写自定义Handler 我们将创建一个继承自`logging.Handler`的类,并重写`emit`方法,在该方法中执行插入数据库的操作。 步骤4:配置日志记录器 下面是一个使用`mysql-connector`的示例: ```python import logging import mysql.connector from mysql.connector import errorcode class MySQLHandler(logging.Handler): def __init__(self, host, user, password, database, table='log'): super().__init__() self.host = host self.user = user self.password = password self.database = database self.table = table self.connection = None self.cursor = None self.connect() def connect(self): try: self.connection = mysql.connector.connect( host=self.host, user=self.user, password=self.password, database=self.database ) self.cursor = self.connection.cursor() except mysql.connector.Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: print("Something is wrong with your user name or password") elif err.errno == errorcode.ER_BAD_DB_ERROR: print("Database does not exist") else: print(err) def emit(self, record): # 如果连接断开,尝试重连 if not self.connection.is_connected(): self.connect() # 如果重连失败,则放弃记录 if not self.connection.is_connected(): return # 构造插入语句 sql = f"""INSERT INTO {self.table} (name, levelno, levelname, message, pathname, lineno, funcname, exc_info, exc_text) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)""" # 获取日志记录中的异常信息 if record.exc_info: # 格式化异常信息 exc_info_text = self.formatException(record.exc_info) else: exc_info_text = None # 如果日志记录中包含异常文本,则使用它,否则使用空字符串 exc_text = record.exc_text if hasattr(record, 'exc_text') else None # 参数 args = ( record.name, record.levelno, record.levelname, record.getMessage(), record.pathname, record.lineno, record.funcName, exc_info_text, exc_text ) try: self.cursor.execute(sql, args) self.connection.commit() except (AttributeError, mysql.connector.OperationalError): # 如果出现连接问题,尝试重新连接 self.connect() # 再次尝试执行 try: self.cursor.execute(sql, args) self.connection.commit() except: self.handleError(record) except: self.handleError(record) def close(self): if self.cursor: self.cursor.close() if self.connection and self.connection.is_connected(): self.connection.close() super().close() ``` 步骤4:在应用程序中使用这个Handler ```python # 配置日志 logger = logging.getLogger('my_app') logger.setLevel(logging.DEBUG) # 创建MySQL Handler mysql_handler = MySQLHandler( host='localhost', user='your_username', password='your_password', database='your_database', table='log' # 默认表名为log,可以省略 ) mysql_handler.setLevel(logging.DEBUG) # 设置格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') mysql_handler.setFormatter(formatter) # 添加到logger logger.addHandler(mysql_handler) # 测试 logger.info('This is an info message.') try: 1/0 except Exception as e: logger.error('An error occurred', exc_info=True) ``` 注意事项: 1. 数据库连接可能会断开,我们在每次emit时检查连接,如果断开则尝试重连。 2. 异常处理:需要捕获数据库操作中可能出现的异常,并调用`handleError`方法(这是logging.Handler的方法,默认会打印到sys.stderr)。 3. 性能:将日志直接写入数据库可能会影响性能,特别是高并发时。可以考虑使用队列异步写入,或者使用缓冲,但这里为了简单,我们直接写入。 另外,也可以使用现有的库,比如`logging_mysql`(需要安装),但这里我们提供了自定义的方法。 如果不想自己写,可以使用`logging_mysql`库,安装和使用如下: 安装: ```bash pip install logging_mysql ``` 使用示例: ```python import logging from logging_mysql import handlers # 创建handler mysql_handler = handlers.MySQLHandler( host='localhost', user='your_user', password='your_password', database='your_database', table='log', port=3306 ) logger = logging.getLogger('mysql_logger') logger.setLevel(logging.DEBUG) logger.addHandler(mysql_handler) logger.info('Test message') ``` 但是,请注意,这个库可能不是官方维护的,因此自己实现可以更灵活地控制。 根据需求选择合适的方法。 相关问题: 1. 如何优化Python日志写入MySQL的性能? 2. 除了MySQL,Python logging模块还支持哪些数据库? 3. 如何实现日志的异步写入以避免阻塞主程序? 4. 如何防止日志记录过多导致数据库空间不足? 5. 如何备份和清理数据库中的日志?</think>### Python日志集成MySQL数据库设置 要将Python应用的日志存储到MySQL数据库,请按照以下步骤操作: #### 步骤1:创建MySQL日志表 首先在MySQL中创建存储日志的表: ```sql CREATE TABLE app_logs ( id INT AUTO_INCREMENT PRIMARY KEY, created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, logger VARCHAR(255) NOT NULL, level VARCHAR(20) NOT NULL, message TEXT NOT NULL, pathname VARCHAR(255), lineno INT, exc_info TEXT ); ``` #### 步骤2:安装必要库 ```bash pip install mysql-connector-python ``` #### 步骤3:配置自定义日志处理器 ```python import logging import mysql.connector from mysql.connector import Error class MySQLHandler(logging.Handler): def __init__(self, host, user, password, database): super().__init__() self.host = host self.user = user self.password = password self.database = database self.connection = None self.connect() def connect(self): try: self.connection = mysql.connector.connect( host=self.host, user=self.user, password=self.password, database=self.database ) except Error as e: print(f"数据库连接失败: {e}") def emit(self, record): if not self.connection or not self.connection.is_connected(): self.connect() try: cursor = self.connection.cursor() sql = """INSERT INTO app_logs (logger, level, message, pathname, lineno, exc_info) VALUES (%s, %s, %s, %s, %s, %s)""" # 提取异常信息 exc_info = record.exc_info exc_text = self.formatException(exc_info) if exc_info else None values = ( record.name, record.levelname, record.getMessage(), record.pathname, record.lineno, exc_text ) cursor.execute(sql, values) self.connection.commit() except Error as e: print(f"日志写入失败: {e}") finally: if cursor: cursor.close() ``` #### 步骤4:集成到Python应用 ```python import logging # 配置日志处理器 mysql_handler = MySQLHandler( host='localhost', user='your_username', password='your_password', database='your_database' ) mysql_handler.setLevel(logging.INFO) # 配置日志格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') mysql_handler.setFormatter(formatter) # 添加到根日志记录器 logger = logging.getLogger() logger.addHandler(mysql_handler) logger.setLevel(logging.INFO) # 测试日志 logger.info("应用启动") try: 1/0 except Exception: logger.error("除零错误", exc_info=True) ``` #### 关键配置说明: 1. **连接管理**:处理器自动处理数据库重连 2. **异常处理**:自动捕获并记录异常堆栈 3. **性能优化**:使用连接池可提升性能 4. **安全建议**: - 使用数据库只写账号 - 启用SSL连接(生产环境) - 添加日志轮转清理机制 #### 常见问题解决: - **连接失败**:检查MySQL权限和网络设置[^1] - **写入延迟**:使用`QueueHandler`实现异步写入 - **性能瓶颈**:添加缓冲机制或使用日志收集器如Fluentd #### 备选方案: 1. 使用现成库`logging_mysql`: ```bash pip install logging_mysql ``` 2. 通过Docker部署ELK栈收集日志 3. 使用云服务(AWS CloudWatch/Azure Monitor)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值