Mac에서 MySQL 설치와 실행 그리고 몇가지 유의사항

리눅스도 apt-get을 쓰느냐 yum을 쓰느냐에 따라서 지원하는 팩키지들이 조금씩 다른데 하물며 리눅스 서버에서만 놀다가 Mac에서 MySQL을 하려고하니 귀찮은게 한두가지가 아니다. 정리해보자.

MySQL 설치

설치는 간단하다. MySQL 홈페이지에서 .dmg 파일을 받아서 깔면 된다. 그런데 요세미티로 업그레이드 한 사람들은 그렇게 간단하진 않다! 일단 현재(2014.11월) MySQL 홈페이지에서 제공하는 설치파일이 10.9 버전까지만 있다. 나도 살짝 당황했다. 어랍쇼? 10.10이 없네? 요세미티에선 안되는건가? 혹시나 싶어 10.9 버전을 받아서 설치했더니… 뚜둥! 설치오류<img src=” /> 그래서 나는 요세미티에선 MySQL 안깔린다! 라는 매우 성급한 결론을 내버렸다. 진짜 알깔리는건가? 설마~~ 그럴리가!! 그냥 10.8 버전 설치파일로 깔면 된다. ㅎㅎㅎ 뭐냐? -_-;;;;

이때 설치되는 경로는 아래와 같다.

$> cd /usr/local
$local> ls -al
....생략... mysql -> mysql-5.6.21-osx10.8-x86_64
....생략... mysql-5.6.21-osx10.8-x86_64 

2015년 5월 덧, 주로 맥환경에서 개발하는 분들을 위해서 추천하는 방법은 위와 같은 방법 말고 그냥 HomeBrew를 설치해서 사용하기를 권장한다. 이번에 새로운 맥프레로 갈아타면서 패키지 관리를 이 HomeBrew를 이용해하고 있는데 너무 편하다. MySQL설치도 그냥 고민없이 아래명령어만 입력하면된다.

$> brew install mysql

혹시나 내가 이전에 설치했나? 궁금할때는 brew info 라는 명령어를 이용한다.

$> brew info mysql
mysql: stable 5.6.24 (bottled)
https://dev.mysql.com/doc/refman/5.6/en/
Conflicts with: mariadb, mysql-cluster, mysql-connector-c, percona-server
/usr/local/Cellar/mysql/5.6.23 (9687 files, 339M) *
Poured from bottle
.. 어쩌구 저쩌구 ...
server starting up correctly.

To connect:
    mysql -uroot

To have launchd start mysql at login:
    ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
Then to load mysql now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Or, if you don't want/need launchctl, you can just run:
    mysql.server start

이전에 HomeBrew로 설치한적이 있다면 위와 같은 정보를 확인할수있다. 나는 mysql을 미리 띄워놓지않고 필요할때만 서버를 띄워서 개발하는 편이라 mysql.server start 명령어를 애용하는 편이다. 아래에도 이어서 설명이 나오겠지만 HomeBrew의 강점중에 하나는 /usr/local/Cellar 폴더에 패키지를 설치한후 심볼릭 링크를 알아서 만들어주기 때문에 어디서든 명령어만 입력하면 된다. 즉 아래처럼 설치한 경로를 다 입력하지 않아도 되는 장점이 있다.

MySQL 서버 실행하기

리눅스에서 yum으로 mysql을 설치하면 아래와 같이 간단하게 실행할 수 있었다.

$> service mysqld start

하지만 맥은 리눅스가 아니다. 그래서 mysql.server 스크립트를 이용한다.

$> /usr/local/mysql/support-files/mysql.server
Usage: mysql.server  {start|stop|restart|reload|force-reload|status}  [ MySQL server options ]
$> sudo /usr/local/mysql/support-files/mysql.server start

MySQL 접속하기

서버를 실행했다면 이제 mysql 서버에 접속해보자. 보통은 커맨드라인 어디에서든 mysql로 로그인하면 된다. 하지만 그냥 로그인하면 권한이 없는 경우 많다. 그래서 일단 root로 로그인하자. 맥에 처음 mysql을 깔았다면 root는 비밀번호 없이도 로컬에서 접속이 가능할 것이다.

$> mysql -u root  // -uroot 라고 붙여서도 된다.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 528
Server version: 5.6.21 MySQL Community Server (GPL)
... 중략 ...
sql> 

위와 같이 나온다면 일단 접속은 성공한거다!

사용할 DB 만들기

이제 개발에 필요한 혹은 사용할 데이터베이스를 만들어보자.

mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)

그리고 꼭 캐릭터셋을 확인해야한다. mysql을 설치하고 따로 캐릭터셋(charset)을 따로 설정하지 않았다면 latin1 으로 설정되는데 latin1 캐릭터셋을 쓰면 한글은 당연히 안되고 몇몇 특수문자를 사용할경우 DB에서 입력이 안되는 경우가 허다하다. 그래서 반드시 utf-8로 설정되어 있는지 확인해야한다. 확인하는 방법은 다음과 같다.

mysql> show create database testdb;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| testdb   | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

