自己习惯把数据库装在linux操作系统,以前还尝试自己编译,年纪大了越来越懒,往往一句apt install了事。但是这样安装的结果,会把数据库放在/var目录下,而我自己的习惯是只有/分区和/home分区,这样会导致/分区越来越大,而我一般只会给根分区留50G左右。这样明显不能满足数据库不断增长的需求,因此有必要研究一下如何迁移到/home分区(或者其他路径)的方法。
其实这事情也是很久以前就弄过,但一直偷懒没有记录。最近有个由头需要,所以整理一下放在这里作为笔记。本篇主要关注三种数据库,mysql,mongodb和redis。oracle安装的时候就可以选择目录,所以不需要。
先从安装开始,最简单的安装方法:
sudo apt-get install redis-server redis-tools
sudo apt-get install mongodb-server mongodb-clients
sudo apt-get install mysql-server mysql-client
其中前一个包是服务器,后一个包是客户端。安装之后这些数据库都是默认运行的,可用如下命令开启,停止,重启和查看状态。
service redis start/stop/restart/status
service mysql start/stop/restart/status
service mongodb start/stop/restart/status
也可通过如下命令查看所有服务的状态
service --status-all
修改数据库路径的方法基本都是停止数据库进程,修改配置文件数据存储路径的值,然后赋予相关用户(redis/mongodb/mysql)对应目录的读写权限,重启服务即可。
Redis
最简单的是redis,只需要修改配置文件/etc/redis/redis.conf,找到数据文件存储路径dir,修改其值后重启redis即可。
/etc/redis/redis.conf
# 将下面的值修改为需要的路径即可
dir /var/lib/redis
dbfilename dump.rdb
# 注释掉下面这行可以解除本机绑定,使得可以远程连接redis
bind 127.0.0.1
MongoDB
mongodb也类似,修改配置文件/etc/mongodb.conf,找到数据和日志路径项data和log,重启mongodb即可。
# 修改下面的值为需要的路径
dbpath=/expected/data/path
logpath=/expected/log/path
# 修改下面的值以实现远程连接
bind_ip= xxx.xxx.xxx.xxx
# 修改下面的值以更改默认端口
port = 27025
# 修改下面的值以实现无密码登录
#auth = true
noauth = true
默认情况下不需要密码即可登录,最好登陆后创建用如下命令创建数据库和用户,然后退出修改配置文件中auth=true,重启后用新建用户登录。
use hf # 新建数据库hf
db.addUser('zhang3','pass1') # 新建用户zhang3, 密码为pass1
db.system.users.find() # 查看系统当前的用户
use admin # 因为admin已经存在,所以只是进入admin数据库
db.addUser('li4', 'pass2') # 新建管理员li4,密码为pass2
MySQL
mysql要复杂一些,修改配置文件/etc/mysql/my.cnf
# 修改下面的数据目录
datadir = /expected/data/path
并且要把默认目录/var/lib/mysql目录下的所有文件复制到新的目录下
cp -R /var/lib/mysql/* /expected/data/path
注意上面这一步对于redis和mongodb都无所谓,如果不关心已有的数据(新安装),则会自动创建新的。但mysql似乎不行,需要手动复制过去。
之后修改新目录的权限
chown -R mysql:mysql /expected/data/path
这一步对于redis和mongodb也同样适用,否则会没有读写权限而访问失败。
接下来还需要修改/etc/apparmor.d/user.sbin.mysqld,找到下面两行进行修改。
# 找到下面两行
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
# 修改为
/expected/data/path/ r,
/expected/data/path/** rwk,
再修改/etc/apparmor.d/abstractions/mysql。
# 找到下面的行
/var/lib/mysql/mysql.sock rw,
# 修改为
/expected/data/path.sock rw,
之后执行如下指令
/etc/init.d/apparmor reload
service mysql start
为了能远程连接mysql,还需要修改/etc/mysql/my.cnf中的bind-address项为0.0.0.0或者直接将其注释掉,然后登录数据库并执行如下语句。
grant all privileges on *.* to 'username'@'%' identified by 'password';
flush privileges;
此处username和password即为远程登录的用户名和密码,'%'代表所有可能的ip地址。
最后,以上操作都是在10年前的服务器上记录的,现在最新的系统和数据库可能会有一些差异,但基本流程应该类似。另外现在流行在容器里安装数据库,只要设置好docker容器的位置,数据库的位置设不设置也无所谓了。