mysql실행오류 (1)

자동으로 시작하는 mysql 데몬프로세스 강제종료

MySQL 8 버전(mysql-8.0.20-macos10.15)을 MacOS 10.14 (Mojave) 에 설치했다. 설치는 CE버전 dmg 파일을 다운받아서 했는데, 설치할 때 마지막에 인스톨 프로세스 종료 후 자동으로 MySQL을 시작할건지에 대한 체크를 해제하지 않고 finish했고, MAMP가 실행되지 않길래(팝업창이 뜨지 않길래) 애플리케이션에서 수동으로 실행을 시켰는데 nginx 서버만 뜨고 mysql 서버가 뜨지 않았다.

오랜만에 MAMP를 쓰려다보니 왜 안뜨는지 원인을 찾기가 힘들어서 정리해본다.

일단 mysql 서버의 로그를 확인해보려 했다. 로그 위치가 어디인지를 몰라서 그냥 find 명령어로 mysql*.log 파일을 찾으려했는데 안나온다 -_-; 그래서 구글링을 해봤더니 .err 확장자로 끝나는 파일이 MAMP 안에 log 디렉토리 안에 있었고(파일명은 mysql_error_log.err 이다) 해당 파일을 열어서 에러메시지를 확인했더니 해당 포트가 이미 사용중이란다. 오잉? 그럼 설치후에 실행이 됐다는 얘긴가??? 그래서 프로세스를 확인해보았다.

ps -ef|grep mysql

그랬더니 mysql 데몬이 이미 떠있다. 실행시킨 유저는 _mysql 이라고 되어있었고 이 프로세스를 끄고 다시 MAMP를 실행시켜서 mysql 서버를 띄우려고 kill -9 PID를 실행시켰는데 해당 프로세스는 꺼졌으나 다른 PID를 갖는 mysql데몬이 자동으로 실행이 되어있었다. ㅡㅡ;

뭐지?? 얘 좀비네? 다시 열심히 구글링을 해서 동일한 문제에 대해 설명을 잘 해놓은 미디엄 포스팅을 하나 찾았다. 바로 여기이다. 해당 사이트에서는 mysql-8.0.12-macos10.13 버전에 대한 설명이 있었고 내가 설치한 버전은 mysql-8.0.20-macos10.15 버전이었다. 아마 macOS 버전도 다르지 않을까 싶은데 아무튼 저 사이트의 설명대로 해도 해당 프로세스는 죽었다 살아나고 죽었다 살아나고를 반복했다.


그래서 좀 더 구글링을 하여 MySQL 공식 문서 중 MySQL launch daemon에 관한 문서를 보게 되었다. 해당 문서에는 아래와 같은 내용이 있었다.

2.4.3 Installing and Using the MySQL Launch Daemon
macOS uses launch daemons to automatically start, stop, and manage processes 
and applications such as MySQL.

By default, the installation package (DMG) on macOS installs a launchd file named 
/Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist that contains a plist 
definition similar to:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" 
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>             <string>com.oracle.oss.mysql.mysqld</string>
    <key>ProcessType</key>       <string>Interactive</string>
    <key>Disabled</key>          <false/>
    <key>RunAtLoad</key>         <true/>
    <key>KeepAlive</key>         <true/>
    <key>SessionCreate</key>     <true/>
    <key>LaunchOnlyOnce</key>    <false/>
    <key>UserName</key>          <string>_mysql</string>
    <key>GroupName</key>         <string>_mysql</string>
    <key>ExitTimeOut</key>       <integer>600</integer>
    <key>Program</key>           <string>/usr/local/mysql/bin/mysqld</string>
    <key>ProgramArguments</key>
        <array>
            <string>/usr/local/mysql/bin/mysqld</string>
            <string>--user=_mysql</string>
            <string>--basedir=/usr/local/mysql</string>
            <string>--datadir=/usr/local/mysql/data</string>
            <string>--plugin-dir=/usr/local/mysql/lib/plugin</string>
            <string>--log-error=/usr/local/mysql/data/mysqld.local.err</string>
            <string>--pid-file=/usr/local/mysql/data/mysqld.local.pid</string>
            <string>--keyring-file-data=/usr/local/mysql/keyring/keyring</string>
            <string>--early-plugin-load=keyring_file=keyring_file.so</string>
        </array>
    <key>WorkingDirectory</key>  <string>/usr/local/mysql</string>
</dict>
</plist>

즉, mysql을 설치하면 /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist 파일에 위와 같은 설정 내용이 들어있다는 내용이었고 설정 항목들 중에 자동실행과 관련된 항목이 있을까 싶어 쭈욱 훑어보니 RunAtLoadLaunchOnlyOnce 항목이 눈에 띄었다.
일단 둘다 기본값과 반대로 설정하여 RunAtLoad 값은 false로, LaunchOnlyOnce의 값은 true로 수정해서 저장하고 다시 kill을 해보았다. (이 과정에서 재부팅을 했었는지 정확히 기억이 나지는 않는다;; 안했던것 같은데..^^; ) 그랬더니 더이상 자동으로 실행되지 않았고, MAMP를 실행시켜서 mysql 서버를 start하니 이제 잘 동작하는 것을 확인할 수 있었다.
 

도움이 되었다면 공감 꾸~~욱~~