검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Installing Nginx With PHP5 (And PHP-FPM) And MySQL Support (LEMP) On Ubuntu 13.04

1. 선결조건
  호스트명은 server1.example.com, IP 주소는 192.168.0.100인 것으로 가정합니다. 거의 모든 명령어는 root 권한을 필요로 하므로 명령어를 사용할 때마다 sudo를 사용하거나 sudo su 명령어를 통해 root로 로그인해야 합니다.

2. MySQL5 설치
apt-get install mysql-server mysql-client
  설치 중 MySQL root 계정의 패스워드를 설정하게 됩니다.

3. Nginx 설치
apt-get install nginx
/etc/init.d/nginx start
  웹 브라우저로 접속 가능 여부를 확인합니다. 우분투 13.04에서 Nginx의 디폴트 document root는 /usr/share/nginx/html 입니다.

4. PHP5 설치
  PHP-FPM(FastCGI Process Manager. PHP FastCGI 구현물로 특히 방문자가 많은 사이트에 유용한 기능을 가지고 있음)로 Nginx에서 PHP5를 사용할 수 있습니다.
apt-get install php5-fpm
  PHP-FPM은 /var/run/php5-fpm.sock 소켓에서 FastCGI 서버를 실행하는 데몬 프로세스입니다. init 스크립트의 위치는 /etc/init.d/php5-fpm 입니다.

5. Nginx 설정
  Nginx의 설정 파일은 /etc/nginx/nginx.conf 입니다. 설정 파일은 이해하기 쉬운 구조로 되어 있습니다.(이곳이곳에서 배울 수 있습니다.)

  (선택사항으로)먼저 워커 프로세스의 개수를 조정하고 keepalive_timeout 값을 적절히 설정합니다.
[...]
worker_processes  4;
[...]
    keepalive_timeout   2;
[...]
  가상 호스트는 server {} 컨테이너에서 정의합니다. 디폴트 vhost는 /etc/nginx/sites-available/default 파일에 정의되어 있습니다. 파일의 내용을 아래처럼 바꾸겠습니다.
