2013년 4월 10일 수요일

MySQL cluster 7.2 인스톨과 설정

MySQL Cluster 7.2 인스톨 설정

클러스터 구성으로 안정적인 가동을 원한다면、적어도6대이상의 머신이 필요하지만、이번은 테스트 구성이므로 MGM과 SQL서버를 같은OS에 인스톨、datanode×2를 각각의 가상 환경에 구성 한다.
구성 호스트명:역할
mgm(1CPU 512M 10G)・・・MGM(메니지먼트)+API노드(구SQL노드)
datanode1(1CPU 512M 10G)・・・데이터노드1
datenode2(1CPU 512M 10G)・・・데이터노드2

인스톨은 소스인스톨.
먼저 사이트에서 소스를 받아온다.


wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.2/mysql-cluster-gpl-7.2.1.tar.gz/from/http://mysql.mirrors.pair.com/
인스톨은 cmake
cmake . -DCMAKE_INSTALL_PREFIX=/var/lib/mysql
make
make install
인스톨은 여기를 참[사이트]를 참고해 、전 노드를 인스톨 한다.

완료되면 먼저mgm노드에서 설정을 한다.
MySQL Cluster의 설정은 my.cnf가 아니라、config.ini를 사용한다.(my.cnf는API노드에서 사용한다).
config.ini의 읽어들이는 순서는 my.cnf와 같으므로 、이하 어딘가의 패스에 작성한다.
/etc/my.cnf
/etc/mysql/my.cnf
$MYSQL_HOME
-DCMAKE_INSTALL_PREFIX에서 설정된 path
$HOME/.my.cnf
소스를 이용한 컴파일을 한경우、my.cnf와 같이 전개한 디렉토리안에config.ini의 샘플이 있으므로 、일단 이것을 카피
$ cd /path/to/mysql-cluster-gpl-7.2.1/support-files
$ cp config.small.ini /etc/config.ini
파일을 열어 자기 환경에 맞추어 변경
$ vi /etc/config.ini

[NDBD DEFAULT]
NoOfReplicas: 2
DataDir: /usr/lib/mysql
FileSystemPath: /usr/lib/mysql
TransactionDeadlockDetectionTimeout: 51200
TimeBetweenEpochsTimeout: 51200
MaxNoOfOrderedIndexes: 5120

DataMemory: 600M
IndexMemory: 100M
BackupMemory: 64M

[MGM DEFAULT]
PortNumber: 1186
DataDir: /usr/lib/mysql

[NDB_MGMD]
NodeId: 1
HostName: 192.168.122.1
ArbitrationRank: 1

[NDBD]
NodeId: 2
HostName: 192.168.122.2

[NDBD]
NodeId: 3
HostName: 192.168.122.3

[API]
NodeId: 4
HostName: 192.168.122.1
ArbitrationRank: 2
[NDBD DEFAULT]에는 글로벌 설정을 한다.
NoOfReplicas・・・복제세트의 수. 2로 설정하면 2x2 의 클러스터 설정이 되지만、이번에는 노드x2 이므로 관계없어보임
DataDir・・pid,에러파일、추적파일 저장패스
FileSystemPath・・・로그、데이터 패스
TransactionDeadlockDetectionTimeout・・・쿼리실행시、다른 노드가 대기하는 시간
MaxNoOfOrderedIndexes・・・순서화된 인덱스의 최대크기

[MGM DEFAULT]はMGM노드의 설정을 적고、[NDB_MGMD]는 데이터노드의공통설정을 기재한다。NodeId는유니크한 번호를설정.
[NDBD]는데이터노드 고유의 설정을 노드수 만큼 기재한다。NodeId는 유니크 하게.
[API]는SQL노드고유의 설정. 등록할 노드수 만큼 기재(이번에는 1개)


