sqlite数据库自动生成db-journal后缀文件的解决方法

本文解决了一个使用SQLite数据库时遇到的问题:新数据未正确写入数据库并导致数据丢失。通过升级jar驱动版本到sqlite-jdbc-3.7.2.jar或更高版本解决了该问题。

1、使用sqlite数据库时发现,目录中自动生成db-journal后缀文件,
   同时新数据没有写入db,重启软件后新数据就丢失了。

2、经排查是使用的jar驱动版本太旧了,需要将驱动包更新为sqlite-jdbc-3.7.2.jar及以上版本。

3、经过一段时间的验证,问题已解决。

🔄【第 1 轮】开始 | 2025-09-20 10:49:18 🔍 开始检查分播机 Line1 (192.168.110.56)... ✅ 分播机网络通畅 ✅ 分播机数据库文件正常: Z:\sorting.db 📥 正在复制数据库: Z:\sorting.db → C:\Users\D衛\AppData\Local\Temp\tmppmr5od89.db ⚠️ 缺失 文件: Z:\sorting ⚠️ 缺失 -wal 文件: Z:\sorting-wal ⚠️ 缺失 -journal 文件: Z:\sorting-journal ⚠️ 缺失 -shm 文件: Z:\sorting-shm [ERROR] 复制后的数据库无效: C:\Users\D衛\AppData\Local\Temp\tmppmr5od89.db 🗑️ 删除临时数据库: C:\Users\D衛\AppData\Local\Temp\tmppmr5od89.db [FAIL] 无法打开 SQLite 副本 🟡 192.168.110.56 同步失败,3秒后重试 (1/3) 🔍 开始检查分播机 Line1 (192.168.110.56)... ✅ 分播机网络通畅 ✅ 分播机数据库文件正常: Z:\sorting.db 📥 正在复制数据库: Z:\sorting.db → C:\Users\D衛\AppData\Local\Temp\tmpa074e733.db ⚠️ 缺失 文件: Z:\sorting ⚠️ 缺失 -wal 文件: Z:\sorting-wal ⚠️ 缺失 -journal 文件: Z:\sorting-journal ⚠️ 缺失 -shm 文件: Z:\sorting-shm [ERROR] 复制后的数据库无效: C:\Users\D衛\AppData\Local\Temp\tmpa074e733.db 🗑️ 删除临时数据库: C:\Users\D衛\AppData\Local\Temp\tmpa074e733.db [FAIL] 无法打开 SQLite 副本 🟡 192.168.110.56 同步失败,3秒后重试 (2/3) 🔍 开始检查分播机 Line1 (192.168.110.56)... ✅ 分播机网络通畅 ✅ 分播机数据库文件正常: Z:\sorting.db 📥 正在复制数据库: Z:\sorting.db → C:\Users\D衛\AppData\Local\Temp\tmpy96x15x0.db ⚠️ 缺失 文件: Z:\sorting ⚠️ 缺失 -wal 文件: Z:\sorting-wal ⚠️ 缺失 -journal 文件: Z:\sorting-journal ⚠️ 缺失 -shm 文件: Z:\sorting-shm [ERROR] 复制后的数据库无效: C:\Users\D衛\AppData\Local\Temp\tmpy96x15x0.db 🗑️ 删除临时数据库: C:\Users\D衛\AppData\Local\Temp\tmpy96x155x0.db [FAIL] 无法打开 SQLite 副本 🔴【严重】分播机 192.168.110.56 经多次重试仍失败! ⚠️ 部分失败 | 耗时: 6.15 秒
09-21
# utils.py import os import shutil import tempfile import sqlite3 from pathlib import Path from typing import Optional, Tuple def is_valid_sqlite_db(file_path: str) -> bool: """检查是否为有效的 SQLite 数据库文件""" try: with open(file_path, 'rb') as f: header = f.read(16) return header == b'SQLite format 3\x00' except Exception as e: print(f"[CHECK ERROR] 无法读取文件头 {file_path}: {e}") return False def is_file_accessible(path_str: str) -> bool: """检测共享路径上的数据库文件是否存在且可读""" try: db_path = Path(path_str) if not db_path.exists(): print(f"[PATH ERROR] 文件不存在: {db_path}") return False if not db_path.is_file(): print(f"[PATH ERROR] 路径不是文件: {db_path}") return False if db_path.stat().st_size == 0: print(f"[PATH ERROR] 文件大小为0字节: {db_path}") return False return True except Exception as e: print(f"[PATH ERROR] 访问路径异常 {path_str}: {e}") return False def connect_sqlite_remote_safely(db_path: str) -> Tuple[Optional[sqlite3.Connection], Optional[str]]: """ 安全复制远程 SQLite 到本地临时文件并连接(只读) 返回: (sqlite_conn, temp_db_path) """ temp_db = None try: with tempfile.NamedTemporaryFile(suffix='.db', delete=False, dir=None) as tmp: temp_db = tmp.name print(f"📥 正在复制数据库: {db_path} → {temp_db}") shutil.copy2(db_path, temp_db) if not is_valid_sqlite_db(temp_db): print(f"[ERROR] 复制后的数据库无效: {temp_db}") os.unlink(temp_db) return None, None conn = sqlite3.connect(f'file:{temp_db}?mode=ro', uri=True, timeout=10.0) conn.row_factory = sqlite3.Row print(f"✅ 成功加载数据库副本: {temp_db}") return conn, temp_db except Exception as e: print(f"[ERROR] 复制或连接失败 {db_path}: {e}") if temp_db and os.path.exists(temp_db): try: os.unlink(temp_db) print(f"🗑️ 清理失败的临时数据库: {temp_db}") except Exception as clean_e: print(f"[WARN] 删除临时文件失败 {temp_db}: {clean_e}") return None, None def close_sqlite_connection(conn: Optional[sqlite3.Connection], temp_db_path: Optional[str]): """安全关闭 SQLite 连接并删除临时文件""" if conn: try: conn.close() print("🔒 SQLite 连接已关闭") except Exception as e: print(f"[WARN] 关闭 SQLite 连接失败: {e}") if temp_db_path and os.path.exists(temp_db_path): try: # os.unlink(temp_db_path) print(f"🗑️ 已删除临时数据库: {temp_db_path}") except Exception as e: print(f"[WARN] 无法删除临时文件 {temp_db_path}: {e}") def check_sorter_online(ip: str, timeout: float = 2.0) -> bool: """使用 ping3 检查 IP 是否可达""" try: from ping3 import ping delay = ping(ip, timeout=timeout) return delay is not None except ImportError: print("[WARN] 未安装 ping3,跳过网络检测") return True # 如果没装 ping3,默认认为在线 except Exception: return False 复制过来的数据库用navicate无法打开
09-21
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值