[...]
server {
        listen 80;
        listen [::]:80 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        location /doc/ {
                alias /usr/share/doc/;
                autoindex on;
                allow 127.0.0.1;
                allow ::1;
                deny all;
        }

        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
        #location /RequestDenied {
        #       proxy_pass http://127.0.0.1:8080;
        #}

        #error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/html;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                #fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}
[...]
  IPv4와 IPv6의 80번 포트를 모두 열기 위해 두 listen 줄의 주석을 모두 제거합니다.

  server_name _; 는 모든 vhost의 server_name을 포괄한다는 의미입니다.(물론 www.example.com처럼 호스트명을 지정할 수도 있습니다.)

  index 줄에는 index.php를 추가했습니다. root /usr/share/nginx/html;은 document root 디렉토리를 지정하는 항목입니다.

  PHP에 있어서 중요한 부분은 location ~ \.php$ {} 로서 이 부분의 주석을 제거해야 합니다.

  Nginx를 리로드합니다.
/etc/init.d/nginx reload
  /etc/php5/fpm/php.ini 파일을 열어 cgi.fix_pathinfo=0; 으로 설정합니다.
[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]
  PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload
  Document root 디렉토리인 /usr/share/nginx/html 안에 연동확인용 PHP 파일을 만듭니다.
# vi /usr/share/nginx/html/info.php
<?php
phpinfo();
?>
  웹 브라우저에서 위 파일을 열어 PHP가 작동하는지와 Server API 항목이 FPM/FastCGI인지를 확인합니다. MySQL과 연동하지 않았으므로 MySQL과 관련된 항목은 아직 나오지 않습니다.

6. MySQL과 PHP5 연동
  MySQL과 PHP5를 연동하기 위해 php5-mysql 패키지를 설치합니다. 또한 자주 사용하는 PHP5 모듈도 함께 설치합니다. 설치할 수 있는 PHP5 모듈은 아래 명령어로 검색할 수 있습니다.
apt-cache search php5
  아래처럼 php5-mysql과 함께 원하는 모듈들을 설치합니다.
apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
  APC는 eAccelerator나 Xcache처럼 PHP의 중간 코드를 캐싱하고 최적화하는 opcode 캐셔로서 PHP 페이지의 속도를 높이는데 큰 도움이 됩니다.
apt-get install php-apc
  이제 PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload

7. PHP-FPM이 TCP 연결을 사용하도록 설정
  PHP-FPM은 기본적으로 /var/run/php5-fpm.sock 소켓을 열고 있지만 TCP 연결을 사용하도록 만드는 것도 가능합니다. /etc/php5/fpm/pool.d/www.conf 파일을 열어서 listen 줄을 아래처럼 수정합니다.
[...]
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
[...]
  이것으로 PHP-FPM은 127.0.0.1(localhost)의 9000번 포트를 열게 됩니다. 해당 포트가 미사용 포트인지 확인 후 PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload
  Nginx의 설정 파일인 /etc/nginx/sites-available/default를 열어서 fastcgi_pass unix:/var/run/php5-fpm.sock; 줄을 fastcgi_pass 127.0.0.1:9000;로 바꿉니다.
[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                #fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
[...]
  마지막으로 Nginx를 리로드합니다.
/etc/init.d/nginx reload

8. CGI/Perl 스크립트
  Nginx로 CGI/Perl 스크립트를 사용해야 한다면 이 글을 참고하시기 바랍니다. fcgiwrap 사용을 추천합니다.(챕터4)

2013/07/17 11:37 2013/07/17 11:37
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Setup Master-Slave Replication in MySQL Server
참조 원문 : MySQL replication - Master/Slave

  MySQL 리플리케이션이란 마스터와 슬레이브 DB 서버를 설정하여 마스터의 DB 데이터를 슬레이브의 DB에 자동으로 복사하게 하는 일종의 DB 고가용성(High Availablility) 솔루션입니다. 마스터 서버가 죽는 일이 발생해도 슬레이브 서버를 통해 데이터를 이용할 수 있습니다.

  리플리케이션을 활용하는 방법은 여러가지가 있는데 이 글에서는 가장 간단한 방식인 1마스터/1슬레이브 설정을 소개합니다. 이를 위해 아래의 두 서버로 작업한다고 가정하겠습니다. 또한 이 글에서 사용하는 방법은 MySQL 5.5 이상에서 사용하는 방법으로 그보다 더 낮은 버전은 슬레이브 설정 방법이 약간 다르므로 참고하시기 바랍니다.
MySQL Master system : CentOS 6.4
Master IP Address : 192.168.1.250/24
MySQL Slave system : CentOS 6.4
Slave IP Address: 192.168.1.150/24

MySQL 설치
  iptables이 3306 포트를 허용하도록 /etc/sysconfig/iptables 파일의 적절한 위치에 아래 내용을 추가합니다. 이 작업은 마스터 서버에서만 하면 됩니다.
-A INPUT -p udp -m state --state NEW --dport 3306 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 3306 -j ACCEPT
  iptables를 재시작합니다.
# service iptables restart
  마스터와 슬레이브 서버에 MySQL을 설치하고 서비스를 시작합니다. 아래의 설치 작업은 두 서버에서 모두 실시합니다.
# yum install mysql-server mysql -y
# service mysqld start
# chkconfig mysqld on
  MySQL의 기본 보안 및 Root 패스워드를 설정합니다.
# /usr/bin/mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current password for the root user.  If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!

By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them.  This is intended only for testing, and to make the installation go a bit smoother.  You should remove them before moving into a production environment.

Remove anonymous users? [Y/n]
... Success!
Normally, root should only be allowed to connect from 'localhost'.  This ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]
... Success!

By default, MySQL comes with a database named 'test' that anyone can access.  This is also intended only for testing, and should be removed before moving into a production environment.

Remove test database and access to it? [Y/n]
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far will take effect immediately.

Reload privilege tables now? [Y/n]
... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MySQL installation should now be secure.

Thanks for using MySQL!

MySQL 마스터 설정
  /etc/my.cnf 파일을 열어 [mysqld] 섹션에 아래 내용을 추가합니다.
log-bin = mysql-bin
server-id = 1
  추가가 끝나면 MySQL을 재시작합니다.
# service mysqld restart
  MySQL에 로그인해서 슬레이브 서버가 사용할 계정과 패스워드를 생성합니다. 여기선 슬레이브 계정명으로 mirashi, 패스워드로 passpass를 사용하겠습니다.
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> GRANT REPLICATION SLAVE ON *.* TO 'mirashi'@'%' IDENTIFIED BY 'passpass';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 | myservlab    |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
  파일명(위에선 mysql-bin.000001)과 위치 번호(위에선 106)는 나중에 필요하기 때문에 별도로 적어놓습니다.

MySQL 슬레이브 설정
  /etc/my.cnf 파일을 열어 [mysqld] 섹션에 아래 내용을 추가합니다. 아래 내용을 추가합니다.
server-id = 2
  추가가 끝나면 MySQL을 재시작합니다.
# service mysqld restart
  MySQL에 root 계정으로 로그인해서 아까 마스터 서버에서 SHOW MASTER STATUS; 명령어로 확인했던 마스터 로그 파일에 대한 정보를 슬레이브 서버에 입력합니다.
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.250', MASTER_USER='mirashi', MASTER_PASSWORD='passpass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
Query OK, 0 rows affected (0.03 sec)

mysql> START SLAVE;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.1.250
                Master_User: mirashi
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000001
        Read_Master_Log_Pos: 314
             Relay_Log_File: mysqld-relay-bin.000001
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 314
            Relay_Log_Space: 235
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
  Slave_IO_State가 'Waiting for master to send event'이며 Seconds_Behind_Master 가 'NULL'이 아니면 리플리케이션이 작동하고 있는 것입니다.

리플리케이션 테스트
마스터 서버
# mysql -u root -p
Enter password: Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database myservlab;
Query OK, 1 row affected (0.04 sec)

mysql> use myservlab;
Database changed

mysql> create table sample (c int);
Query OK, 0 rows affected (0.08 sec)

mysql> insert into sample (c) values (1);
Query OK, 1 row affected (0.01 sec)

mysql> select * from sample;
+------+
| c    |
+------+
|    1 |
+------+
1 row in set (0.01 sec)

mysql>
슬레이브 서버
# mysql -u root -p
Enter password: Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use myservlab;
Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from sample;
+------+
| c    |
+------+
|    1 |
+------+
1 row in set (0.01 sec)

mysql>
2013/07/16 13:05 2013/07/16 13:05
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Simple database load balancing with MySQL Proxy

  MySQL 프록시는 클라이언트와 SQL 서버 사이를 지나는 정보를 감사할 수 있으며 악성 질의로부터 MySQL 서버를 보호하거나 데이터베이스를 실제로 변경하지 않고도 클라이언트가 받을 정보를 바꾸기 위해 둘 사이에 흐르는 데이터를 변경할 수도 있습니다. 그 외에도 읽기 연산을 위한 서버를 추가하여 MySQL의 확정성을 높이고 MySQL 서버 사이에서 로드 밸런싱을 하면서 SELECT 문을 읽기 전용 슬레이브 서버로 보내도록 흐름을 최적화할 수 있습니다.

  대부분의 배포판에서 MySQL 프록시 패키지의 이름은 mysql-proxy입니다. CentOS의 경우 이 패키지는 EPEL 저장소에 있습니다. EPEL은 메인 CentOS 저장소에서 제공하지 않는 추가 패키지를 제공하는 저장소입니다. 이는 CentOS 6을 기준으로 아래 명령어를 통해 설치할 수 있습니다.
# rpm -ivh http://ftp-stud.hs-esslingen.de/pub/epel/6/i386/epel-release-6-8.noarch.rpm
  저장소를 추가하면 yum install mysql-proxy 명령어를 통해 설치할 수 있습니다.


설정
  레드햇 계열을 기준으로 MySQL Proxy의 설정 파일은 /etc/sysconfig/mysql-proxy 입니다. 설정 파일에서 아래와 같은 옵션을 설정할 수 있습니다.
  • ADMIN_USER - 프록시의 관리자 인터페이스를 위한 사용자. 디폴트 값으로 놔둔다.
  • ADMIN_PASSWORD - 관리자 계정의 패스워드 평문. 원하는 값으로 변경.
  • ADMIN_LUA_SCRIPT - Lua 프로그래밍 언어로 된 관리자 스크립트. 이 스크립트가 없으면 관리자 인터페이스가 작동하지 않는다. 디폴트 값으로 놔둔다.
  • PROXY_USER - 프록시를 돌릴 시스템 계정. 디폴트는 mysql-proxy며 그냥 놔둔다.
  • PROXY_OPTIONS - 로깅 레벨, 불러올 Lua 스크립트 등 프록시 옵션.
  가장 중요한 것은 PROXY_OPTIONS며 사용 예는 아래와 같습니다.
PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.1.102:3306 --proxy-read-only-backend-addresses=192.168.1.105:3306 --proxy-lua-script=/usr/lib/mysql-proxy/lua/proxy/rw-splitting.lua"
  로깅은 시스템의 syslog(--log-use-syslog)를 사용하여 info 레벨부터 기록(--log-level=info)하며 이는 프록시의 모든 시스템 메시지를 /var/log/messages 파일에 기록한다는 뜻입니다.

  2개의 플러그인을 쓰는데 하나는 기본 프록시 기능을 제공하는 플러그인(--plugins=proxy), 다른 하나는 백엔드 서버에 대한 유용한 정보를 사용자에게 관리자 인터페이스로 제공하는 플러그인(--plugins=admin)입니다.

  백엔드 서버는 하나의 읽기/쓰기 서버(--proxy-backend-adresses=192.168.1.102:3306)와 하나의 SELECT 문만 받는 읽기 전용 서버(--proxy-read-only-backend-addresses=192.168.1.105:3306)로 구성합니다. 읽기 전용 서버는 마스터 읽기/쓰기 서버의 리플리케이션 서버여야 합니다. MySQL 리플리케이션 디자인에 따라 더 많은 읽기/쓰기 서버를 추가할 수 있으며, 모든 질의는 라운드로빈 알고리즘으로 공평히 분배합니다. 프록시는 죽은 서버에 질의를 넘기지 않기 때문에 로드 밸런싱과 패일오버 모두에 유용합니다
.
  마지막 설정(--proxy-lua-script=/usr/lib/mysql-proxy/lua/proxy/rw-splitting.lua)은 읽기와 쓰기 사이에서 질의를 분배하는 Lua 스크립트의 위치입니다. 이는 MySQL 프록시의 가장 유용한 기능 중 하나로서 마스터 MySQL 서버의 부하를 줄이기 위해 SELECT 문을 읽기에 최적화된 슬레이브 서버로 보내는 역할을 합니다.

  하지만 이 Lua 스크립트는 EPEL 패키지에 기본으로 포함되어 있지 않습니다. 이 스크립트는 공식 MySQL 프록시 패키지를 통해 얻을 수 있습니다. 다운로드 옵션에서 generic Linux archive를 받아 압축을 풀면 디렉토리가 생기며 그 밑에 있는 share/doc/mysql-proxy 디렉토리에서 rw-splitting.lua 파일을 찾을 수 있습니다. 그 파일을 프록시 서버의 /usr/lib/mysql-proxy/lua/proxy/ 디렉토리에 복사합니다.


모니터링
  설정이 모두 끝나면 CentOS를 기준으로 아래 명령어를 통해 MySQL 프록시를 시작합니다.
# mysql proxy start
  시작에 성공했다면 /var/log/messages 파일에 아래와 비슷한 출력이 남을 것입니다.
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) mysql-proxy 0.8.2 started
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) proxy listening on port :4040
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) added read/write backend: 192.168.1.102:3306
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) added read-only backend: 192.168.1.105:3306
  지금 설정한 프록시를 테스트하려면 앞서 설명한 것처럼 MySQL 리플리케이션이 설정되어 있어야 합니다.

  프록시가 활동을 시작하면 MySQL 클라이언트로 서버의 4041 포트에 접속하여 관리자 인터페이스를 통해 상태를 확인할 수 있습니다. 만약 MySQL 프록시의 IP 주소가 192.168.1.201이라면 아래의 명령어로 프록시의 관리자 인터페이스에 접속할 수 있습니다. 관리자 로그인 ID와 패스워드는 /etc/sysconfig/mysql-proxy 파일에 정의한 것을 사용합니다.
