ubuntu重装后,把typecho制作的网站,重新拷贝到原先的目录,配置好后,为什么不能读取原先的sqlite3数据库,出现Database Query Error。

你在 Ubuntu 重装系统后,将 Typecho 网站文件(包括 SQLite 数据库)拷贝回原目录,配置好 Web 服务器和 PHP 后,访问网站却出现 “Database Query Error”,这通常是由 SQLite 数据库文件权限、路径或 PHP 扩展问题 导致的。以下是详细排查与解决方案:


🔍 常见原因及解决方法

✅ 1. SQLite 数据库文件权限不足(最常见!)

Typecho 需要 读写 SQLite 数据库文件(如 usr/db/typecho.db)。重装系统后,文件所有者可能不再是 Web 服务器用户(如 www-data)。

检查 & 修复:

# 假设你的网站根目录是 /var/www/html/typecho
cd /var/www/html/typecho

# 查看数据库文件权限
ls -l usr/db/typecho.db

正常应类似:

-rw-r--r-- 1 www-data www-data 123456 Jan 10 10:00 typecho.db

修复命令:

# 设置正确所有者(Ubuntu 中 Web 服务器用户通常是 www-data)
sudo chown -R www-data:www-data usr/
sudo chmod -R 755 usr/
sudo chmod 664 usr/db/typecho.db   # 确保可读写
💡 关键:Web 服务器进程(如 Nginx/Apache)必须对 .db 文件有 读写权限

✅ 2. PHP 的 SQLite 扩展未安装或未启用

重装系统后,PHP 可能缺少 sqlite3pdo_sqlite 扩展。

检查:

php -m | grep -i sqlite

应看到:

pdo_sqlite
sqlite3

安装(Ubuntu/Debian):

sudo apt update
sudo apt install php-sqlite3
sudo systemctl restart apache2    # 或 nginx + php-fpm

⚠️ 如果你用的是 PHP-FPM + Nginx,记得重启 php8.x-fpm

sudo systemctl restart php8.3-fpm   # 版本号根据实际情况调整

✅ 3. 数据库文件路径错误或损坏

  • 检查 config.inc.php 中的数据库路径是否正确。
  • 确认 .db 文件未损坏。

检查配置文件(config.inc.php):

// 应类似如下(注意路径是否绝对或相对正确)
$db = new Typecho_Db('Pdo_SQLite', 'typecho_');
$db->addServer(array (
  'file' => '/var/www/html/typecho/usr/db/typecho.db',  // 推荐用绝对路径
), Typecho_Db::READ | Typecho_Db::WRITE);
❌ 避免使用相对路径如 'file' => './usr/db/typecho.db',因为工作目录可能变化。

测试数据库是否可读:

# 切换到 Web 用户身份测试
sudo -u www-data sqlite3 /var/www/html/typecho/usr/db/typecho.db "SELECT * FROM typecho_options LIMIT 1;"

如果报错(如 “unable to open database file”),说明权限或路径有问题。


✅ 4. SELinux 或 AppArmor(Ubuntu 默认无 SELinux,但需注意 AppArmor)

Ubuntu 默认使用 AppArmor,但一般不会阻止 Web 访问本地文件。可暂时忽略,除非你手动启用了严格策略。


✅ 5. 文件系统挂载为只读?

极少数情况下,磁盘错误会导致挂载为只读。检查:

mount | grep " / "

如果看到 ro(read-only),需修复磁盘并重新挂载为 rw


🛠️ 快速诊断步骤

  1. 查看 Typecho 详细错误日志
    config.inc.php 中临时开启调试(不推荐生产环境):

    define('__TYPECHO_DEBUG__', true);

    刷新页面,看具体 SQL 错误。

  2. 手动测试 PHP 连接 SQLite
    创建一个测试脚本 test-sqlite.php

    <?php
    try {
        $db = new PDO('sqlite:/var/www/html/typecho/usr/db/typecho.db');
        echo "✅ 连接成功!\n";
        $stmt = $db->query("SELECT COUNT(*) FROM typecho_contents");
        echo "文章数: " . $stmt->fetchColumn();
    } catch (Exception $e) {
        echo "❌ 错误: " . $e->getMessage();
    }
    ?>

    用浏览器或 CLI 访问,看输出。

  3. 检查 Web 服务器错误日志

    # Apache
    sudo tail -f /var/log/apache2/error.log
    
    # Nginx + PHP-FPM
    sudo tail -f /var/log/nginx/error.log
    sudo tail -f /var/log/php8.3-fpm.log

✅ 最终建议操作流程

# 1. 确保扩展已安装
sudo apt install php-sqlite3 -y

# 2. 修复权限
sudo chown -R www-data:www-data /var/www/html/typecho/usr/
sudo chmod 664 /var/www/html/typecho/usr/db/typecho.db

# 3. 重启服务
sudo systemctl restart apache2      # 或 nginx + php-fpm

# 4. 测试
curl http://your-domain.com

总结

问题解决方案
权限不足chown www-data:www-data + chmod 664
PHP 扩展缺失安装 php-sqlite3
路径错误config.inc.php 中使用绝对路径
数据库损坏从备份恢复 .db 文件
💡 重要:SQLite 是文件型数据库,整个数据库就是一个 .db 文件,只要这个文件完好 + 权限正确 + PHP 支持,就能工作。

如果你贴出 config.inc.php 中数据库配置部分和 ls -l usr/db/ 的输出,我可以帮你更精准定位!
(qianwen)

标签: none