카피한 config.ini에는 
TransactionDeadlockDetectionTimeout、 MaxNoOfOrderedIndexes 는 기재되어있지않다、TransactionDeadlockDetectionTimeout 이 디폴트(120밀리초) 면초기 데이터 insert시 lock wait timeout이 발생、
MaxNoOfOrderedIndexes 값을 크게 하지 않으면 테이블 작성시아래 에러가 발생 SQL 실행되지 않음. 
ERROR 1005 (HY000) at line 651: Can't create table 'test_db.test_table' (errno: 136)
하지만값을 너무 크게하면 데이터 노드 부하가 올라간다고 함.
이외、설정가능한 값은 [여기] 를 참조

전체적으로 설정완료되면、MGM노드로부터 관리 프로그램을 기동.

# /var/lib/mysql/bin/ndb_mgmd -f /usr/local/mysql/config.ini --ndb-nodeid=1 --initial
초기기동시나 config.ini을 변경했을시는 --initial옵션을 추가해준다.
정상적으로 기동하면 콘솔 cui에 들어가
# /var/lib/mysql/bin/ndb_mgm
show로 상태확인

ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 (not connected, accepting connect from 192.168.122.2)
id=3 (not connected, accepting connect from 192.168.122.3)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.122.1 (mysql-5.5.15 ndb-7.2.1)

[mysqld(API)] 1 node(s)
id=4 (not connected, accepting connect from 192.168.122.1)

데이터노드、SQL노드가 기동되 있지 않기 때문에  접속되어있는 노드는 mgm노드 뿐