$ mysql --host=192.168.1.201 --port=4041 -u admin -p
  관리자 인터페이스는 단순하며 Lua 관리자 스크립트에 따라 보통은 아래의 명령어만 사용할 수 있습니다.
SELECT * FROM backends;
  MySQL 프록시가 제대로 작동 중이라면 아래와 같은 결과가 나와야 합니다.
+-------------+--------------------+-------+------+------+-------------------+
| backend_ndx | address            | state | type | uuid | connected_clients |
+-------------+--------------------+-------+------+------+-------------------+
|           1 | 192.168.1.102:3306 | up    | rw   | NULL |                 0 |
|           2 | 192.168.1.105:3306 | up    | ro   | NULL |                 0 |
+-------------+--------------------+-------+------+------+-------------------+
2013/07/07 15:39 2013/07/07 15:39
Posted
Filed under 쉘 스크립트
원문 : http://www.linuxforum.com/threads/backup-all-databases-nightly-w-mysqldump.692/

  당일 날짜로 된 디렉토리를 만들어 그 안에 DB를 백업해 넣는 스크립트입니다.
#!/bin/bash

DB_BACKUP="/backups/mysql_backup/`date +%Y-%m-%d`"
DB_USER="root"
DB_PASSWD="secretttt"
HN=`hostname | awk -F. '{print $1}'`

