如何解决AWS EC2 Ubuntu实例中sqlite3无法打开数据库文件错误
解决AWS EC2 Ubuntu 20实例部署Telegram Utube机器人的sqlite3数据库报错问题
问题描述
在AWS EC2 Ubuntu 20实例部署Utube Telegram机器人,初始运行正常,随后出现报错:
sqlite3.OperationalError: unable to open database file
完整报错栈:
Traceback (most recent call last): File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main return _run_code(code, main_globals, None, File "/usr/lib/python3.10/runpy.py", line 86, in _run_code exec(code, run_globals) File "/home/ubuntu/project/Utube/bot/__main__.py", line 13, in <module> UtubeBot().run() File "/home/ubuntu/.local/lib/python3.10/site-packages/pyrogram/methods/utilities/run.py", line 61, in run self.start() File "/home/ubuntu/.local/lib/python3.10/site-packages/pyrogram/sync.py", line 56, in async_to_sync_wrap return loop.run_until_complete(coroutine) File "/usr/lib/python3.10/asyncio/base_events.py", line 646, in run_until_complete return future.result() File "/home/ubuntu/.local/lib/python3.10/site-packages/pyrogram/methods/utilities/start.py", line 53, in start is_authorized = await self.connect() File "/home/ubuntu/.local/lib/python3.10/site-packages/pyrogram/methods/auth/connect.py", line 39, in connect await self.load_session() File "/home/ubuntu/.local/lib/python3.10/site-packages/pyrogram/client.py", line 669, in load_session await self.storage.open() File "/home/ubuntu/.local/lib/python3.10/site-packages/pyrogram/storage/file_storage.py", line 107, in open self.conn = sqlite3.connect(str(path), timeout=1, check_same_thread=False) sqlite3.OperationalError: unable to open database file
当前配置:
SESSION_NAME = os.environ.get("lethargic", ":memory:")
此前在Replit平台修改session_name为name即可正常运行,但AWS免费层实例出现该错误。
解决方法
1. 排查环境变量取值
执行以下命令查看环境变量lethargic的实际值:
echo $lethargic
- 如果输出为空,说明环境变量未设置,机器人应使用
:memory:内存数据库,不会触发文件报错,这种情况需检查是否有其他代码覆盖了SESSION_NAME配置。 - 如果输出是一个路径/文件名,确认该路径是否存在、当前用户(ubuntu)是否有读写权限。
2. 修复路径权限与存在性
- 若环境变量指向的目录不存在,先创建目录:
mkdir -p /path/to/target/directory - 给ubuntu用户赋予目标目录的读写权限:
chown -R ubuntu:ubuntu /home/ubuntu/project/Utube/ # 或赋予目录通用读写权限 chmod -R 755 /home/ubuntu/project/Utube/
3. 修改SESSION_NAME为明确可写路径
直接指定项目目录下的会话文件路径,避免环境变量带来的不确定性:
SESSION_NAME = os.environ.get("lethargic", "/home/ubuntu/project/Utube/utube_session.session")
这样即使环境变量未设置,机器人也会使用项目目录下的可写文件存储会话。
4. 检查Pyrogram默认会话目录权限
Pyrogram默认将会话文件存在~/.pyrogram/目录下,若环境变量指向该目录下的文件,检查目录权限:
ls -ld ~/.pyrogram/
若权限不足,执行以下命令修复:
chown -R ubuntu:ubuntu ~/.pyrogram/
5. 临时测试内存数据库模式
注释环境变量配置,直接使用内存数据库验证是否为文件路径问题:
SESSION_NAME = ":memory:"
若此模式能正常运行,说明问题确实出在文件路径的权限或存在性上,回到前面步骤排查。
内容的提问来源于stack exchange,提问作者sleepypanda
相关产品推荐
相关产品推荐