데이터노드 를 기동한다.
mgm노드의 config.ini 정상적으로 기입되어 있다면 기동은 아래 한줄로 OK
# /usr/local/mysql/bin/ndbd --ndb-connectstring="192.168.122.1" --initial
아래 메시지가 표시되면 성공
2011-11-05 02:59:13 [ndbd] INFO -- Angel connected to '192.168.122.1:1186'
2011-11-05 02:59:13 [ndbd] INFO -- Angel allocated nodeid: 3
MGM노드 로 돌아가 상태를 확인

ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.122.2 (mysql-5.5.15 ndb-7.2.1, starting, Nodegroup: 0)
id=3 @192.168.122.3 (mysql-5.5.15 ndb-7.2.1, starting, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.122.1 (mysql-5.5.15 ndb-7.2.1)

[mysqld(API)] 1 node(s)
id=4 (not connected, accepting connect from 192.168.122.1)
데이터 노드가 접속 됨
mysql유저를 작성、data디렉토리에권한을 부여、mysql_install_db실행등 통상적
mysqld와 똑같은 작업을 실시 mysqld를 기동한다

# /var/lib/mysql/support-files/mysql.server start
기동하면 mgm에서 확인

ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.122.2 (mysql-5.5.15 ndb-7.2.1, starting, Nodegroup: 0)
id=3 @192.168.122.3 (mysql-5.5.15 ndb-7.2.1, starting, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.122.1 (mysql-5.5.15 ndb-7.2.1)

[mysqld(API)] 1 node(s)
id=4 @192.168.122.1 (mysql-5.5.15 ndb-7.2.1)
전 노드가 작성되어있는것을 확인
mysql에접속해、데이터베이스、테이블을 작성
mysql> create database ndb_test; Query OK, 1 row affected (0.32 sec)
mysql> use ndb_test;
mysql> create table ndb_test_table (id int(11) auto_increment,data varchar(64), primary key(id)) engine=ndbcluster; Query OK, 0 rows affected (1.79 sec)
ndbcluster가 인식됨。

ここまでできたので、試しに本稼動しているサービスのデータ(約1.9G)を流し込みを行い、通常使ってるSQLを実行することに。
選んだのは会員検索系のSQLで4つのテーブルをinner joinし、さらに15のテーブルをleft joinするという大物!
ちなみにこのクエリをMySQL5.5で実行すると
+--------+
| count |
+--------+
| 252690 |
+--------+
1 row in set (48.38 sec)
約50秒かかった。
クラスタ環境では?

+--------+
| count |
+--------+
| 252690 |
+--------+
1 row in set (6 min 16.19 sec)
・・・

amazon cloud ec2 아마존 클라우드 환경 구축 002

아마존 클라우드 서비스에 연결하기.

1. 준비물
 ㅁ 먼저 인스턴스 생성시 저장해 두었던  공개암호 파일

2. 공개암호파일을 이용해 개인 암호파일 생성.
 ㅁ 아마존 클라우드에 접속하기 위해서는 암호파일이 필요하다. 이 암호 파일을 생성하는 모듈은 다음을 사용한다.
 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

자새한 내용은 아래 참조
http://enigma777.egloos.com/3279385

xxxx.ppk 파일을 생성.

2. Tera Term 설치
  서버에 연결하는 프로그램은 많이 있지만 개인적으로 teraterm이 젤 편한것 같다.
  다운로드는 아래에서..
 ㅁ http://ttssh2.sourceforge.jp/index.html.en

  Trea Term을 설치후 호스트에 글러벌 IP 를 기입후 SSH2 가 선택된것을 확인후 엔터



접속에 성공하면 암호를 묻는창이 나온다.

아이디는 ec2-user
페스워드는 공백

암호는 1에서 생성한 ppx키를 설정해 주면 된다.

접속 성공.



2013년 4월 7일 일요일

amazon cloud ec2 아마존 클라우드 환경 구축 001

아마존 클라우두 EC2 서버 무료 사용하기..
회사에서 현제 사용하고 있는 테스트 서버실을 패쇠 한다는 연락을 받았다.. 혼방 서버를 운용하고 있는 곳으로 옮기기에는 장소가 부족하다고 해서 테스트 서버구축을 아마존 클라우드로 실행하기로 결정한다.

1. 아마존 클라우드 서버 가입하기.
http://aws.amazon.com/
- 회원 가입하기
- 카드정보입력및, 전화로 인증 등을 해준다.

2. 아마존 클라우드 서버 관리 페이지
https://console.aws.amazon.com/console/home?region=ap-northeast-1

- 등록이 끝나면 위 링크에서 관리가 가능하다.
EC2를 선택, 오른쪽 위 지역 선택에서 클라우드 서버가 가까운곳으로 이동.
 1.Instances 에서 서버를 만들어준다.
 

2. NETWORK & SECURITY
 - security groups 로 이동해 아래와 같이 포트를 추가 해준다.
ping을 날려 보려면, ICMP를 설정. TCP 22 를 추가하면 생성된 클라우드 서버에 접속 가능.

3. 위와같이 하면 클라우드 서버를만들고, 포트를 열어주는것 까지 OK. 위에 접속하기 위해서 글로벌 IP를 취득 하기위해서
- Elastic IPs 텝에 이동 - Allocate New Address 해서 새로운 IP를 취득한다. - 취득시 Instance해둔 서버에 연결

2011년 11월 29일 화요일

linux 관련

CentOS release 5.5 (Final)

설치 방법
http://blog.daum.net/kimuks/7531860

mysql 설치법
http://blog.naver.com/PostView.nhn?blogId=seban21&logNo=70105302948

2011년 11월 27일 일요일

html css 관련 링크

 css div 래이아웃 샘플
http://coding.smashingmagazine.com/2007/01/12/free-css-layouts-and-templates/

2011년 11월 22일 화요일

google analytics 외부 클릭 집계 모듈 설치

소스

        if("2".equals(TYPE)) {
                result = "<a href=\""+ LINK_SRC + "\" target=\"_blank\" onClick=\"recordOutboundLink(this, '" + ID + "','" + NAME + "'" + ");return false;\">" + TEXT + "</a>";
            // banner
            } else {
                result = "<a href=\""+ LINK_SRC + "\" target=\"_blank\" onClick=\"recordOutboundLink(this, '" + ID + "','" + NAME + "'" + ");return false;\"><img src=\"" + IMG_SRC + "\"></a>";
            }


여기에서 ID 와 네임은( 카테고리, 엑션 ) 추후에 google analytics 에서 보기 쉽게하기위해 설정



구글 설치(해더 이거나 아니거나 상간업음)
 <script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-26953161-1']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

function recordOutboundLink(link, category, action) {
  try {
    var myTracker=_gat._getTrackerByName();
    _gaq.push(['_trackEvent', category , action]);
    if (link.target == '_blank') {
        window.open(link.href);
    } else {
        setTimeout('document.location = "' + link.href + '"', 100)
    }
  }catch(err){}
}
</script>


http://www.google.com/support/googleanalytics/bin/answer.py?answer=55527&hl=ko

2011년 9월 1일 목요일

java ssl 증명서 없는 rss 가지고 오기.

import java.io.*;
import java.net.*;
import javax.net.ssl.*;

public class testClass {
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String urlStr = "https://car.jp.msn.com/rss/business.aspx";
        try{
            URL url = new URL(urlStr);
            HttpURLConnection http = null;
           
            if (url.getProtocol().toLowerCase().equals("https")) {
                trustAllHosts();
                HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
                https.setHostnameVerifier(DO_NOT_VERIFY);
                http = https;
            } else {
                http = (HttpURLConnection) url.openConnection();
            }
           
            BufferedInputStream bis = new BufferedInputStream(http.getInputStream());
            byte[] buffer = new byte[2048];
            int length = 0;
            byte[] contentBytes = null;
            ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
            while ((length = bis.read(buffer)) >= 0) {
                    baos.write(buffer, 0, length);
            }
           
            contentBytes = baos.toByteArray();
            String result = new String(contentBytes, "utf-8");       
           
            System.out.println(result);
           
            bis.close();
            baos.close();
       
        }catch(Exception e) {
            e.printStackTrace();
        }
       
    }

    private static void trustAllHosts() {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[] {};
                }

                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] chain,
                        String authType)
                        throws java.security.cert.CertificateException {
                    // TODO Auto-generated method stub
                  
                }

                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] chain,
                        String authType)
                        throws java.security.cert.CertificateException {
                    // TODO Auto-generated method stub
                  
                }
        } };

        // Install the all-trusting trust manager
        try {
                SSLContext sc = SSLContext.getInstance("TLS");
                sc.init(null, trustAllCerts, new java.security.SecureRandom());
                HttpsURLConnection
                                .setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
                e.printStackTrace();
        }
    }
  
    final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };
}