# Create the backup directory
mkdir -p $DB_BACKUP

# Remove backups older than 10 days
find /backups/mysql_backup/ -maxdepth 1 -type d -mtime +10 -exec rm -rf {} \;

# Option 1: Backup each database on the system using a root username and password
for db in $(mysql --user=$DB_USER --password=$DB_PASSWD -e 'show databases' -s --skip-column-names|grep -vi information_schema);
do mysqldump --user=$DB_USER --password=$DB_PASSWD --opt $db | gzip > "$DB_BACKUP/mysqldump-$HN-$db-$(date +%Y-%m-%d).gz";
done

# Option 2: If you aren't using a root password then comment out option 1 and use this
# for db in $(mysql -e 'show databases' -s --skip-column-names|grep -vi information_schema);
# do mysqldump --opt $db | gzip > "$DB_BACKUP/mysqldump-$HN-$db-$(date +%Y-%m-%d).gz";
# done
  mysql의 root 계정 패스워드가 들어있기 때문에 퍼미션을 700으로 변경 후 cron에 등록하면 됩니다.
2013/06/23 17:03 2013/06/23 17:03
Posted
Filed under 쉘 스크립트
참조 원문 : Back up MySQL Databases with a Simple Bash Script
관련 글 : mysqldump로 MySQL DB 백업하기

  LPIC 공부한다는 변명하에 와일드 플래닛에 빠져 살아 포스팅이 사라진 요즘 날로 포스팅할 꺼리가 보여서 낼름 주워먹으러 왔습니다. MySQL DB를 백업하는 간단명료한 스크립트입니다.
