卷号土起船呼势这个网站,名字听着像乱码,其实是我们内部一个跑了两年的库存管理后台。上周机房搬迁,数据库文件从老盘挪到了新盘,结果网站直接白屏,报错写着“unable to open database file”。折腾一上午才搞定,根子就在数据库根路径没改对。今天把过程捋一遍,你遇到类似情况能少走弯路。
先得找到网站连数据库的配置文件。这类后台一般不会把路径写死在代码里,但也不绝对。常见位置是网站根目录下的config文件夹,里面有个database.php或者db.php。打开一看,通常有个变量叫$db_path,或者DB_FILE,后面跟着一串绝对路径,比如/var/www/old_data/site.db。你要做的就是把这个路径改成新位置,比如/var/www/new_data/site.db。注意别改成相对路径,除非你清楚当前工作目录,否则容易出幺蛾子。我见过有人写成“./data/site.db”,结果网站从不同入口访问时工作目录变了,时好时坏。
改完配置文件,别急着刷新页面。先确认新路径下的数据库文件真的存在,而且权限对。Linux下网站进程通常以www-data或者nginx用户跑,你得保证这个用户能读写那个文件。简单做法:chown www-data:www-data /var/www/new_data/site.db,然后chmod 660。目录权限给755。如果权限不对,报错还是打不开。我那次就是只改了路径忘了改权限,白屏依旧,查了半小时日志才发现是Permission denied。
接着,如果网站有缓存机制,比如用了Redis或者文件缓存,得把缓存清掉。有些框架会把数据库路径缓存到内存里,你改了配置文件它也不认。清缓存的方法看具体框架,一般后台有按钮,或者删掉runtime/cache目录。没有缓存就跳过。卷号土起船呼势用的是ThinkPHP,我直接删了runtime下的cache和temp文件夹,重启php-fpm才生效。
还有一点,有些老代码里可能硬编码了路径。比如某个函数里直接写了''/var/www/old_data/site.db''。你光改配置文件没用。得全局搜一下旧路径字符串,用grep -r "old_data" /var/www/,把所有出现的地方都改掉。这个步骤最容易被忽略,但往往就是它导致问题。我那次就发现一个上传插件里写死了旧路径,改完才彻底正常。

如果你用的是MySQL而不是SQLite,那“根路径”通常指数据目录,比如/var/lib/mysql。改这个动静就大了。得先停MySQL服务,改my.cnf里的datadir,然后把整个数据目录mv到新位置,再改权限,最后启动。中间任何一步出错,数据库都可能起不来。所以除非必要,不建议随便改MySQL的数据目录。真要改,一定先做全量备份,mysqldump或者直接拷贝文件都行,但拷贝文件得停服务。我朋友之前改MySQL路径,忘了改AppArmor配置,结果服务死活起不来,又折腾半天。
改完所有东西,重启一下web服务,比如systemctl restart nginx或者apache2。然后打开网站,看看能不能正常登录、读写数据。如果还报错,看日志,通常/var/log/nginx/error.log或者网站自己的日志会告诉你具体哪一行出的问题。根据错误再调。卷号土起船呼势的日志在runtime/log下,我最后就是靠它定位到插件硬编码的。
最后提醒一句,改数据库根路径之前,不管多简单,先把原数据库文件复制一份到安全地方。万一改错了,还能退回去。我那次就是先cp了一份,后来发现新路径权限不对,直接换回旧的,网站马上恢复。折腾了半小时,其实就改了一个路径加一个权限。
说白了,核心就三件事:找配置文件改路径,确保文件权限,清缓存搜硬编码。听起来简单,但细节不少。尤其是那个硬编码,坑过很多人。你如果也遇到类似情况,按这个顺序来,基本能搞定。要是还不行,检查一下SELinux或者防火墙,有时候它们也会拦着数据库文件访问。别问我怎么知道的,说多了都是泪。