jsp 소스 ssl증명서 없는 rss 가지고오기

<%@ page contentType = "text/html; charset=utf-8"%>
<%@ page import="java.io.*"  %>
<%@ page import="java.net.*"  %>
<%@ page import="javax.net.ssl.*" %>
<%
    // TODO Auto-generated method stub
    String urlStr = "https://car.jp.msn.com/rss/business.aspx";
    try{
        URL url = new URL(urlStr);
        HttpURLConnection http = null;
       
        if (url.getProtocol().toLowerCase().equals("https")) {
            trustAllHosts();
            HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
            https.setHostnameVerifier(DO_NOT_VERIFY);
            http = https;
        } else {
            http = (HttpURLConnection) url.openConnection();
        }
       
        BufferedInputStream bis = new BufferedInputStream(http.getInputStream());
        byte[] buffer = new byte[2048];
        int length = 0;
        byte[] contentBytes = null;
        ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
        while ((length = bis.read(buffer)) >= 0) {
                baos.write(buffer, 0, length);
        }
       
        contentBytes = baos.toByteArray();
        String result = new String(contentBytes, "utf-8");       
       
        System.out.println(result);
        request.setAttribute("msg", result);
        bis.close();
        baos.close();
   
    }catch(Exception e) {
        e.printStackTrace();
    }
%>
<%!
private static void trustAllHosts() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return new java.security.cert.X509Certificate[] {};
            }

            public void checkClientTrusted(
                    java.security.cert.X509Certificate[] chain,
                    String authType)
                    throws java.security.cert.CertificateException {
                // TODO Auto-generated method stub
              
            }

            public void checkServerTrusted(
                    java.security.cert.X509Certificate[] chain,
                    String authType)
                    throws java.security.cert.CertificateException {
                // TODO Auto-generated method stub
              
            }
    } };

    // Install the all-trusting trust manager
    try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection
                            .setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
            e.printStackTrace();
    }
}