NOW=`date +"%Y-%m"`;
BACKUPDIR="location/of/your/backup/dir/$NOW";

### Server Setup ###
#* MySQL login user name *#
MUSER="user";

#* MySQL login PASSWORD name *#
MPASS="pass";

#* MySQL login HOST name *#
MHOST="your-mysql-ip";
MPORT="your-mysql-port";

# DO NOT BACKUP these databases
IGNOREDB="
information_schema
mysql
test
"

#* MySQL binaries *#
MYSQL=`which mysql`;
MYSQLDUMP=`which mysqldump`;
GZIP=`which gzip`;

# assuming that /nas is mounted via /etc/fstab
if [ ! -d $BACKUPDIR ]; then
  mkdir -p $BACKUPDIR
else
 :
fi

# get all database listing
DBS="$(mysql -u $MUSER -p$MPASS -h $MHOST -P $MPORT -Bse 'show databases')"

# SET DATE AND TIME FOR THE FILE
NOW=`date +"d%dh%Hm%Ms%S"`; # day-hour-minute-sec format
# start to dump database one by one
for db in $DBS
do
        DUMP="yes";
        if [ "$IGNOREDB" != "" ]; then
                for i in $IGNOREDB # Store all value of $IGNOREDB ON i
                do
                        if [ "$db" == "$i" ]; then # If result of $DBS(db) is equal to $IGNOREDB(i) then
                                DUMP="NO";         # SET value of DUMP to "no"
                                #echo "$i database is being ignored!";
                        fi
                done
        fi

        if [ "$DUMP" == "yes" ]; then # If value of DUMP is "yes" then backup database
                FILE="$BACKUPDIR/$NOW-$db.gz";
                echo "BACKING UP $db";
                $MYSQLDUMP --add-drop-database --opt --lock-all-tables -u $MUSER -p$MPASS -h $MHOST -P $MPORT $db | gzip > $FILE
        fi
done
  몇몇 변수를 고쳐주면 바로 사용할 수 있으며 변수명과 내용은 아래와 같습니다.
  • BACKUPDIR : 백업을 저장할 디렉토리
  • MUSER : MySQL 유저
  • MPASS : MySQL 유저 패스워드
  • MHOST : MySQL 서버의 IP 주소나 도메인명(예: localhost)
  • MPORT : MySQL 포트(디폴트: 3306)
  이제 스크립트 파일에 실행 권한을 줍니다. 또한 파일 안에 패스워드가 있으므로 아무나 읽지 못하게 읽기 권한을 적절히 설정합니다. 이제 필요할 때 수동으로 실행하거나 crontab을 이용하여 정기적으로 실행하면 됩니다. 예를 들어 매일 자동으로 백업을 하게 하려면 'crontab -e'를 실행하여 아래의 내용을 추가합니다.
