성능 실험을 위해 일반 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