final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
};
%>
${msg}

2011년 8월 13일 토요일

MYSQL 정리 02- (update)

http://www.yukun.info/blog/2008/11/mysql-update-delete-record.html


前回はレコードの検索クエリの作成方法を扱いましたが、今回は既存のレコードのフィールド値を更新するUPDATE文と、レコードを削除するDELETE文の練習をしてみます。
まず、扱うテーブル内のレコードの一覧を下記に示します。これは前回と同じです。
1
2
3
4
5
6
7
8
9
10
11
12
mysql> SELECT * FROM book_list;
+---------+--------+--------+-------+-----------------------+
| book_id | title  | author | price | comments              |
+---------+--------+--------+-------+-----------------------+
|       1 | book_A | auth_A |  1500 | good, bad, excellence |
|       2 | book_B | auth_B |  2900 | not bad, good         |
|       3 | book_C | auth_C |  1800 | interesting, amazing  |
|       4 | book_D | auth_D |   700 | sad, depress          |
|       5 | book_E | auth_E |  1200 | good, funny           |
|       6 | book_F | auth_C |  3500 | bored, difficult      |
|       7 | book_G | auth_A |   400 | very good!, excellent |
+---------+--------+--------+-------+-----------------------+

UPDATE文でレコードの更新

それでは試しに、「値段が1000円を超え2000円未満の本を100円値下げする」SQL文を書いてみます。最初は念のため修正するレコードをSELECT文で出力してみます。
1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM book_list
    -> WHERE price > 1000
    -> AND price < 2000;
+---------+--------+--------+-------+-----------------------+
| book_id | title  | author | price | comments              |
+---------+--------+--------+-------+-----------------------+
|       1 | book_A | auth_A |  1500 | good, bad, excellence |
|       3 | book_C | auth_C |  1800 | interesting, amazing  |
|       5 | book_E | auth_E |  1200 | good, funny           |
+---------+--------+--------+-------+-----------------------+
次に、UPDATE文で上の本を100円値下げしましょう。
1
2
3
4
5
6
mysql> UPDATE book_list
    -> SET price = price - 100
    -> WHERE price > 1000
    -> AND price < 2000;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0
上手くいったようですね。UPDATE文の一般構文は以下のようになります。
UPDATE <テーブル名>
SET <更新する列名1> = <代入する値1> [, <更新列名2> = <代入値2>, ...]
WHERE <条件式>;
WHERE句は省略可能です。SET句内のイコール「=」は代入演算子です(WHERE句の「=」は等価演算子)。複数のフィールドを書き換える際はSET句内の個々の代入式をカンマ「,」で区切ります。UPDATE文は条件に合致する全てのレコードをSET句で書き換えます。実際に書き変わったか確認してみましょう。
1
2
3
4
5
6
7
8
9
10
mysql> SELECT title, price FROM book_list
    -> WHERE price + 100 > 1000
    -> AND price + 100 < 2000;
+--------+-------+
| title  | price |
+--------+-------+
| book_A |  1400 |
| book_C |  1700 |
| book_E |  1100 |
+--------+-------+
確かに、100円値下げしてありますね。

DELETE文でレコードを削除

一般構文は、
DELETE FROM <テーブル名>
WHERE <条件式>;
です。条件に合致する全てのレコードを削除します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> DELETE FROM book_list
    -> WHERE title = 'book_G';
Query OK, 1 row affected (0.00 sec)
 
mysql> SELECT title FROM book_list;
+--------+
| title  |
+--------+
| book_A |
| book_B |
| book_C |
| book_D |
| book_E |
| book_F |
+--------+
確かに、book_Gが削除されていますね。

リファレンス




http://www.abe-tatsuya.com/web_prog/mysql/update_inner_join.php

MySQL の update 文で inner join する

2009年4月25日 17:47 Add Starkuippa
基本的な SQL 文は MySQL だろうが PostgreSQL だろうが、MS Access だろうが何だろうが、変わりはないんですが、一応メモ。
MySQL の update 文の中で inner join するには、以下のようにします。
update table1
inner join table2 on table1.id = table2.id
set table1.cellname1 = hoge
where table2.cellname2 = 'huga';