@daily /스크립트/경로/스크립트명.sh
  만약 DB가 크다면 max_packet_size의 디폴트 값이 문제가 되어 실행에 실패할 수도 있는데 그럴 경우에는 mysqldump 명령어 부분에 아래와 같은 옵션을 추가하면 됩니다.
--max_allowed_packet=500M
2011/01/17 15:59 2011/01/17 15:59
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : 10 Command-line Timesavers for MySQL Tasks

  MySQL 클라이언트에서 유용히 써먹을 수 있는 10가지 명령어입니다.


1. 자동으로 로그인
  MySQL 서버가 제대로 설정되어 있다면 인증 절차가 필요합니다. 보통은 mysql 명령어에 인자로 유저명을 입력한 후 패스워드를 입력해서 로그인을 합니다.
%>mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
  이 과정을 자동으로 넘기려면 홈 디렉토리에 .my.cnf라는 파일을 만들고 아래의 내용을 적습니다. 만약 윈도우라면 MySQL 설치 디렉토리에 my.ini라는 파일명으로 만들어야 합니다.
[client]
host     = SQL 서버
user     = 유저명
password = 패스워드
  이제 mysql 명령어만 쳐도 바로 접속할 수 있게 됩니다. 주의할 점은 파일에 로그인 정보가 들어가 있기 때문에 퍼미션을 남이 볼 수 없도록 적절히 조정해야 한다는 겁니다.


2. 자동으로 데이터베이스 접근
  로그인이 끝나면 원하는 데이터베이스로 접근을 해야 합니다. 일반적으로는 use 명령어를 사용하지요.
mysql>use mydatabase;
  근데 매번 같은 데이터베이스를 사용할 경우 이것도 귀찮습니다. 위에서 만들었던 설정 파일의 '[client]' 섹션 내에 아래의 줄을 추가하면 로그인 후 지정한 데이터베이스로 접근하게 됩니다.
database = your_database_name

 
3. 스크립트를 이용한 명령어 입력
  스키마를 직접 코딩할 경우 미리 SQL문을 파일로 저장한 후에 아래의 방법으로 사용할 수 있습니다. 물론 앞서 설명한 팁을 사용하지 않는다면 인증과 관련한 옵션도 적어야 하고 그에 이어 패드워드도 적어야 합니다.
%>mysql < schema.sql
  참고로 원문의 필자는 새로운 데이터베이스의 스키마와 관계를 디자인할 때 MySQL Workbench(스키마를 그래픽으로 관리, MySQL 서버와의 변경점 동기화, SQL문을 파일로 익스포트 및 MySQL에 임포트)를 이용한다고 합니다.


4. 출력을 수직으로 정렬
  MySQL은 테이블에 칼럼이 조금만 많아도 보기가 참 짜증납니다. 아래처럼요.
mysql> select * from accounts where username = 'wjgilmore';
+----+-----------+------------------+------------------------------
----+----------+-----------+------------+-----------+--------------
--------------------+---------------------+---------------------+
| id | username  | email            | password                   
     | zip_code | latitude  | longitude  | confirmed | recovery    
                    | created_on          | last_login          |
+----+-----------+------------------+-------------------------------
---+----------+-----------+------------+-----------+-----------------
-----------------+---------------------+---------------------+
|  7 | wjgilmore | wj@wjgilmore.com | 2b877b4b825b48a9a0950dd5bd1f264d
 | 43201    | 39.984577 | -83.018692 |         1 |
8bnnwtqlt2289q2yp81tuge82fty501h | 2010-09-16 14:48:41 | 2010-10-27 15:49:44 |
+----+-----------+------------------+----------------------------------
+----------+-----------+------------+-----------+----------------------
------------+---------------------+---------------------+
  G 명령어를 사용하면 위 내용을 아래처럼 깔끔하게 수직 정렬로 변환하여 출력할 수 있습니다.
mysql> select * from accounts where username = 'wjgilmore'\G
*************************** 1. row ***************************
        id: 7
  username: wjgilmore
     email: wj@wjgilmore.com
  password: 2b877b4b825b48a9a0950dd5bd1f264d
  zip_code: 43201
  latitude: 39.984577
 longitude: -83.018692
 confirmed: 1
  recovery: 8bnnwtqlt2289q2yp81tuge82fty501h
created_on: 2010-09-16 14:48:41
last_login: 2010-10-27 15:49:44


5. Tab키 자동완성 기능 활성화
  Tab키를 이용해 데이터베이스, 테이블, 칼럼 이름에 대한 자동완성 기능을 사용할 수 있습니다. mysql을 실행할 때 --auto-rehash 옵션을 넣거나 앞서 본 설정 파일(또는 MySQL 디렉토리의 my.cnf 또는 my.ini 파일)에서 '[mysql]' 섹션에 'auto-rehash'라는 줄을 넣으면 됩니다.
