Hig*_*ife 5 mysql innodb linux ubuntu configuration
是否可以将 MySQL 中的每个数据库设置为使用单独的 datadir?
我正在运行一个 userdir 开发(沙箱)服务器,并希望将该用户的数据库的 MySQL 数据文件放在他们的/home/<user>/mysql目录中。
你会怎么做?
你会玩带有符号链接的游戏。
警告:以下仅适用于启用 innodb_file_per_table
例如,假设您的 datadir 是 /opt/mysql/data。每个数据库都位于该文件夹下。如果您有三个数据库(db1、db2、db3),则文件夹为:
在做任何事情之前运行这个查询:
mysql> select table_schema,table_name from information_schema.tables
where table_schema in ('db1','db2','db3');
Run Code Online (Sandbox Code Playgroud)
让我们从创建临时数据库开始
mysql> create database tmpdb1;
mysql> create database tmpdb2;
mysql> create database tmpdb3;
Run Code Online (Sandbox Code Playgroud)
接下来,让我们将您拥有的每个表 db1 移动到 tmpdb1,将 db2 移动到 tmpdb2,将 db3 移动到 tmpdb3
mysql -uroot -AN -e"SELECT CONCAT('ALTER TABLE ',db,'.',tb,' RENAME tmp',db,'.',tb,';') FROM information_schema.tables WHERE table_schema in ('db1','db2','db3')" > /root/MoveTables1.sql
mysql -uroot < /root/MoveTables1.sql
Run Code Online (Sandbox Code Playgroud)
好的,我们将每个 .ibd 文件横向移动到 tmp 数据库
进入 mysql 并确保所有表都已移动。数据库 db1-db3 应该是空的
mysql> use db1
mysql> show tables;
mysql> use db2
mysql> show tables;
mysql> use db3
mysql> show tables;
mysql> use tmpdb1
mysql> show tables;
mysql> use tmpdb2
mysql> show tables;
mysql> use tmpdb3
mysql> show tables;
Run Code Online (Sandbox Code Playgroud)
接下来,删除原始数据库
mysql> drop database db1;
mysql> drop database db2;
mysql> drop database db3;
Run Code Online (Sandbox Code Playgroud)
进入操作系统并创建符号链接
ln -s /home/user2/mysql /opt/mysql/data/db1
ln -s /home/user2/mysql /opt/mysql/data/db2
ln -s /home/user3/mysql /opt/mysql/data/db3
chown -R mysql:mysql /opt/mysql/data/db1
chown -R mysql:mysql /opt/mysql/data/db2
chown -R mysql:mysql /opt/mysql/data/db3
Run Code Online (Sandbox Code Playgroud)
进入 mysql 并确保数据库可见
mysql> show databases;
Run Code Online (Sandbox Code Playgroud)
接下来,将表移动到符号链接数据库中
mysql -uroot -AN -e"SELECT CONCAT('ALTER TABLE ',db,'.',tb,' RENAME ',SUBSTR(db,4),'.',tb,';') FROM information_schema.tables WHERE table_schema in ('tmpdb1','tmpdb2','tmpdb3')" > /root/MoveTables2.sql
mysql -uroot < /root/MoveTables2.sql
Run Code Online (Sandbox Code Playgroud)
最后,运行您开始的第一个查询
mysql> select table_schema,table_name from information_schema.tables
where table_schema in ('db1','db2','db3');
Run Code Online (Sandbox Code Playgroud)
如果出现相同的显示,则您已成功完成。
更新
@AaronBrown好心地提醒我,传播 .ibd 文件除了传播文件之外不会给您带来任何好处。没有任何性能提升。谢谢亚伦。
现在有一个内置的 MySQL 功能:
https://dev.mysql.com/doc/refman/5.6/en/tablespace-placing.html
CREATE TABLE t2 (c1 INT PRIMARY KEY)
TABLESPACE = innodb_file_per_table
DATA DIRECTORY = '/alternative/directory';
Run Code Online (Sandbox Code Playgroud)
它是 CREATE TABLE 语法的一部分。该手册明确建议将此作为符号链接的受支持替代方案。
此外,可能有一系列不好的理由这样做,甚至还有一系列看起来不错但有问题的理由,但对于合适的案例,也有一个完全合法的正当理由清单。在某些情况下,当您的存储硬件是分层的并且速度更快的设备容量有限时,可以而且应该利用它来提高性能。