MYSQL 정리 01- (SELECT)

http://www.yukun.info/blog/2008/11/mysql-query-select-where-in-like-between.html

  • SELECT文の基本形 – WHERE句
  • 比較文字列内にワイルドカードを指定 – LIKEキーワード、「%」、「_」記号
  • 比較範囲の指定 – BETWEENキーワード
  • 複数のOR結合をIN句でまとめる
  • NOTキーワードで条件の反転
  • NULLフィールドの検索 – IS NULL、IS NOT NULL

SELECT文の基本形 – WHERE句

SELECT文では指定したテーブル(FROM句)に対して、検索条件(WHERE句)にマッチするレコード(行)の指定フィールド(列)を表示します。SELECTに続くのは列名、と覚えましょう。以下、具体例。
SELECT <列名1>[, <列名2>, ...] FROM <テーブル名>
WHERE
<検索条件>;
WHERE句は省略可能。
1
2
3
4
5
6
7
8
9
mysql> SELECT title, price FROM book_list
    -> WHERE
    -> author = 'auth_A';
+--------+-------+
| title  | price |
+--------+-------+
| book_A |  1500 |
| book_G |   400 |
+--------+-------+
author列がauth_Aに合致するレコードを検索し、そのtitle、price列を表示しています。「=」は等価演算子です(代入演算子ではありません)。ちなみに非等価演算子は「<>」です。
1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM book_list
    -> WHERE
    -> price < 1500;
+---------+--------+--------+-------+-----------------------+
| book_id | title  | author | price | comments              |
+---------+--------+--------+-------+-----------------------+
|       4 | book_D | auth_D |   700 | sad, depress          |
|       5 | book_E | auth_E |  1200 | good, funny           |
|       7 | book_G | auth_A |   400 | very good!, excellent |
+---------+--------+--------+-------+-----------------------+
アスタリスク「*」はワイルドカードで全ての列を返します。
1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT title, price FROM book_list
    -> WHERE
    -> price >= 1800
    -> AND
    -> author = 'auth_C';
+--------+-------+
| title  | price |
+--------+-------+
| book_C |  1800 |
| book_F |  3500 |
+--------+-------+
WHERE句内の複数の条件を結合する際はAND、ORキーワードを用います。

比較文字列内にワイルドカードを指定 - LIKEキーワード、「%」、「_」記号

WHERE句内の比較条件に用いる演算子の一種と捉えてもいいかもしれません。
1
2
3
4
5
6
7
8
9
mysql> SELECT title, author, comments FROM book_list
    -> WHERE
    -> comments LIKE '%excellen%';
+--------+--------+-----------------------+
| title  | author | comments              |
+--------+--------+-----------------------+
| book_A | auth_A | good, bad, excellence |
| book_G | auth_A | very good!, excellent |
+--------+--------+-----------------------+
「%」は任意の文字列にマッチします。対して「_」任意の1文字にマッチします。

比較範囲の指定 - BETWEENキーワード

price >= 1000 AND price <= 2000の様な条件を簡潔に書くことが出来ます。
1
2
3
4
5
6
7
8
9
10
mysql> SELECT title, price FROM book_list
    -> WHERE
    -> price >= 1000 AND price <= 2000;
+--------+-------+
| title  | price |
+--------+-------+
| book_A |  1500 |
| book_C |  1800 |
| book_E |  1200 |
+--------+-------+
これを書き直すと、
1
2
3
4
5
6
7
8
9
10
mysql> SELECT title, price FROM book_list
    -> WHERE
    -> price BETWEEN 1000 AND 2000;
+--------+-------+
| title  | price |
+--------+-------+
| book_A |  1500 |
| book_C |  1800 |
| book_E |  1200 |
+--------+-------+
確かに実行結果は合致していますね。

複数のOR結合をIN句でまとめる

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT title, author, price FROM book_list
    -> WHERE
    -> author IN ('auth_A', 'auth_C');