[mysql]
auto-rehash
  그런데 제가 우분투 저장소의 MySQL로 확인해 본 결과 이게 디폴트 옵션입니다. 따라서 이 기능을 일부로 막은 MySQL 서버가 아닌 이상 직접 이 설정할 일은 없을 것 같습니다.


6. 프롬프트 변경
  프롬프트를 현재 사용 중인 데이터베이스로 나오게 만들면 엉뚱한 데이터베이스에 명령을 내리는 것을 미연에 방지할 수 있습니다. 두 가지 방법이 있는데 첫 번째 방법은 MySQL 서버에 접속해서 아래의 명령어를 통해 해당 접속 세션 동안만 변경시키는 겁니다.
mysql>prompt [\d]>
  두 번째 방법은 아래의 줄을 이전의 그 설정 파일에 추가해서 영구적으로 반영시키는 겁니다.
prompt = [d]>
  MySQL 매뉴얼을 참조하여 테이터베이스 이름 말고도 시간, 날짜, 호스트명, 유저명 등을 넣을 수 있습니다.


7. '안전 업데이트'를 통해 대형참사 방지
  'UPDATE' 명령어를 쓸 때 'WHERE'를 빼먹고 써서 대형참사를 불러일으키는 경우가 있습니다. 예를 들어 값을 찾아 변경하는 아래의 SQL을 봅시다.
mysql>UPDATE users set User = 'EarthCrash' WHERE User = 'test';
  위의 SQL 문을 실행해야 하는데 실수로 아래의 SQL 문을 실행했다면?
mysql>UPDATE users set User = 'EarthCrash';
  users 테이블의 User 칼럼에 있는 모든 값이 'EarthCrash'로 바뀌는 대형참사가 발생합니다. 이런 참사를 막는 방법은 매우 간단합니다. 지금까지 계속 언급한 그 설정 파일에 아래의 줄을 추가하면 됩니다.
safe-updates


8. 명령어 문서 사용
  'help' 명령어를 치면 많이 사용하는 명령어의 목록이 나오는데 그 뒤에 자세히 알고 싶은 명령어를 입력하면 문법을 비롯한 상세한 설명을 볼 수 있습니다.
mysql>help describe;
Name: 'DESCRIBE'
Description:
Syntax:
{DESCRIBE | DESC} tbl_name [col_name | wild]

DESCRIBE provides information about the columns in a table. It is a
shortcut for SHOW COLUMNS FROM. These statements also display
information for views. (See [HELP SHOW COLUMNS].)
...


9. 페이저(Pager) 사용
  테이블의 열이 많아 출력 결과가 한 화면을 넘어가면 흔히 'LIMIT'절을 사용하곤 하는데 그 대신 시스템의 페이징 유틸리티(more)를 이용해 페이저를 활성화시켜 편하게 볼 수 있습니다.
mysql>pager more
PAGER set to 'more'
  페이저를 비활성화하고 싶을 땐 'nopager' 명령어를 사용하면 됩니다.


10. 출력을 파일로 저장
  SQL 문의 출력 결과를 텍스트 파일을 저장해야 할 때가 있는데 'SELECT INTO OUTFILE' 명령어를 사용할 수도 있지만 'tee' 명령어를 활성화하여 출력 파일명을 지정하면 이후 모든 출력이 지정한 파일로 보내집니다.
mysql>tee sales_report.txt


2010/12/01 16:42 2010/12/01 16:42
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : The Perfect Server - Ubuntu Maverick Meerkat (Ubuntu 10.10) [ISPConfig 2]
ISPConfig 홈페이지 : http://www.ispconfig.org/


  우분투 서버 10.10를 가지고 OS 설치부터 ISP와 호스팅에 필요한 모든 서비스를 대~충 설치하는 내용의 포스팅입니다. 자세한 세팅 내용이나 친절한 설명 같은 건 없습니다. 설치하는 서비스 목록은 아래와 같습니다.
  • 웹 서버: Apache 2.2.16 + PHP 5.3.3, Python, Ruby, WebDAV
  • Database Server: MySQL 5.1.49
  • Mail Server: Postfix(SMTP-AUTH와 TLS 포함)
  • DNS Server: BIND9
  • FTP Server: proftpd
  • POP3/IMAP: Courier-POP3/Courier-IMAP(Maildir 포맷 방식 사용)
  • 웹 사이트 통계: Webalizer
  • 웹 호스팅 컨트롤 패널: ISPConfig 2
  • 계정 용량 관리: Quota
  ...위의 목록을 이 포스팅에서 다 해결한다는 것을 생각하면 이미 얼마나 대충 진행될 것인지를 알 수 있습니다. ISPConfig는 3까지 나왔는데 앞으로 설명할 방법은 ISPConfig 2하고만 제대로 된다고 하니 참고하시기 바랍니다.


