RAMDisk의 MySQL이 시작되지 않습니다.

RAMDisk의 MySQL이 시작되지 않습니다.

성능 실험을 위해 일반 SSD의 파일 IO를 제외하고 mysql 프로그램(모든 테이블 데이터, 인덱스 등)의 모든 실행을 RAM 디스크로 이동하려고 합니다.

먼저 평소와 같이 mysql을 설치했습니다 sudo apt install mysql-server. 프로그램이 mysqld시작되고 정상적으로 데이터베이스를 생성할 수 있습니다.

또한 이 사이트에 나열된 지침에 따라 RAMDisk를 만들었습니다.Ubuntu에서 RAMDisk 만들기해당 위치에서 /mnt/ramdisk해당 크기를 사용합니다 25G(사용 가능한 RAM이 있음 64G). 해당 위치에 글을 쓰고 예상대로 RAM이 가득 차기 시작하는 것을 관찰할 수 있습니다.

이제 다음 명령을 사용하여 mysql 라이브러리 디렉터리를 이 RAMDisk에 복사합니다.

cp -rp /var/lib/mysql /mnt/ramdisk

datadir그리고 그것에 심볼릭 링크를 걸어 파일 의 매개변수를 변경할 필요가 없도록 하세요 /etc/mysql/mysql.conf.d/mysqld.cnf.

mv mysql _mysql    
ln -s /mnt/ramdisk/mysql mysql

또한 MySQL이 RAMDisk에 액세스할 수 있도록 권한을 변경했습니다.

root@HOSTNAME:/var/lib# ls -l | grep mysql
lrwxrwxrwx  1 mysql         mysql           19 Feb 14 16:45 mysql -> /mnt/ramdisk/mysql/
drwx------  6 mysql         mysql         4096 Feb 14 17:06 _mysql
drwx------  2 mysql         mysql         4096 Feb 14 12:14 mysql-files
drwx------  2 mysql         mysql         4096 Feb 12 17:14 mysql-keyring
drwxr-xr-x  2 root          root          4096 Jan 21 06:10 mysql-upgrade

그리고

root@HOSTNAME:/mnt# ls -l
total 0
drwxrwxrwt 3 mysql mysql 60 Feb 14 17:24 ramdisk

root@HOSTNAME:/mnt/ramdisk# ls -l
total 0
drwx------ 5 mysql mysql 380 Feb 14 16:41 mysql

그러나 지금 프로그램을 다시 시작하려고 하면 mysqld다음 오류가 발생합니다.

USER@HOSTNAME:/$ sudo /etc/init.d/mysql restart
[sudo] password for USER: 
[....] Restarting mysql (via systemctl): mysql.serviceJob for mysql.service failed because the control process exited with error code.
See "systemctl status mysql.service" and "journalctl -xe" for details.
 failed!

두 가지를 모두 연구한다고 해서 문제에 대한 더 깊은 이해가 제공되는 것은 아닙니다 systemctl status mysql.service.journalctl -xe

USER@HOSTNAME:/$ systemctl status mysql.service
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2020-02-14 17:30:55 PST; 1min 0s ago
  Process: 19794 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code=exited, status=1/FAILURE)
  Process: 19785 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
 Main PID: 17945 (code=exited, status=0/SUCCESS)

Feb 14 17:30:55 HOSTNAME systemd[1]: mysql.service: Service hold-off time over, scheduling restart.
Feb 14 17:30:55 HOSTNAME systemd[1]: mysql.service: Scheduled restart job, restart counter is at 5.
Feb 14 17:30:55 HOSTNAME systemd[1]: Stopped MySQL Community Server.
Feb 14 17:30:55 HOSTNAME systemd[1]: mysql.service: Start request repeated too quickly.
Feb 14 17:30:55 HOSTNAME systemd[1]: mysql.service: Failed with result 'exit-code'.
Feb 14 17:30:55 HOSTNAME systemd[1]: Failed to start MySQL Community Server.

을 위한 journalctl -xe:

-- Unit mysql.service has begun starting up.
Feb 14 17:30:54 HOSTNAME audit[19792]: AVC apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/mnt/ramdisk/mysql/HOSTNAME.lower-test" pid=19792 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=0 ouid=0
Feb 14 17:30:54 HOSTNAME audit[19792]: AVC apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/mnt/ramdisk/mysql/HOSTNAME.lower-test" pid=19792 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=0 ouid=0
Feb 14 17:30:54 HOSTNAME audit[19792]: AVC apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/mnt/ramdisk/mysql/HOSTNAME.lower-test" pid=19792 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=0 ouid=0
Feb 14 17:30:54 HOSTNAME audit[19796]: AVC apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/mnt/ramdisk/mysql/HOSTNAME.lower-test" pid=19796 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=125 ouid=125
Feb 14 17:30:54 HOSTNAME audit[19796]: AVC apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/mnt/ramdisk/mysql/HOSTNAME.lower-test" pid=19796 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=125 ouid=125
Feb 14 17:30:54 HOSTNAME audit[19796]: AVC apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/mnt/ramdisk/mysql/HOSTNAME.lower-test" pid=19796 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=125 ouid=125
Feb 14 17:30:54 HOSTNAME audit[19796]: AVC apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/mnt/ramdisk/mysql/ibdata1" pid=19796 comm="mysqld" requested_mask="wr" denied_mask="wr" fsuid=125 ouid=125
Feb 14 17:30:55 HOSTNAME mysqld[19794]: Initialization of mysqld failed: 0
Feb 14 17:30:55 HOSTNAME systemd[1]: mysql.service: Control process exited, code=exited status=1
Feb 14 17:30:55 HOSTNAME systemd[1]: mysql.service: Failed with result 'exit-code'.
Feb 14 17:30:55 HOSTNAME systemd[1]: Failed to start MySQL Community Server.
-- Subject: Unit mysql.service has failed
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- Unit mysql.service has failed.

답변1

결과적으로 문제는 출력에서 ​​바로 내 앞에 있었습니다 journalctl -xe.

Feb 14 17:30:54 HOSTNAME audit[19792]: AVC apparmor="DENIED" operation="mknod" profile="/usr/sbin/mysqld" name="/mnt/ramdisk/mysql/HOSTNAME.lower-test" pid=19792 comm="mysqld" requested_mask="c" denied_mask="c" fsuid=0 ouid=0

더 구체적으로,의류="거부됨"부분. AskUbuntu에 대한 이 답변에서:mysql 폴더 재배치 후 의류 오류내 문제를 해결할 수있었습니다. 아래에 관련 세부정보를 추가하겠습니다.


/etc/apparmor.d/usr.sbin.mysqld파일을 편집합니다 . /var/lib/mysql새로운 datadir 위치를 제거 하고 추가하십시오. 내가 아는 한 그건 그렇다.

 # Allow data dir access
 /mnt/ramdisk/mysql/ r,
 /mnt/ramdisk/mysql/** rwk,

의류 다시 시작:service systemctl restart apparmor

mysql 서비스를 다시 시작합니다.service mysql start

관련 정보