全新" minimal"安装CentOS 7和MariaDB 10.我有一个额外安装的镜像卷,我想用于datadir。启动序列很好,并且当my.cnf [mysqld]被注释掉时正常完成。我已经复制了数据..
sudo cp -R -p /var/lib/mysql/* /mnt/mysql/
权限与原始权限相同。卷位于/ etc / fstab中并且安装正常
/dev/sdb1 /mnt/mysql xfs defaults 0 0
[root@femur mysql]# ls -la
total 110632
drwxr-xr-x. 5 mysql mysql 4096 Oct 20 15:27 .
drwxr-xr-x. 3 root root 18 Oct 16 16:46 ..
-rw-rw----. 1 mysql mysql 16384 Oct 20 15:27 aria_log.00000001
-rw-rw----. 1 mysql mysql 52 Oct 20 15:27 aria_log_control
-rw-r-----. 1 mysql root 7005 Oct 20 13:49 femur.err
-rw-rw----. 1 mysql mysql 12582912 Oct 20 15:27 ibdata1
-rw-rw----. 1 mysql mysql 50331648 Oct 20 15:27 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 Oct 20 12:21 ib_logfile1
-rw-rw----. 1 mysql mysql 0 Oct 20 12:22 multi-master.info
drwx--x--x. 2 mysql mysql 4096 Oct 20 12:21 mysql
drwx------. 2 mysql mysql 4096 Oct 20 13:37 performance_schema
drwxr-xr-x. 2 mysql mysql 6 Oct 20 12:21 test
这是在my.cnf
!includedir /etc/my.cnf.d
[mysqld]
log_error = /var/log/mysql-error.log
user = mysql
datadir = /mnt/mysql
socket = /mnt/mysql/mysql.sock
这是我试图启动它时得到的......
'[root@femur mysql]# sudo systemctl start mysql.service
Job for mysql.service failed. See 'systemctl status mysql.service' and 'journalctl -xn' for details.'
这两个文件都没有说明,但这是在/var/log/mysql-error.log
141020 16:07:09 mysqld_safe Starting mysqld daemon with databases from /mnt/mysql
141020 16:07:09 [Warning] Can't create test file /mnt/mysql/femur.lower-test
141020 16:07:09 [Note] InnoDB: Using mutexes to ref count buffer pool pages
141020 16:07:09 [Note] InnoDB: The InnoDB memory heap is disabled
141020 16:07:09 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
141020 16:07:09 [Note] InnoDB: Memory barrier is not used
141020 16:07:09 [Note] InnoDB: Compressed tables use zlib 1.2.7
141020 16:07:09 [Note] InnoDB: Using Linux native AIO
141020 16:07:09 [Note] InnoDB: Using CPU crc32 instructions
141020 16:07:09 [Note] InnoDB: Initializing buffer pool, size = 128.0M
141020 16:07:09 [Note] InnoDB: Completed initialization of buffer pool
2014-10-20 16:07:09 7f6cb59c9880 InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
141020 16:07:09 [ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can't determine file permissions
141020 16:07:09 [ERROR] InnoDB: The system tablespace must be writable!
141020 16:07:09 [ERROR] Plugin 'InnoDB' init function returned error.
141020 16:07:09 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
141020 16:07:09 [ERROR] mysqld: File '/mnt/mysql/aria_log_control' not found (Errcode: 13 "Permission denied")
141020 16:07:09 [ERROR] mysqld: Got error 'Can't open file' when trying to use aria control file '/mnt/mysql/aria_log_control'
141020 16:07:09 [ERROR] Plugin 'Aria' init function returned error.
141020 16:07:09 [ERROR] Plugin 'Aria' registration as a STORAGE ENGINE failed.
141020 16:07:09 [Note] Plugin 'FEEDBACK' is disabled.
141020 16:07:09 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
141020 16:07:09 [ERROR] Unknown/unsupported storage engine: InnoDB
141020 16:07:09 [ERROR] Aborting
141020 16:07:09 [Note] /usr/sbin/mysqld: Shutdown complete
141020 16:07:09 mysqld_safe mysqld from pid file /mnt/mysql/femur.pid ended
http://www.reddit.com/r/linuxadmin/comments/2ebhpf/adventures_in_moving_mariadb_data_folder/有所帮助,但我无法让它发挥作用。
非常感谢任何帮助。
答案 0 :(得分:22)
问题确实是SELinux;在MariaDB / MySQL将在CentOS 7上启动之前你需要做三件事:
mysql:mysql
mysqld_db_t
system_u
这很简单:
chcon -Rt mysqld_db_t /database/db
chcon -Ru system_u /database/db
chown -R mysql:mysql /database/db
插入磁盘后我需要做的全部事情如下:
cfdisk /dev/sdb
pvcreate /dev/sdb1
vgcreate database /dev/sdb1
lvcreate -l 100%FREE -n db database
mkfs.ext4 /dev/database/db
mkdir /database
mount /database
mkdir /database/db
chcon -Rt mysqld_db_t /database/db
chcon -Ru system_u /database/db
chown -R mysql:mysql /database/db
systemctl start mariadb
答案 1 :(得分:5)
那很有趣......
事实证明,CentOS 7“minimal”安装了SELinux,这显然阻止了mysql写入已安装的镜像集。我正在寻找我可能没有想过的安全项目,并在文档中找到它。我之前曾想过(显然是错误的)SELinux是一个发行版,而不是一个模块。一旦我运行测试,看看它是否在那里......
getenforce
我暂时禁用它进行测试。
setenforce 0
最后,我能够将镜像集中的目录作为datadir启动MariaDB,并且没有错误。为了使这个更改永久化(因为这个服务器在防火墙后面),在/ etc / selinux / config中,我做了
- SELINUX=enforcing
+ SELINUX=disabled
我希望这有助于其他人。祝你有美好的一天!
答案 2 :(得分:0)
您必须安装: yum install policycoreutils-python
<强>指南:强>
查看mysql的默认数据库位置的SELinux上下文:
~]# ls -lZ /var/lib/mysql
drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
这显示了mysqld_db_t,它是数据库文件位置的默认上下文元素。必须手动将此上下文应用于将在此示例中使用的新数据库位置,以使其正常运行。
停止mysqld守护程序:
~]# systemctl stop mariadb.service
为数据库的新位置创建一个新目录。在此示例中,使用了/ mysql /:
~]# mkdir -p /mysql
将数据库文件从旧位置复制到新位置:
~]# cp -R /var/lib/mysql/* /mysql/
更改此位置的所有权以允许mysql用户和组访问。这设置了SELinux仍将遵守的传统Unix权限:
~]# chown -R mysql:mysql /mysql
运行以下命令以查看新目录的初始上下文:
~]# ls -lZ /mysql
drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysql
这个新创建的目录的上下文usr_t目前不适合SELinux作为MariaDB数据库文件的位置。上下文更改后,MariaDB将能够在此区域正常运行。
使用文本编辑器打开MariaDB主配置文件/etc/my.cnf并修改datadir选项,使其引用新位置。在此示例中,应输入的值为/ mysql:
[mysqld]
datadir=/mysql
保存此文件并退出。
启动mysqld。该服务应该无法启动,拒绝消息将记录到/ var / log / messages文件中:
~]# systemctl start mariadb.service
mariadb.service的工作失败。有关详细信息,请参阅'systemctl status postgresql.service'和'journalctl -xn'。
但是,如果审计守护程序正在运行并且与他一起使用setroubleshoot服务,则拒绝将记录到/var/log/audit/audit.log文件中: SELinux正在阻止对/ mysql的/ usr / libexec / mysqld“写”访问。完整的SELinux消息。运行sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71
这种拒绝的原因是/ mysql /未正确标记MariaDB数据文件。 SELinux阻止MariaDB访问标记为usr_t的内容。执行以下步骤以解决此问题:
运行以下命令为/ mysql /添加上下文映射。请注意,默认情况下不安装semanageutility。如果系统上缺少它,请安装policycoreutils-pythonpackage。
**~]# semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"**
此映射将写入/etc/selinux/targeted/contexts/files/file_contexts.local文件:
~]# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local
/ MySQL的(/.*)? system_u:object_r:mysqld_db_t:S0
现在使用restorecon实用程序将此上下文映射应用于正在运行的系统:
**~]# restorecon -R -v /mysql**
现在/ mysql / location已被标记为MariaDB的正确上下文,mysqldstarts:
~]# systemctl start mariadb.service
确认/ mysql /的上下文已更改:
~]$ ls -lZ /mysql
drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
该位置已更改并标记,并且mysqld已成功启动。此时应测试所有正在运行的服务以确认正常运行。