more..



more..



more..



more..



more..



more..



more..



more..



more..



more..


more..



more..



more..



more..



more..



more..



more..



more..



more..



2010/11/30 15:44 2010/11/30 15:44
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Using mysqldump to Back Up Your MySQL Database

  저번에 SSH와 관련된 글에서도 mysqldump를 이용해서 백업을 하는 모습이 잠깐 등장했었는데요. 이걸 이용해서 서버의 모든 데이터베이스를 백업할 수도 있고 하나의 데이터베이스나 테이블 단위로 백업하는 것도 가능합니다. 그래서 이번에는 MySQL에서 가장 기초적인 백업 도구인 mysqldump를 이용한 백업에 대해 알아보겠습니다. 터미널에서 mysqldump를 쳐보면 대략 아래와 같은 실행법이 출력됩니다.
mirashi@myservlab:~$ mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
  예를 들어 모든 데이터베이스의 스키마와 데이터를 backup.sql이라는 이름으로 저장하려면 다음과 같이 명령어를 사용하면 됩니다. 물론 루트가 아니라도 모든 DB를 읽을 수 있는 권한이 있는 계정이 있다면 그 계정을 사용하면 되겠습니다
mysqldump -u root -p --all-databases > backup.sql
Enter password:   <- 패스워드 입력
  만들어진 파일을 까보면 SQL 문으로 이뤄진 것을 볼 수 있는데 DB를 하나하나 Use로 선택하면서(없으면 생성) 기존의 테이블을 DROP으로 지운 후 백업할 당시의 내용으로 다시 만드는 것을 볼 수 있습니다.

  아래는 'singleDB'라는 이름의 데이터베이스를 db_backup.sql이라는 파일로 백업하는 예입니다.
mysqldump -u root -p singleDB > db_backup.sql
  그리고 아래는 'singleDB'라는 데이터베이스 안에 있는 'singleTABLE'이라는 이름의 테이블을 table_backup.sql이라는 파일로 백업하는 예입니다.
mysqldump -u root -p singleDB singleTABLE > table_backup.sql
  경우에 따라서는 데이터베이스의 스키마만 백업하고 싶을 수도 있는데 그럴 때는 아래처럼 --no-data 옵션을 추가하면 됩니다.
mysqldump -u root -p --no-data singleDB > db_backup.sql
  이와 반대로 데이터만 백업하고 싶을 때는 --no-create-info 옵션을 주면 됩니다.
mysqldump -u root -p --no-create-info singleDB > db_backup.sql
  이제 이걸 응용해서 cron을 이용해 자동으로 백업을 하도록 만들어보겠습니다. 먼저 DBbackup.sh 이란 이름으로 아래의 간단한 스크립트를 만듭시다. 스크립트의 저장 위치는 /var/scripts, MySQL 루트 계정의 패스워드는 abcd, 백업할 데이터베이스명은 singleDB, 백업의 저장 위치는 /var/backup, 파일명은 'DBbackup-년월일.sql'로 가정하겠습니다.
#!/bin/sh
mysqldump -uroot -pabcd singleDB > /var/backup/DBbackup-`date +%Y%m%d`.sql
  파일 내에 MySQL 루트 계정의 비번이 노출되어 있으므로 퍼미션 관리에 신경써야 합니다. 이제 'crontab -e'를 통해 특정 시간에 스크립트가 실행되도록 만듭니다. 아래 예에서는 새벽 3시에 돌아가도록 하고 있습니다.
0 3 * * * /var/script/DBbackup.sh
  지금까지 알아본 방법은 MySQL에서 백업을 하는 방법 중 가장 간단한 방법입니다. 만약 증분 백업을 원하신다면 binary_log 툴을 이용하는 방법이 있고 이중화를 위한 마스터/슬레이브 구성(마스터 서버의 데이터를 슬레이브 서버로 복사)을 원하신다면 Replication을 이용하는 방법이 있습니다. 아마 언젠가 관련 내용을 포스트하는 날이 오지 않을까 싶네요.


2010/11/18 15:29 2010/11/18 15:29