젠장 역시나,..-_-;;; latin1으로 되어 있다. 일단 만든건 지우자.

mysql> drop database testdb;
Query OK, 0 rows affected (0.00 sec)

MySQL 기본 캐릭터셋 설정하기

MySQL에서 설정파일을 읽는 순서는 다음과 같다.

  • /etc/my.cnf
  • /etc/mysql/my.cnf
  • /usr/local/mysql/etc/my.cnf
  • ~/.my.cnf

일단 /etc/my.cnf 파일이 있는지 확인하고 없으면 /usr/local/mysql/support-files 폴더에서 my-default.cnf 파일을 복사해온다.

$> cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf

그리고 /etc/my.cnf 파일에 다음 내용을 추가한다.

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

init_connect=SET collation_connection=utf8_general_ci
init_connect=SET NAMES utf8

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

이제 다시 서버를 재시작한다. sudo 권한이 없으면 sudo를 붙인다.

$> sudo /usr/local/mysql/support-files/mysql.server restart

DB 생성 및 생성된 DB 사용자 추가하기

이제 거의 다왔다. 앞에서 설정한 캐릭터셋이 잘 됐는지 일단 확인하자.

mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)

mysql> show create database testdb;
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| testdb   | CREATE DATABASE `testdb` /*!40100 DEFAULT CHARACTER SET utf-8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

오예! 잘 됐다. 이제 권한을 추가하자. 권한을 추가하는 방법은 여러가지가 있지만 그냥 쉬운 grant 명령을 이용하자.

// localhost로 접속만 허용하는 dev 유저 계정 생성
mysql> grant all privileges on testdb.* to dev@localhost identified by 'password123';

// 원격 접속도 허용하는 devmaeul 유저 계정 생성 
mysql> grant all privileges on testdb.* to dev@'%' identified by 'password123';

dev라는 계정을 만들고 이 계정으로 사용할 testdb도 지정해줬으므로 이제 root가 아닌 dev 계정으로 로그인해서 사용할수있는 DB가 보이는지 확인해보자.

$> mysql -u dev -p
Enter password: (앞에서 지정한 패스워드 입력)
... 중략 ...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testdb             |
+--------------------+
3 rows in set (0.00 sec)

오예!~ testdb가 보인다! 여기까지 mysql로 개발할때 필요한 기본적인 과정이다.

타임존 설정 (업데이트 2015-08-31)

지금까지 기본적인 설정이 끝나서 문제가 없겠구나 했는데 개발하다보니 하나더 발견했다. 바로 타임존이다. 서버에 시간을 기록하는 상황이 아니면 잘 모르기 때문에 사전에 점검하지 않으면 나중에 운영하다 발견하게 된다. 실제로 최근 2달사이 이 문제를 두번 겪었다. 즉, 타임존 설정을 신경써두지 않으면 한국시간으로 오전 10시에 기록을 했는데 서버는 오전 1시로 인식하고 기록하게 된다는 얘기다. 보통 이 문제를 어떻게 해결하는지는 나는 모르겠다. 그냥 상식적으로 생각해보면 글로벌 서비스라면 UTC로 저장하고 한국에서만 서비스할 생각이라면 한국시간에 맞게 저장하는게 좋지않을까? 라고 단순하게만 생각했다. 하지만 그리 단순한 문제는 아니다. 이 얘기 좀금 있다가 다시하고, 여튼 신경쓰지 않았을때 기본값이 어떻게 들어가 있는지 잘 모르기 때문에 일단 현재 시간이 어떻게 저장되어 있는지부터 확인할 필요가 있다!

$> mysql -uroot
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2015-08-31 02:52:24 |
+---------------------+
1 row in set (0.00 sec)

헐퀴! 현재 한국시간은 오전 11시 52분인데 서버는 새벽 2시란다. UTC로 설정되어 있다. 이번엔 내 로컬PC를 확인해봤다. 헐퀴! 이녀석은 또 제대로 나온다. 아~~ 이게 뭐지? 왜 다른거지? 둘다 특별히 설정한건 없는데,… 라는 생각이 들어서 MySQL 공식 문서를 찾아봤다. 에헤라~ 디야~ 그랬쿠나!! OS의 시간을 그대로 가져온다는구나야~~ http://dev.mysql.com/doc/refman/5.6/en/time-zone-support.html

그래서 현재 내PC와 운영중인 AWS 서버의 시간을 확인해봤다.

$ AWS> date
2015. 08. 31. (월) 03:06:53 UTC

$ local> date
2015년 8월 31일 월요일 12시 06분 35초 KST

자, 여기서 문제가 발생한다. MYSQL은 기본적으로 OS의 서버 시간을 가지고 설정하기 때문에 단순히 글로벌 서비스라서 UTC로 저장하고 국내용 서비스라서 KST로 저장하면 안되는거다. 왜냐면 서버시간을 물고 들어가기 때문에 서버 위에서 돌아가는 모든 어플리케이션도 영향을 받는다. 따라서 서버시간은 그냥 통일해야하는 문제가 먼저인 것이다. 나는 일단 지금 한국에서 개발하니까 한국시간을 기준으로 설정해야겠다.

그럼 타임존 설정은 어떻게 해야지? 간단하다. /etc/localtime 이라는 파일이 있는데 이 파일 설정을 한국시간으로 바꿔주면 된다. 아래와 같이 심볼릭 링크를 걸어주자!

$> ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
$> ls -al | grep /etc/locatime
lrwxrwxrwx  1 root root      30  8월 31 12:17 localtime -> /usr/share/zoneinfo/Asia/Seoul
$> date
2015. 08. 31. (월) 12:18:08 KST

끝~

덧,

도움이 되셨나요? 그럼 광고 한번 클릭!

mac 커맨드 라인에서 AWS로 파일 올리기

앞으로 이사 만료일까지 4일 남았다. 4일안에 모든걸 해치워야한다. 귀차니즘을 이겨내고 잘 할수있을까? 일단 닷네임에서 AWS로도메인 이전하는건 보류.. 그냥 기존에 닷네임에서 카페24로 바라보던 DNS 서버를 다시 닷네임 자체 DNS로 변경후 A레코드만 추가하면 되는거였다. 이렇게 간단한걸 왜 싹다 AWS로 통일하려고 했을까? AWS가 그렇게 싸지도 않은데 말이지… 암튼 사설이 길었다. 각설하고,…

Mac 에서 AWS로 파일 올리기

매우 간단하다. secure copy 라는 명령어를 이용하면 된다. 여기서 중요한건 바로 콜론(:)!! 콜론을 빼먹으면 안된다.

$> scp -i [aws-인증키.pem] [/로컬PC의 경로/파일명.zip] ec2-user@xxx.xxx.xxx.xxx:[올릴 파일명]

서버에서 AWS로 파일 옮기기

이것도 사실 매우 간단하다. 그냥 wget이나 curl을 응용하면 된다.

$> wget '서버URL'

Mac에 기본으로 설치된 아파치를 이용해 가상 호스트 설정 하기

그동안 삽질의 삽질을 거듭한 끝에 가상호스트 설정에 성공했다. 유후~ 😀
일단 기본으로 설치된 아파치를 활용하는 팁은 아래 링크를 참고한다.
맥에 기본으로 설치되어 있는 아파치 활용하기

이제부터 본격 vhost 설정을 시작해보자.
맥에는 기본으로 설정된 사이트 경로가 두개 있다.

먼저 ‘localhost’ 로 설정되어 있는 루트 경로는 아래와 같고,

/Library/WebServer/Documents

‘localhost/~사용자이름’ 으로 설정된 경로는 아래와 같다.

/Users/사용자이름/Sites

그런데, 문제는 저 두 기본 경로말고 내가 원하는 경로에 가상 호스트를 설정하고 싶은 경우다.
가령, 이클립스 작업 경로 전체를 웹서버로 돌리고 싶은경우..
경로는 아래와 같다고 가정해보자.

/Users/사용자이름/Documents/workspace

그래서 가장 쉬운 방법은 아래 가상 호스트 설정 파일을 열어서,

/etc/apache2/extra/httpd-vhosts.conf

다음과 같이 작성하고 서버를 재시작한다.

서로 다른 이름으로 호스트를 설정하고 싶은 경우 설정한다.

NameVirtualHost *:80

기본 아파치 호스트 경로


   DocumentRoot “/Library/WebServer/Documents”
   ServerName localhost

가상 호스트 경로


     DocumentRoot “/Users/사용자이름/Documents/workspace”
     ServerName workspace


Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all

위 설정을 가만히 보면, 2개의 가상호스트를 설정하고 각각 이름은, localhost와 workspace다.
물론 localhost는 /etc/hosts 파일에 기본으로 설정되어 있지만, workspace는 설정되어 있지 않기 때문에 호스트(/etc/hosts)파일을 열어서 “127.0.0.1  workspace”를 추가해준다.

자, 그럼 http://workspace 를 브라우저 주소에 넣고 실행해보자!!
뚜둥~!! 이런 포비든이다.. ㅇㅎㅎ

> Forbidden >

> You don’t have permission to access / on this server. >

아마도 대부분이 여기서 막혔을 것이다. ㅇㅎ

이 문제의 원인은 파일 보안 시스템에 의해 접근이 제한된 것이다.  
따라서 해당 경로의 접근 권한을 풀어줘야한다.
터미널을 열고, 다음과 같이 권한을 수정한다.

/Users/사용자이름$> chmod 755 ./Documents

/Users/사용자이름$> cd Documents

/Users/사용자이름/Documents $> chmod 755 ./workspace

ls -al 을 이용해 설정된 권한을 살펴보자. 아래와 같이 설정이 됐다면,
이제 더이상 포비든이 뜨지 않을것이다!!

drwxr-xr-x+ 18 사용자이름  staff   612  8 18 16:14 Documents
drwxr-xr-x@ 18 사용자이름  staff   612  7 19 16:37 workspace 이상 끝~!!