+--------+--------+-------+
| title  | author | price |
+--------+--------+-------+
| book_A | auth_A |  1500 |
| book_C | auth_C |  1800 |
| book_F | auth_C |  3500 |
| book_G | auth_A |   400 |
+--------+--------+-------+

NOTキーワードで条件の反転

LIKE、BETWEEN、IN句と共にも使用することが出来ます。その場合は通常比較フィールドの直前に書きます。
1
2
3
4
5
6
7
8
9
10
mysql> SELECT title, author, price FROM book_list
    -> WHERE
    -> NOT author IN ('auth_A', 'auth_C');
+--------+--------+-------+
| title  | author | price |
+--------+--------+-------+
| book_B | auth_B |  2900 |
| book_D | auth_D |   700 |
| book_E | auth_E |  1200 |
+--------+--------+-------+
だだし、INキーワードではINの直前に書いてもOKです。
1
2
3
4
5
6
7
8
9
10
mysql> SELECT title, author, price FROM book_list
    -> WHERE
    -> author NOT IN ('auth_A', 'auth_C');
+--------+--------+-------+
| title  | author | price |
+--------+--------+-------+
| book_B | auth_B |  2900 |
| book_D | auth_D |   700 |
| book_E | auth_E |  1200 |
+--------+--------+-------+

NULLフィールドの検索 – IS NULL、IS NOT NULL

1
2
3
mysql> SELECT * FROM book_list
    -> WHERE title IS NULL;
Empty set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT * FROM book_list
    -> WHERE title IS NOT NULL;
+---------+--------+--------+-------+-----------------------+
| book_id | title  | author | price | comments              |
+---------+--------+--------+-------+-----------------------+
|       1 | book_A | auth_A |  1500 | good, bad, excellence |
|       2 | book_B | auth_B |  2900 | not bad, good         |
|       3 | book_C | auth_C |  1800 | interesting, amazing  |
|       4 | book_D | auth_D |   700 | sad, depress          |
|       5 | book_E | auth_E |  1200 | good, funny           |
|       6 | book_F | auth_C |  3500 | bored, difficult      |
|       7 | book_G | auth_A |   400 | very good!, excellent |
+---------+--------+--------+-------+-----------------------+

リファレンス

 


 

2010년 11월 29일 월요일

mysql

■ Mysql 데몬 start 하기


# /usr/local/mysql/bin/mysqld_safe &
또는  # /usr/local/mysql/share/mysql/mysql.server start



■ Mysql 데몬 stop 하기


# /usr/local/mysql/bin/mysqladmin -uroot shutdown
또는   # /usr/local/mysql/share/mysql/mysql.server stop



■ Mysql 접속 방법



형식 : mysql -u 사용자 -p 사용DB
예제)    # /usr/local/mysql/bin/mysql -u root -p mysql
           Enter password:      -> 초기 세팅후 비밀번호가 지정되지 않은경우는 엔터

또는

           # /usr/local/mysql/bin/mysql mysql -p
           Enter password:



