是否可以将默认的MySQL数据目录更改为其他路径?我是否能够从旧位置访问数据库?
是否可以将默认的MySQL数据目录更改为其他路径?我是否能够从旧位置访问数据库?
使用以下命令停止MySQL:
sudo /etc/init.d/mysql stop
使用以下命令复制现有数据目录(默认位于 /var/lib/mysql
):
sudo cp -R -p /var/lib/mysql /newpath
使用以下命令编辑MySQL配置文件:
sudo gedit /etc/mysql/my.cnf # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
找到datadir
的条目,将路径(应该是/var/lib/mysql
)更改为新的数据目录。
在终端中输入以下命令:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
查找以/var/lib/mysql
开头的行。在这些行中,将/var/lib/mysql
更改为新路径。
保存并关闭文件。
使用命令重新启动AppArmor配置文件:
sudo /etc/init.d/apparmor reload
使用以下命令重新启动MySQL:
sudo /etc/init.d/mysql restart
现在登录 MySQL,您可以访问之前拥有的同样的数据库。
alias /var/lib/mysql/ -> /newpath/,
。 - Michael快速简单的操作:
# Create new directory for MySQL data
mkdir /new/dir/for/mysql
# Set ownership of new directory to match existing one
chown --reference=/var/lib/mysql /new/dir/for/mysql
# Set permissions on new directory to match existing one
chmod --reference=/var/lib/mysql /new/dir/for/mysql
# Stop MySQL before copying over files
service mysql stop
# Copy all files in default directory, to new one, retaining perms (-p)
cp -rp /var/lib/mysql/* /new/dir/for/mysql/
编辑/etc/my.cnf
文件,在 [mysqld]
下面添加这一行:
datadir=/new/dir/for/mysql/
如果您正在使用CageFS(无论是否使用CloudLinux)并且想要更改MySQL目录,则必须将新目录添加到此文件中:
/etc/cagefs/cagefs.mp
然后运行这个命令:
cagefsctl --remount-all
/etc/mysql/mysql.conf.d/mysqld.cnf
。 - Edenshaw你需要将当前数据复制到新目录,并更改 MySQL 的 my.cnf
。
[mysqld]
datadir=/your/new/dir/
tmpdir=/your/new/temp/
在服务器未运行的情况下,你必须复制数据库。
ln -s
静态符号链接,那么这不会使它变得更好吗? - RageZmy.cnf
。 - RageZ如果您是Windows用户,来到这里寻找解决方案却发现所有答案都是针对Linux用户的,请不要失望!我不会让你像我一样浪费时间。
解决方案之前先废话几句:
MySQL使用一个数据目录来存储您创建的不同数据库的数据。最终,它必须以文件的形式存储它们,并添加一些应用程序和文件格式上的操作,以确保您在数据库课程中所学的数据库承诺得以保持完整。
现在,您想确保有足够的空间来存储您将来可能创建的大型数据库,因此您想:嘿!我想将其放入另一个可用空间更多的驱动器中。
那么,您可以按照以下步骤操作。
步骤1:停止MySQL服务。
Window Key + R - will open Run
servies.msc - will open services manager
Locate MySQL80 (80 is for version 8.0, look for the one you've).
Stop it. (Right click, Stop)
步骤 - 2:查找当前数据目录
Goto C:\ProgramData\MySQL\MySQL Server 8.0
默认情况下,这里应该有一个名为Data
的文件夹,这是MySQL在默认设置中使用的文件夹(前提是他们没有找到其他更好的位置),但我们来检查一下。
找到my.ini
文件,应该就在那里。
用编辑器(例如Notepad ++)打开它。
进行CTRL + F以在文件中查找datadir
。
无论此处提到什么,都是MySQL当前正在使用的数据目录的实际位置。这就是您想要更改的内容。
第三步:将其替换为新数据目录。
假设您希望新数据目录位于W:__MySQL_Data。让我们将my.ini
文件中的datadir
值更改为此值。保留先前的值作为注释,这样您就不必记住它。
# Path to the database root
# datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data
datadir=W:/__MySQL_Data
现在使用xcopy
将默认的datadir
复制到W:\
。启动命令提示符(Windows+R,cmd,Enter)
>> xcopy "\C:\ProgramData\MySQL\MySQL Server 8.0" "W:\" /E /H /K /O /X
将复制的文件夹重命名为你修改后的新datadir
值。这里是:W:/__MySQL_Data
为什么不只是简单地复制呢?因为那样不够酷!这可以帮助你避免在复制的文件夹上失去权限,所以当你重新启动MySQL80
时,它就不会出现愚蠢的错误:"本地计算机上的MySQL80服务已经启动,然后停止了。如果某些服务未被其他服务或程序使用,则自动停止一些服务。" - 来源:微软
步骤-4:重新启动服务
Well, go back to the Services Manager to Start again,
"MySQL80" that you stopped, to restart it again.
步骤-5:完成!现在回到工作中!!
首先,您应该停止 mysql 服务器。例如:
# /etc/init.d/mysql stop
之后,您应该通过以下方式将旧数据目录(例如/var/lib/mysql)以及权限复制到新目录:
# cp -R -p /var/lib/mysql /new/data/dir
现在你可以在/etc/mysql/my.cnf
中更改数据并重新启动服务器。
# /etc/init.d/mysql restart
先停止你的mysql
sudo service mysql stop
将MySQL数据复制到新位置。
sudo cp -rp /var/lib/mysql /yourdirectory/
sudo vim /etc/apparmor.d/usr.sbin.mysqld
/yourdirectory/mysql/ r,
/yourdirectory/mysql/** rwk,
使用命令保存文件:
:wq
编辑 my.cnf 文件
sudo vim /etc/mysql/my.cnf
:wq
最终启动MySQL
sudo service mysql start
@查看有关raid0、优化的更多信息,请点击此处
我成功地更改了 MySQL 或 MariaDB 的数据目录,并在 Fedora 30 上解决了所有相关问题。我认为以下步骤适用于其他发行版。
注:使用类似于 Ubuntu
的 Debian-based
发行版的用户应该搜索如何禁用和编辑 AppArmor
,然后按照以下步骤进行。
首先,让我提一下,基于 RedHat 的 Linux 发行版(RHEL),例如 Fedora、CentOS 等都使用强制性访问控制策略的 SELinux。因此,在以下步骤中最好将其禁用
,稍后再通过一些调整启用它。
打开SELinux配置文件。
nano /etc/selinux/config
定位包含SELINUX=enforcing
的行并将其值更改为SELINUX=disabled
,保存文件并重新启动系统。
停止MySQL服务
systemctl stop mysqld.service
为MySQl的数据目录创建一个新目录。由于某些原因超出了此解决方案的范围,强烈建议不要在/home
目录下创建数据目录,但是可能有些人像我一样更喜欢它(这需要更多步骤)。
mkdir /home/eloy/applications/mysql-datadir/
将新目录的所有权和权限设置为默认的MySQL数据目录(/var/lib/mysql
):
chown --reference=/var/lib/mysql /home/eloy/applications/mysql-datadir/
chmod --reference=/var/lib/mysql /home/eloy/applications/mysql-datadir/
将所有文件从默认目录复制到新目录
cp -rp /var/lib/mysql/* /home/eloy/applications/mysql-datadir/
[mysqld]
部分下,编辑/etc/my.cnf
文件,并添加以下行:[mysqld]
datadir=/home/eloy/applications/mysql-datadir/
现在,您可以通过以下命令启动MySQL服务:
systemctl start mysqld.service
但是,如果数据目录创建在/home
下,MySQL将无法启动,并且在执行journalctl -xe
后,您会看到以下错误和警告:
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: 2021-10-05 10:22:03 0 [Warning] Could not increase number of max_open_files to more than 16384 (request: 32190)
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: 2021-10-05 10:22:03 0 [Warning] Can't create test file /home/eloy/applications/mysql-datadir/eloy-fedora-laptop.lower->
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: [113B blob data]
Oct 05 10:22:03 eloy-fedora-laptop mysqld[8362]: 2021-10-05 10:22:03 0 [ERROR] Aborting
/home
问题确保新的datadir
所在路径上的所有父级目录向上具有对于所有用户(用户、组和其他人)都有x
(执行)权限。我建议不使用递归脚本,因此:
chmod +x /home/eloy/applications/mysql-datadir
chmod +x /home/eloy/applications
chmod +x /home/eloy/
chmod +x /home
正如提到的那样,在/home
目录下创建datadir是棘手的,因为默认情况下MySQL不允许这样做。在/etc/systemd/system/mariadb.service.d
目录下创建一个文件,并添加以下行:
#open an editor to create a file
nano /etc/systemd/system/mariadb.service.d/centreon.conf
复制以下行到新的centreon.conf
文件中并保存
[Service]
ProtectHome=false
#ProtectSystem=off
通过运行以下命令应用更改:
systemctl daemon-reload
现在您可以运行MySQL服务:
systemctl start mysqld.service
再次编辑/etc/selinux/config
文件,将SELINUX=disabled
改为SELINUX=enforcing
。保存文件并重新启动系统。
使用以下命令查询SELinux的当前状态,输出应该为enforcing
。
getenforce
SELinux
上下文使用 mysqld_db_t
,如果未正确设置,mysqld
进程将会中止,因此您需要更新它:
semanage fcontext -a -t mysqld_db_t "/home/eloy/applications/mysql-datadir(/.*)?"
restorecon -Rv /home/eloy/applications/mysql-datadir
现在您可以运行MySQL。 干杯 ;-)
首先停止 mysqld 服务
mysql_install_db --user=mysql \
--basedir=/opt/mysql/mysql \
--datadir=/opt/mysql/mysql/data
接下来,在你的/etc/mysql/my.cnf
中更改datadir路径。
启动mysqld。
注意事项:
#1:可能需要调整SELinux设置(如果出现问题,请尝试关闭SELinux),Apparmor(Ubuntu)也可能是问题所在。
#2:参见MySQL安装DB参考文档。
我希望在我的电脑上保留一个数据库,同时将数据保存在外置硬盘上,并可以在两者之间进行切换。
如果您使用的是Mac,并且使用Homebrew安装了MySQL,那么这个方法适用于您。否则,您需要将MySQL datadir
替换为您电脑上相应的位置。
#cd to my data dir location
cd /usr/local/var/
#copy contents of local data directory to the new location
cp -r mysql/ /Volumes/myhd/mydatadir/
#temporarily move the old datadir
mv mysql mysql.local
#symlink to the new location
ln -s /Volumes/myhd/mydatadir mysql
当您想要切换回去时,只需执行以下操作:
mv mysql mysql.remote
mv mysql.local mysql
你现在又在使用本地数据库了。希望这能帮到你。