I am trying to move the data directory of my MySQL database to a second disk array that I have as a mount point /array2/.
The problem I am having is I have tried everything and after I modify the location of datadir in my.cnf mysql will not start up again.
All I get is:
start: Job failed to start 7 Answers
Forgot about app armour.
For anyone that is interested I did the following to move the folder.
Stop the mysql server:
stop mysqlCreate the new directory:
mkdir /array2/mysqlCopy over ONLY the database folders:
cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysqlBackup the my.cnf file:
cp /etc/mysql/my.cnf /root/my.cnf.backupEdit the my.cnf file:
nano /etc/mysql/my.cnfChange all mentions of the old datadir and socket to your new location
Mine became:
datadir=/array2/mysqlsocket=/array2/mysql/mysql.sockUpdate the directory permissions:
chown -R mysql:mysql /array2/mysqlRename the old directory:
mv /var/lib/mysql /var/lib/mysql-oldCreate a symlink, just in case:
ln -s /array2/mysql /var/lib/mysql Let AppArmor know about the new datadir:
echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/aliasReload the apparmor profiles
sudo /etc/init.d/apparmor reloadThen start mysql:
start mysql 4 I found that AppArmor was the culprit by examining the syslog, and was able to successfully change the mysql data location by following this process.
Please note that, in files edited below, lines starting with + were added, and lines starting with - were removed. You should not actually type/paste the + signs when adding lines to these files.
I cloned the mysql directory to the new location:
sudo rsync -av /var/lib/mysql /new_dirThen I edited the datadir line in /etc/mysql/my.cnf:
sudo vi /etc/mysql/my.cnf-datadir = /var/lib/mysql
+datadir = /new_dir/mysqlThen I edited /etc/apparmor.d/usr.sbin.mysqld:
sudo vi /etc/apparmor.d/usr.sbin.mysqld- /var/lib/mysql/ r,
- /var/lib/mysql/** rwk,
+ /new_dir/mysql/ r,
+ /new_dir/mysql/** rwk,Then I restarted mysql.
Be aware.
If you have InnoDB tables you MUST copy over the ibdata* and ib_logfile* files or you will not be able to use the the tables. You will get:
'Table 'databaseName.tableName' doesn't exist'
errors.
Run this copy command to copy over the ibdata* and ib_logfile* files.
sudo cp -p /var/lib/mysql/ib* /array2/mysql/ 1 I prefer to use mount with bind option so I avoid any further changes in Apparmor and Mysql configuration.
For example:
Suppose I want to move everything in /var/www.
Lets say this dir is my dev environment and it is mounted in a different partition
First we need to stop mysql:
sudo systemctl stop mysql.serviceWe move files (preserving permission)
sudo rsync -av /var/lib/mysql /var/wwwThis will generate a directory
/var/www/mysql/with all the content.We remove everything in the old directory:
sudo rm -r /var/lib/mysql/*We mount the new directory with
bindoption in the old one.
edit/etc/fstaband add this line:/var/www/mysql /var/lib/mysql none bind 0 0This will mount the
/var/www/mysqlin our empty dir/var/lib/mysql
Thebindoption here do the magic, it will populate/var/lib/mysqlwith the content of/var/www/mysqlso for mysql and apparmor it will be the like nothing has changed.Now we do the mount:
sudo mount -aand restart mysql.
I just tried another way, that some may find useful:
copy with permissions intact:
rsync -avzh /var/lib/mysql /path/to/new/placeback up (in case something goes wrong):
mv /var/lib/mysql /var/lib/_mysqlcreate a new empty directory in place of old:
mkdir /var/lib/mysqlbind mount the new location to the old:
mount -B /path/to/new/place /var/lib/mysqlHope that helps someone, because symlinking didn't work for me, and this was the simplest way
If you move your datadir, you not only need to give the new datadir permissions, but you need to insure all parent directories have permission.
I moved my datadir to a hard drive, mounted in Ubuntu as:
/media/*user*/Data/and my datadir was Databases.
I had to set permissions to 771 to each of the media, user and Data directories:
sudo chmod 771 *DIR*If this does not work, another way you can get mysql to work is to change user in /etc/mysql/my.cnf to root; though there are no doubt some issues with doing that from a security perspective.
You realize if you follow the commands verbatim from the accepted answer it will fail?
cp -R /var/lib/mysql /array2/mysql
Will copy /var/lib/mysql to /array2/mysql/mysql.
When you set your configuration file you better be putting in /array2/mysql/mysql as the directory or else your mysqld will fail to start.
The better copy commands would be:
cp -R /var/lib/mysql /array2/ cp -R /var/lib/mysql/users /array2/mysql
Just my 2 cents worth.