■ mysql의 root암호설정법
  mysql> update user SET Password=password(\'비밀번호\') where user=\'root\';



■ 일반계정의 비밀번호 변경시
  mysql> update user set password=password(\'새비밀번호\') where user=\'계정명\';



■ DB 생성명령
  mysql> create database DB명
  

■ DB 사용자 계정 생성 방법(각 버전 별 필드 수를 확인 하시어 이용하시면 됩니다.)



◊ mysql 3.xx 에서 생성방법
  mysql> insert into user values(\'localhost\',\'계정명\',password(\'비밀번 호\'),\'N\',
        \'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\');

  mysql> insert into db values(\'localhost\',\'DB명\',\'계정명\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\');

  mysql> FLUSH PRIVILEGES;     (새로 만든 디비를 MYSQL에 적용하기 위하여 reload함)

◊ mysql 4.0.xx 에서 생성방법
  mysql> insert into db values (\'localhost\',\'DB명\',\'DB계정명\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'N \',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\');


mysql> insert into user (host, user, password) values (\'localhost\',\'DB계정명\',password(\'비밀번호\'));
또는 아래와 같이도 생성가능함


  mysql> INSERT INTO user VALUES (\'localhost\',\'DB계정명\',password(\'비밀번호\'),
\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'N\',\'\',\'\',\'\',\'\',0,0,0);

  mysql> FLUSH PRIVILEGES;



◊ mysql 4.1.xx 에서 생성방법
  mysql> insert into user (host, user, password) values (\'localhost\',\'DB계정명\',password(\'비밀번호\'));

  mysql> INSERT INTO db(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv)
VALUES(\'localhost\',\'DB명\',\'DB계정명\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\',\'Y\');

  mysql> FLUSH PRIVILEGES;



● GRANT 로 생성하는 방법
  mysql> GRANT ALL PRIVILEGES ON DB명.* TO DB계정명@localhost IDENTIFIED BY \'비밀번호\' WITH GRANT OPTION;
=> localhost에서 \'DB계정명\' 이라는 사용자를 등록시

  mysql> GRANT ALL PRIVILEGES ON DB명.* TO DB계정명@\'%\' IDENTIFIED BY \'비밀번호\' WITH GRANT OPTION;
=> localhost 아닌 원격에서 접속시 호스트 부분을 % 로 해준다.


■ 계정,DB 생성 확인
  mysql> select * from user;


■ 기타 mysql에서 자주 사용되는 명령들



▷ DB삭제시
  mysql> drop database DB명



▷ DB 계정 삭제시
  mysql> delete from user where user=\'DBuser\';  => (DBuser 라는 user 레코드를 삭제시)
  mysql> delete from db where user=\'DB\';  => (DB 라는 db 레코드를 삭제시)
  mysql> FLUSH PRIVILEGES;



▷ DB선택시
  mysql> use DB명;



▷ DB 및 테이블 list보기
  mysql> show databases;
  mysql> show tables;



▷ mysql상의 테이블 정보 보기
  mysql> show tables from mysql;



▷ DB table의 칼럼정보 보기
  mysql> show columns from db;



▷ 테이블구조
  mysql> describe 테이블명;



▷ 인덱스 보기
  mysql> show index from 테이블명;



▷ 버전체크
  mysql> select version();



▷ MySQL의 상태 보기
  mysql> show status;



▷ MySQL 환경변수보기
  mysql> show variables;


◆ mysql 백업 하기
  # /usr/local/mysql/bin/mysqldump {-h 호스트} -u 사용자 -p DB명 > 백업파일명.sql



◆ mysql 복구 하기
  # /usr/local/mysql/bin/mysql {-h 호스트} -u 사용자 -p DB명 < 백업파일명.sql

  => {-h 호스트}는 원격접속시나 호스트명이 별도로 분류되어 있는경우에 사용
  

◆ Mysql root 비밀번호를 분실한 경우 조치방법

1. 실행중인 msyql 종료
  # killall mysqld  또는 killall -9 mysqld
  # ps -ef | grep mysqld  (mysql 데몬 없음을 확인)



2. grant-table 미사용모드로 mysql시작
  (mysql 3.x 사용시)
  # /usr/local/mysql/bin/safe_mysqld  --skip-grant-tables &
  (mysql 4.x 에서 사용시)
  # /usr/local/mysql/bin/mysqld_safe  --skip-grant-tables &
  # /usr/local/mysql/bin/mysql -u root -p mysql



3. update문으로 root사용자 패스워드 설정
  mysql> update user set password=password(\'newpasswd\') where user = \'root\';
  mysql> flush privileges;



4. 실행중인 mysql 다시 종료
  # killall mysqld  또는 killall -9 mysqld
  # ps -ef | grep mysqld  (mysql 데몬 없음을 확인)



5. Mysql 데몬 다시 시작
  # /usr/local/mysql/bin/safe_mysqld &
  # ps -ef | grep mysql
  # /usr/local/mysql/bin/mysql -u root -p mysql
[출처] 명령어들 모음|작성자 너만을