libmysqlclient.so.16: cannot open shared object file: No such file or directory

리눅스/MySQL|2015. 1. 16. 11:13
반응형

yum 으로  mysql 설치 했을때  
관련 라이브러리를 사용하려 하면 아래와 같은 에러가 날수도 있다.
libmysqlclient.so.16: cannot open shared object file: No such file or directory
알아본바로는 mysql 버그라는데  해결법이 있다.

yum 으로 설치시  라이브러리가  libmysqlclient.so.15 설치가 되서 에러가 나는것인데
so.16 을 다운 받아  링크를 걸어주어야 한다.


centos  5  를 깔았으므르로   mysql 사이트가서 다운로드 탭을 누른다 
커뮤니티 서버를 클릭후 레드햇 엔터프라이즈 5  rpm  x86 누르고 

shared libraries  를 다운 받는다   
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-shared-community-5.1.41-0.rhel5.i386.rpm/from/http://mysql.byungsoo.net/
그러면  rpm  파일이 생성되는데    rpm 을 풀면  /usr/lib/ 폴더에  풀리게 되는것을 볼수 있을것이다 
rpm -ivh MySQL-shared-community-5.1.41-0.rhel5.i386.rpm

vim /etc/ld.so.conf  파일을 열어서 
/usr/lib   를 넣어주고  저장한다

ldconfig  실행후   mysql 서비스를 시작해 준다 

고생 꾀나 했다.
의외로 해결법은 간단하지만  이런오류나면 무조건 당황하기 마련이다.

 

 

[출처] 블로그이름작성하라는데거귀찮거나생각이안나서이러는거절대아님 (http://ilovejam84.tistory.com/53)

반응형

댓글()

my.cnf에 wait_timeout설정하는 문제

리눅스/MySQL|2015. 1. 16. 11:12
반응형
  • 구글링을 해보면 이 문제로 많은 사람들이 삽질을 이미 했다. 그리고 대다수가 버그라고 생각하고 있었다.
  • 버그가 아니다. 당연한 삽질이었다.
    • my.cnf [mysqld] section에 wait_timeout=300 으로 설정 추가하고 다시 띄운다.(기본값은 28800)
    • mysql로 접속하여 show variables like 'wait_timeout' 을 해본다.
    • 어라? 28800이다. 왜 적용이 안되는 걸까..
  • show variables like '%timeout%'을 해보면, interactive_timeout이라는게 있는데, 이게 바로 커맨드라인 클라이언트인 mysql (보통/usr/local/mysql/bin/mysql 또는 /usr/local/bin/mysql 등등)을 말하는 거다. 당연히 mysql 기본 클라이언트로 interactive mode접속하면wait_timeout interactive_timeout값으로 바꿔주는거다.
  • 왜냐구?  interactive mode로 접속했으니까 그렇지 ㅡ_ㅡ
  • show global variables like '%timeout%'을 해본다.
  • wait_timeout=300으로 설정이 잘 되어있다. 즉, interactive mode가 아닌 접속 쓰레드에 대해서 wait_timeout이 새로 설정한 값이 된다는거다. 당연히mysql로 접속해서는 확인을 못한다.
  • 본인이 작성하는 프로그램의 라이브러리를 이용하여 테스트 커넥션을 만들고 300초간 아무것도 하지 않은 후에 쿼리를 하나 날려보자 "SELECT 1" 같은..
  • 에러가 난다. 2006, Mysql server has gone away. 설정한 wait_timeout이 먹었다.
  • 뭐.. 그런거다.. 설정 잘 돼있는거 가지구 착각하고, 삽질하지 말자.
  •  

    [출처] 루미넌스 - TechNote (http://lumitech.tistory.com/11)

    반응형

    댓글()

    오라클 클라이언트(Oracle Client) 설치

    리눅스/MySQL|2015. 1. 16. 11:09
    반응형

    오라클 서버 접속도구로 사용되는 Oracle Client 는 어느버전이든 상관이 없습니다.

    그러므로 최신버전 설치하는것을 설명드리겠습니다.

     

    Apache 는 미리 설치가 되어있다는 가정하에 설명드립니다.

    설치 순서는 아래 둘중 아무거나 상관없으나

    PHP보다 Oracle Client 를 먼저 설치해야 된다는것을 기억하시기 바랍니다.

     

    Apache > Oracle Client > PHP

    Oracle Client > Apache > PHP

     

    1. Oracle Client 설치

     

    1) 다운로드

        http://www.oracle.com/technology/tech/oci/instantclient/instantclient.html

        위 링크주소에 접속하면 페이지 중간쯤에

        Platform Downloads

        See Instant Client downloads for all platforms

        라고 되어있습니다. 이부분을 클릭하여 링크를 따라 갑니다.

     

        여기에서 저는 Instant Client for Linux x86 버전을 선택했습니다.

     

        설치하고자 하는 시스템이 리눅스이며, 32bit이기 때문입니다.

        > 자신의 시스템이 몇bit인지 모를 경우 쉘에서 uname -a 라고 해보시면 커널 버전이 나오는데,

            x64 라는 문자가 보이지 않으면 32bit입니다.

     

        Accept License Agreement를 클릭하여 설치파일 링크를 활성화 시키고 아래 두가지를 다운로드 받습니다.

     

        Instant Client Package - Basic
        oracle-instantclient11.2-basic-11.2.0.1.0-1.i386.rpm

        oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm    // 64bit 시스템일 경우


        Instant Client Package - SDK
        oracle-instantclient11.2-devel-11.2.0.1.0-1.i386.rpm

        oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm    // 64bit 시스템일 경우


        다운받은 파일 두개를 서버에 올려놓고 설치를 진행합니다.

     

    2) 설치

        업로드한 폴더로 가서 파일을 설치합니다.

        64bit 는 아래 형식대로 파일명을 바꿔서 설치합니다. 


        root@sysdocu:~# rpm -Uvh oracle-instantclient11.2-basic-11.2.0.1.0-1.i386.rpm

        root@sysdocu:~# rpm -Uvh oracle-instantclient11.2-devel-11.2.0.1.0-1.i386.rpm


     

    2. PHP 설치

        사전에 PHP가 설치되어있다해도 재컴파일 해야합니다. 소스폴더의 config.status 를 참고하여 설치된 옵션에

        오라클 관련 옵션을 추가하여 재설치 합니다.

        ./configure 를 할때 PHP버전에 맞는 옵션을 추가해서 설치를 합니다.

     

        PHP 5.1.1 이전 설치 옵션
        --with-oci8-instant-client

        PHP 5.1.2 이후 설치 옵션
        --with-oci8=instantclient,/usr/lib/oracle/11.2/client/lib       // 설치 디렉토리 포함. 버전을 미리 확인해봅니다.

        --with-oci8=instantclient,/usr/lib/oracle/11.2/client64/lib    // 64bit 시스템일 경우


        PHP를 make 할때 아래와 같은 오류가 나타난다면 위에 버전에따른 옵션이 잘못된것입니다.

        make: *** [ext/oci8/oci8.lo] 오류 1

     

     

    3. profile 수정

        profile 을 수정하여 Oracle 에서 필요한 내용을 넣어줍니다.

        (맨하단에 추가하셔도 됩니다.)

        (64bit 는 디렉토리를 /usr/lib/oracle/11.2/client64/lib 로 사용해야 함)


        root@sysdocu:~# vi /etc/profile

        LD_LIBRARY_PATH=/$LD_LIBRARY_PATH:/usr/lib/oracle/11.2/client/lib:${LD_LIBRARY_PATH}
        PATH=$PATH:/usr/lib/oracle/11.2/client
        NLS_LANG=Korean_Korea.KO16KSC5601
        TNS_ADMIN=/home
        export LD_LIBRARY_PATH TNS_ADMIN

     

        수정된 환경을 적용시킵니다.

        root@sysdocu:~# source /etc/profile

     

     

    4. 확인

        아파치를 재구동 후, PHP정보 함수를 넣은 파일을 Document Root 디렉토리안에 넣어 놓습니다.

     

        phpinfo.php 파일 내용

        <?php    phpinfo();    ?>

     

        웹페이지로 접근하여 OCI8 섹션이 활성화 되었는지 확인합니다.

        http://sysdocu.tistory.com/phpinfo.php

        > OCI8 섹션
        OCI8 Support  enabled

     

     

    [참고] tnsnames.ora 파일 작성

        vi 에디터를 이용하여 /home/tnsnames.ora 파일을 생성하시고 아래 내용을 입력합니다.

     

    DBNAME =                                                                                                    // 접속할 DB명을 입력
     (DESCRIPTION =
       (ADDRESS_LIST =
        (ADDRESS = (PROTOCOL = TCP)(HOST = IP)(PORT = 1521))          // 
    호스트, 포트 번호 
        )
       (CONNECT_DATA =
        (SID = ORCL)                                                                                              // SID명 입력
        (SERVICE_NAME = DBNAME)                                                               // 접속할 DB명을 다시 입력
       )
     )

    vi 에디터를 이용하여 /etc/ld.so.conf 에 하단 내용을 입력 후 ldconfig 명령으로 적용 합니다.

     

    /usr/lib/oracle    // ld.so.conf 파일에 내용 추가

     

    root@sysdocu:~# ldconfig    // 적용

     

    반응형

    댓글()

    최대 동시접속자수 테스트 프로그램

    리눅스/MySQL|2015. 1. 16. 11:09
    반응형

    최대 동시접속자 수 테스트용 프로그램입니다.


    컴파일 방법:
    g++ -o mysql-con-stress -I/usr/local/mysql/include/mysql/ -L/usr/local/mysql/lib/mysql/ -lmysqlclient mysql-con-stress.cc


    사용방법:
    ./mysql-con-stress host user pass max_tries

    host : 예를 들면 localhost
    user : root
    pass : 암호
    max_tries : 최대동시접속자 수


    성공시:
    Successefully established 1500 connections
    Never failed 
    Cleaning up 1500 connections ...
    Clean up complete


    실패시:
    Successefully established 1501 connections
    Failed because Too many connections
    Cleaning up 1501 connections ...
    Clean up complete


    MySQL Client 상에서 최대 동시접속 확인법: 
    show status like max_used_connections;

    이 결과값이 max_tries와 일치하여야 함.

     

    주의사항: mysql_connect 함수가 deprecate 되었으므로 mysql_real_connect 함수로 수정하였습니다. 자신의 MySQL버젼에서 오류가 발상할 경우 mysql_init() 부분을 삭제하고 mysql_real_connect 함수를 mysql_connect()함수로 수정바랍니다.

     

    /*

    * mysql-con-stress.cc by Sasha Pachev

    * Stresses a running mysqld to see the maximum number of additional concurrent

    * connections it can handle

    * to compile: g++ -o mysql-con-stress -I<where_mysql.h_is_found> r

    -L<where-libmysqlclient-is-found> mysql-con-stress.cc -lmysqlclient

    * to use: mysql-con-stress host user pass max_tries

    * If the first three parameters are not obvious, you should not be using this program

    * max_tries is the maximum number of concurrent connection mysql-con-stress will try to

    * estabilsh

    */

    #include <mysql.h>

    #include <iostream.h>

    #include <stdlib.h>

    #include <sys/types.h>

    #include <signal.h>

     

    int num_cons = 0;

    MYSQL* glob_cons = NULL;

     

    void clean_up(int )

    {

    int i;

    cerr << Cleaning up << num_cons << connections ... << endl;

     

     

    for(i = 0; i < num_cons; i++)

    {

    mysql_close(glob_cons + i);

    }

     

    cerr << Clean up complete << endl;

    exit(0);

    }

     

    void usage()

    {

    cerr << Usage: mysql-con-stress host user pass max_tries << endl;

    exit(1);

    }

     

    int main(int argc, char** argv)

    {

    if(argc != 5) usage();

    char* user, *host, *pass;

    int max_tries;

     

    user = argv[2];

    host = argv[1];

    pass = argv[3];

    max_tries = atoi(argv[4]);

     

    MYSQL cons[max_tries];

    glob_cons = cons;

     

    int i;

    int never_failed = 1;

    int port = 0;

     

    // if we get a signal, clean up first

     

    signal(SIGTERM, clean_up);

    signal(SIGINT, clean_up);

     

    // establish as many connections as we can

     

    for(i = 0; i < max_tries; i++)

    {

    mysql_init(&cons);

    mysql_real_connect(cons + i, host, user, pass, test, 0, NULL, 0);

    num_cons = i ;

     

    if((mysql_error(cons + i))[0])

    {

    never_failed = 0;

    cout << Successefully established << num_cons << connections << r

    endl; cout << Failed because << mysql_error(cons + i) << endl;

    break;

    }

    }

     

     

    if(never_failed)

    {

    num_cons = i ;

    cout << Successefully established << num_cons << connections << endl;

    cout << Never failed << endl;

    }

     

    // this is really not necessary, because exiting will close all the connection,

    // but it is good practice to clean up

     

    clean_up(0);

     

    return 0;

    }

     

     

    [출처] rootman | rootman (http://www.rootman.co.kr/bbs/zboard.php?id=linux&no=1900)

    반응형

    댓글()

    error while loading shared libraries: libmysqlclient.so.10: cannot open shared object file: No such file or directory

    리눅스/MySQL|2015. 1. 16. 11:08
    반응형

    error while loading shared libraries: libmysqlclient.so.10: cannot open shared object file: No such file or directory

     
    1. libmysqlclient.so.10 파일을 find로 찾아 라이브러리 패스에 추가
    # vi /etc/profile
    export LD_LIBRARY_PATH=/usr/local/mysql/lib/mysql:LD_LIBRARY_PATH
    2. 라이브러리가 설치되어 있지 않다면 Mysql Shared-library 설치. (http://downloads.mysql.com/archives.php)
    # rpm -ivh MySQL-shared-3.23.44-1.i386.rpm
     
     
    symbol errno, version GLIBC_2.0 not defined in file libc.so.6 with link time reference
     
    # vi /etc/profile
       export LD_ASSUME_KERNEL=2.4.1

     

    [출처] qreeko님의 블로그 | 큐리 (http://blog.naver.com/qreeko?Redirect=Log&logNo=100013663616)

     

     

    -----------------------------------------------

    error while loading shared libraries: libmysqlclient.so.10: wrong ELF class: ELFCLASS64

    > 이 메세지는 libmysqlclient.so.10 파일은 있는데 64bit 용이여서 사용이 안된다는 뜻.

     

    profile 은 사용할 계정마다 설정해주어야 합니다.

    반응형

    댓글()

    zmanda를 사용한 쉬운 MySQL 백업과 복구 (증분백업 가능)

    리눅스/MySQL|2015. 1. 16. 11:07
    반응형

    zmanda를 사용한 MySQL 백업과 복구


    1. zmanda는 복잡한 mysql의 옵션을 사용하지 않고 쉽게 mysql을 백업하고, 복구할 수 있는 유틸리티이다. 본 문서에서는 자체 백업만 언급하였다. 원격 백업 혹은 replication에 대해서는 zmanda 사이트의 메뉴얼을 읽어보기 바란다.

    적용 가능한 MySQL 버전:

    MySQL 4.1.x and MySQL 5.x

    Manual:
    http://mysqlbackup.zmanda.com/index.php/Zmanda_Recovery_Manager_for_MySQL_Users_Manual 
    http://www.zmanda.com/quick-mysql-backup.html 

    2. 다운로드, 설치

    # lftpget http://www.zmanda.com/downloads/community/ZRM-MySQL/2.1/RPM/MySQL-zrm-2.1-1.noarch.rpm 
    # lftpget http://www.zmanda.com/downloads/community/ZRM-MySQL/2.1/RPM/MySQL-zrm-client-2.1-1.noarch.rpm 

    아래의 3가지 perl 모듈이 필요하다.

    ===
    *중요 : perl-DBD-MySQL 패키지도 필요하다. 만약 이 패키지가 설치되어 있지 않을 경우, yum 으로 설치하면 mysql 패키지도 의존성으로 인하여 같이 설치하려고 한다. MySQL을 소스로 설치했다면, 자신의 OS 버전에 맞는 패키지를 직접 다운로드 하여 rpm -ivh --nodeps perl-DBD-MySQL-xxx 형식을 사용하여 의존성을 체크하지 않고 설치하도록 한다.
    ===

    [root@localhost ~]# yum install perl-DBI perl-XML-parser
    [root@localhost ~]# rpm -ivh MySQL-zrm-*
    [root@localhost ~]# rpm -ql MySQL-zrm
    /etc/logrotate.d/mysql-zrm
    /etc/mysql-zrm
    /etc/mysql-zrm/RSS.header
    /etc/mysql-zrm/mysql-zrm-release
    /etc/mysql-zrm/mysql-zrm-reporter.conf
    /etc/mysql-zrm/mysql-zrm.conf
    /etc/xinetd.d/mysql-zrm-socket-server
    /usr/bin/mysql-zrm
    /usr/bin/mysql-zrm-abort-backup
    /usr/bin/mysql-zrm-backup
    /usr/bin/mysql-zrm-check
    /usr/bin/mysql-zrm-extract-backup
    /usr/bin/mysql-zrm-getconf
    /usr/bin/mysql-zrm-list
    /usr/bin/mysql-zrm-manage-backup
    /usr/bin/mysql-zrm-migrate-file-ownership
    /usr/bin/mysql-zrm-parse-binlogs
    /usr/bin/mysql-zrm-purge
    /usr/bin/mysql-zrm-reporter
    /usr/bin/mysql-zrm-restore
    /usr/bin/mysql-zrm-scheduler
    /usr/bin/mysql-zrm-verify-backup
    /usr/bin/zrm-pre-scheduler
    /usr/lib/mysql-zrm/Data/Report.pm
    /usr/lib/mysql-zrm/Data/Report/Base.pm
    /usr/lib/mysql-zrm/Data/Report/Plugin/Csv.pm
    /usr/lib/mysql-zrm/Data/Report/Plugin/Html.pm
    /usr/lib/mysql-zrm/Data/Report/Plugin/Text.pm
    /usr/lib/mysql-zrm/XML/RSS.pm
    /usr/lib/mysql-zrm/ZRM/Common.pm
    /usr/lib/mysql-zrm/ZRM/MySQL.pm
    /usr/lib/mysql-zrm/ZRM/Replication.pm
    /usr/lib/mysql-zrm/ZRM/SnapshotCommon.pm
    /usr/share/doc/MySQL-zrm-2.1
    /usr/share/doc/MySQL-zrm-2.1/AUTHORS
    /usr/share/doc/MySQL-zrm-2.1/COPYING
    /usr/share/doc/MySQL-zrm-2.1/INSTALL
    /usr/share/doc/MySQL-zrm-2.1/README
    /usr/share/doc/MySQL-zrm-2.1/README-plugin-encrypt
    /usr/share/doc/MySQL-zrm-2.1/README-plugin-post-backup
    /usr/share/doc/MySQL-zrm-2.1/README-plugin-pre-backup
    /usr/share/doc/MySQL-zrm-2.1/README-plugin-pre-scheduler
    /usr/share/doc/MySQL-zrm-2.1/README-plugin-snapshot-plugin
    /usr/share/doc/MySQL-zrm-2.1/README-plugin-socket-copy
    /usr/share/doc/MySQL-zrm-2.1/README-plugin-ssh-copy
    /usr/share/man/man1/mysql-zrm-abort-backup.1.gz
    /usr/share/man/man1/mysql-zrm-backup.1.gz
    /usr/share/man/man1/mysql-zrm-check.1.gz
    /usr/share/man/man1/mysql-zrm-extract-backup.1.gz
    /usr/share/man/man1/mysql-zrm-list.1.gz
    /usr/share/man/man1/mysql-zrm-manage-backup.1.gz
    /usr/share/man/man1/mysql-zrm-parse-binlogs.1.gz
    /usr/share/man/man1/mysql-zrm-purge.1.gz
    /usr/share/man/man1/mysql-zrm-reporter.1.gz
    /usr/share/man/man1/mysql-zrm-restore.1.gz
    /usr/share/man/man1/mysql-zrm-scheduler.1.gz
    /usr/share/man/man1/mysql-zrm-verify-backup.1.gz
    /usr/share/man/man1/mysql-zrm.1.gz
    /usr/share/man/man5/mysql-zrm-reporter.conf.5.gz
    /usr/share/man/man5/mysql-zrm.conf.5.gz
    /usr/share/mysql-zrm
    /usr/share/mysql-zrm/plugins
    /usr/share/mysql-zrm/plugins/encrypt.pl
    /usr/share/mysql-zrm/plugins/lvm-snapshot.pl
    /usr/share/mysql-zrm/plugins/parse-binlogs.pl
    /usr/share/mysql-zrm/plugins/post-backup.pl
    /usr/share/mysql-zrm/plugins/pre-backup.pl
    /usr/share/mysql-zrm/plugins/pre-scheduler-plugin.pl
    /usr/share/mysql-zrm/plugins/socket-copy.pl
    /usr/share/mysql-zrm/plugins/socket-server.pl
    /usr/share/mysql-zrm/plugins/ssh-copy.pl
    /usr/share/mysql-zrm/plugins/xinetd.smf
    /usr/share/mysql-zrm/plugins/zfs-snapshot.pl
    /var/lib/mysql-zrm
    /var/log/mysql-zrm
    /var/log/mysql-zrm/mysql-zrm.log
    [root@localhost ~]#

    [root@localhost ~]# rpm -ql MySQL-zrm-client
    /etc/xinetd.d/mysql-zrm-socket-server
    /usr/lib/mysql-zrm/ZRM/SnapshotCommon.pm
    /usr/share/mysql-zrm/plugins/lvm-snapshot.pl
    /usr/share/mysql-zrm/plugins/socket-copy.pl
    /usr/share/mysql-zrm/plugins/socket-server.pl
    /usr/share/mysql-zrm/plugins/ssh-copy.pl
    /usr/share/mysql-zrm/plugins/zfs-snapshot.pl
    /var/lib/mysql-zrm
    /var/log/mysql-zrm
    /var/log/mysql-zrm/mysql-zrm.log
    [root@localhost ~]#

    3. 설정

    [3.1] /etc/my.cnf 파일 설정
    MySQL의 환경설정 파일(/etc/my.cnf)에서 바이너리 로그를 생성하도록 설정한다.

    # Replication Master Server (default)
    # binary logging is required for replication
    log-bin=mysql-bin
    # required unique id between 1 and 2^32 - 1
    # defaults to 1 if master-host is not set
    # but will not function as a master if omitted
    server-id       = 1

    [3.2] /etc/mysql-zrm/mysql-zrm.conf 파일 설정

    /etc/mysql-zrm/mysql-zrm.conf 파일에서 MySQL 접속 아이디와 패스워드를 설정한다.

    [MySQL server parameters]
    user=mysqlbackup
    password="mysqlbackup_password"
    host="localhost"
    port=3306
    socket=/tmp/mysql.sock

    mysql의 캐릭터셋을 지정한다. 지정하지 않으면 디폴트값으로 ut8로 지정된다.
    default-character-set=utf8

    mysql 실행파일 경로와 binlog 파일의 경로, 임시파일 경로 설정.
    mysql-binpath="/usr/local/server/mysql/bin"
    mysql-binlog-path="/usr/local/server/mysql/var"
    tmpdir=/tmp

    [Backup parameters]
    백업 레벨이 0이면 전체 백업, 1이면 증분 백업
    # Backup level.
    backup-level = 0

    백업 모드에는 raw와 logical이 있다. raw는 DB와 동일한 파일을 복사(mysqlhotcopy)하고, logical은 .sql의 파일로 백업한다. (logical로 백업하면 .sql 파일을 생성하므로, OS에 관계없이 복구가 가능하다.)
    # Backup method
    backup-mode = logical

    백업 파일을 저장할 디렉토리 경로를 설정한다.
    destination=/backup/mysql

    백업 파일을 보유할 기간을 명시한다. D는 일, W는 주, M은 월을 의미한다. 아래와 같이 10D로 설정하면 백업 파일을 10일동안만 보관하고, 10일 이후에는 자동으로 삭제한다.
    retention-policy=10D

    모든 데이터 베이스를 백업대상으로 한다.
    all-databases=1

    [ZRM parameters]
    백업을 한 다음 백업 리포트를 전송할 메일 지정. 메일을 지정하지 않으면, 디폴트로 발송하지 않는다.
    mailto="mymail@domain.com"

    =======================================
    * MySQL 서버 프로세스를 구동하는 유저는 mysql 이어야 한다. *
    =======================================

    4. 백업

    아래 명령을 사용하면, 백업셋 이름으로 dailyrun을 사용하여 곧바로 모든 DB 테이블을 백업한다. (Full Backup) 백업을 완료하면 /etc/mysql-zrm/dailyrun 디렉토리내에 last_backup 파일을 만든다. 이 파일에는 저장된 백업파일의 경로가 입력되어 있다.
      
    mysql-zrm-scheduler --now --backup-set dailyrun --backup-level 0
    # cat /etc/mysql-zrm/dailyrun/last_backup
    /backup/lug/mysql/dailyrun/20081229135816

    백업 파일 검증하기.
    mysql-zrm --action verify-backup --backup-set dailyrun
    verify-backup:INFO: ZRM for MySQL Community Edition - version 2.1
    dailyrun:verify-backup:INFO: Verification successful

    백업 상태 로그 보기.
    mysql-zrm-reporter --where backup-set=dailyrun --show backup-status-info
    REPORT TYPE : backup-status-info

              backup_set  backup_date                  backup_level  backup_status         backup_type       comment
    -----------------------------------------------------------------------------------------------------------------------------
                dailyrun  2008년 12월 29일 (월)               0  Backup succeeded      regular           ----
                          오후 01시 58분 16초

    백업된 크기와 백업방법, 시간등을 확인한다.
    mysql-zrm-reporter --where backup-set=dailyrun --show backup-performance-info
    REPORT TYPE : backup-performance-info


              backup_set  backup_date                  backup_level     backup_size  backup_size_compressed     backup_time   backup_type       compress_encrypt_time
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------
                dailyrun  2008년 12월 29일 (월)               0       124.21 MB  ----                       00:00:35      regular           ----
                          오후 01시 58분 16초

    매일 새벽 2시에 백업을 하도록 cron에 설정한다.(Full Backup)
    mysql-zrm-scheduler --add --interval daily --backup-set dailyrun --start 02:00

    cron에 설정되었는지 확인한다.
    mysql-zrm-scheduler --query
    schedule:INFO: ZRM for MySQL Community Edition - version 2.1
    Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.log
    0 2 * * * /usr/bin/zrm-pre-scheduler --action backup --backup-set dailyrun --backup-level 0 --interval daily

    5. 복구

    백업에 사용할 이미지의 정보를 확인한다.
    mysql-zrm-reporter --show restore-info --where backup-set=dailyrun
    REPORT TYPE : restore-info
              backup_set  backup_date                  backup_level  backup_directory                          backup_status         comment
    -----------------------------------------------------------------------------------------------------------------------------------------------------
                dailyrun  2008년 12월 29일 (월)               0  /backup/lug/mysql/dailyrun/2008122913581  Backup succeeded      ----
                          오후 01시 58분 16초                   6

    복구옵션(-restore)과 함께 위의 빨간색 백업 디렉토리를 소스 디렉토리로 지정하여 복구한다.
    mysql-zrm -restore --backup-set dailyrun --source-directory /backup/lug/mysql/dailyrun/2008122913581

    logical 즉 .sql 형식으로 백업해 두면 어떤 시스템(윈도우즈,리눅스,솔라리스등)에서도 mysql 명령어로 복구가 가능하다는 장점이 있다.

    [Addition]
    zmanda는 perl로 만들어진 오픈소스이다.

    [root@localhost ~]# cat /usr/bin/mysql-zrm

    #!/usr/bin/perl
    #
    # Copyright (c) 2006 Zmanda Inc.  All Rights Reserved.
    #
    # This program is free software; you can redistribute it and/or modify it
    # under the terms of the GNU General Public License version 2 as published
    # by the Free Software Foundation.
    #
    # This program is distributed in the hope that it will be useful, but
    # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
    # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    # for more details.
    #
    # You should have received a copy of the GNU General Public License along
    # with this program; if not, write to the Free Software Foundation, Inc.,
    # 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
    #
    # Contact information: Zmanda Inc, 505 N Mathlida Ave, Suite 120
    # Sunnyvale, CA 94085, USA, or: http://www.zmanda.com
    #

    use strict;
    use warnings;


    our $oldPATH = $ENV{'PATH'};
    $ENV{'PATH'} = "/usr/local/bin:/opt/csw/bin:/usr/bin:/usr/sbin:/sbin:/bin:/usr/ucb";


    #path where ZRM utilities are installed
    my $ZRM_BINPATH="/usr/bin";


    my $USAGE="--action <backup|restore|schedule-backup|report|list|getconf|purge|parse-binlogs|check|verify-backup|extract-backup|abort-backup>nHelp on individual action items can be obtained by specifying --help with the required action.nFor example: 'mysql-zrm --action backup --help'";


    my @cmd_args;


    sub usage()
    {
            print STDERR "$_[0]n";
            print STDERR "USAGE:n";
            print STDERR "$USAGEn";
            exit(2);
    }


    sub getAction()
    {
            my $len = @ARGV;
            my $i;
            my $act;
            for( $i = 0; $i < $len; $i++ ){
                    if( $ARGV[$i]=~/^--action=/ ){
                            $act = $';
                    }elsif( $ARGV[$i]=~/^--action/ ){
                            $i++;
                            if( $i < $len ){
                                    $act = $ARGV[$i];
                            }
                    }else{
                            my $x = ""$ARGV[$i]"";
                            push @cmd_args, $x;
                    }
            }
            if( ! defined $act || $act eq "" ){
                    &usage( "ERROR: Please specify --action" );
            }
            $ENV{"ZRM_CMD_NAME"}="$0 --action $act";
            $ENV{"ZRM_LAUNCHER"}=$$;
            return $act;
    }


    sub main()
    {
            my $act = getAction();
            if( !defined $act ){
                    &usage( "ERROR: Please specify --action" );
            }
            my $cmd;
            if($act eq "backup") {
                    $cmd = "mysql-zrm-backup";
            } elsif($act eq "restore") {
                    $cmd = "mysql-zrm-restore";
            } elsif($act eq "list" ) {
                    $cmd = "mysql-zrm-list";
            } elsif($act eq "purge" ){
                    $cmd = "mysql-zrm-purge";
            } elsif($act eq "parse-binlogs"){
                    $cmd = "mysql-zrm-parse-binlogs";
            } elsif($act eq "check"){
                    $cmd = "mysql-zrm-check";
            } elsif($act eq "verify-backup"){
                    $cmd = "mysql-zrm-verify-backup";
            } elsif($act eq "extract-backup"){
                    $cmd = "mysql-zrm-extract-backup";
            } elsif($act eq "abort-backup"){
                    $cmd = "mysql-zrm-abort-backup";
            } elsif($act eq "schedule-backup"){
                    $cmd = "mysql-zrm-scheduler";
            } elsif($act eq "report"){
                    $cmd = "mysql-zrm-reporter";
            } elsif($act eq "getconf"){
                    $cmd = "mysql-zrm-getconf";
            } elsif($act eq "manage-backup"){
                    $cmd = "mysql-zrm-manage-backup";
            }else{
                    &usage("ERROR: Unknown Action '$act'");
            }
            my $r = system( "$ZRM_BINPATH/$cmd @cmd_args" );
            exit( $r>>8 );
    }
    &main();

    [root@localhost ~]#


    혹시라도 잘못된 사항이나, 추가적인 내용이 있으면 코멘트 남겨주세요.

    망극!

    - 끝 -


    반응형

    댓글()

    [그누보드] mysql 4.0 이하에서 4.1 이상으로 서버이전후 로그인 안될때

    리눅스/MySQL|2015. 1. 16. 11:06
    반응형

    제로보드와 GNU보드 둘다 회원들의 password를 관리할때 
    MySQL의 password()를 사용하는데 이 함수가 4.0이하와 4.1이상에서 
    다른 hashing value를 가집니다. 다 아시겠지만 4.0이하는 16바이트, 
    4.1이상은 40바이트의 hashed value를 가집니다. 

    패스워드가 모두 옛날 password()함수로 되어있습니다. 
    최근에 호스트쪽에서 MySQL 4.1.X로 업그레이드를 해서 지금 설치된 그누보드는 password()를 쓸때에 모두 16바이트 대신 40바이트의 hashed value를 돌려주게 됩니다. 

    즉, 회원정보를 옮겨오면 로그인이 안되는것이죠. 

    다음과 같이하면 됩니다. 


    1. 그누보드 / lib / common.lib.php 의 1096번째 줄에 
    function sql_password($value) 를 검색해서 아래와 같이 함수를 추가합니다. 

    function sql_old_password($value) 

        $row = sql_fetch(" select old_password('$value') as pass "); 
        return $row[pass]; 


    function sql_password($value) 

        // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes 
        // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes 
        $row = sql_fetch(" select password('$value') as pass "); 
        return $row[pass]; 




    2. 그누보드 / bbs / login_check.php의 25번째줄의 
    if (!$mb[mb_id] || (sql_password($mb_password) != $mb[mb_password])) {
        alert("가입된 회원이 아니거나 패스워드가 틀립니다.\n\n패스워드는 대소문자를 구분합니다.");
    }
    를 아래와 같이 수정

    if (!$mb[mb_id]) { 
      alert("가입된 회원이 아니거나 패스워드가 틀립니다.\n\n패스워드는 대소문자를 구분합니다."); 
      } else { //id가 있는경우 
        if ( (sql_password($mb_password) != $mb[mb_password]) && (sql_old_password($mb_password) != $mb[mb_password]) ) { 
        alert("가입된 회원이 아니거나 패스워드가 틀립니다.\n\n패스워드는 대소문자를 구분합니다."); 
      } 


    로 바꾸어 줍니다. 더 간단하게도 쓸수 있지만 논리 에러를 내지 않으려고 일부러 길게 썼습니다. 



    3. 그누보드 / bbs / register_form.php의 73번째 줄을 

    // 원본 
        if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password])) 
            alert("패스워드가 틀립니다."); 
    // 수정 
    if (!($member[mb_password] == sql_password($_POST[mb_password]) && $_POST[mb_password]) && !($member[mb_password] == sql_old_password($_POST[mb_password]) && $_POST[mb_password])) 
            alert("패스워드가 틀립니다."); 


    로 바꾸어 줍니다. 회원 정보 수정시에 한번더 비밀번호를 체크하기에 여기도 넣어주어야 합니다. 
    이렇게 해주면 나중에 회원이 비밀번호를 바꾸었을경우에도 제대로 로그인이 됩니다. 

    그리고 회원들이 모두 비밀번호를 40바이트짜리로 바꾸었을경우에는 위에 바꾼것을 원래대로 돌려 놓는것이 좋습니다. 


    참고자료
    에밀 ( http://sir.co.kr/bbs/board.php?bo_table=g4_tiptech&wr_id=1212 )

     

     

    [출처] 해피정닷컴 | 해피정닷컴 (http://www.happyjung.com/gnuboard/bbs/board.php?bo_table=lecture&wr_id=320&sca=%EA%B7%B8%EB%88%84%EB%B3%B4%EB%93%9C&page=3)

    반응형

    댓글()

    [제로보드4] mysql 4.0 이하에서 4.1 이상으로 서버이전후 로그인 안될때

    리눅스/MySQL|2015. 1. 16. 11:06
    반응형

    login_check.php 파일 수정...

    원본소스를...
    // 회원 로그인 체크
          $result = mysql_query("select * from $member_table where user_id='$user_id' and password=password('$password')") or error(mysql_error());
          $member_data = mysql_fetch_array($result);


    다음과 같이 수정...
    // 회원 로그인 체크
          $p_result = mysql_query("select length(password) from $member_table where user_id='$user_id'") or error("password error<br>".mysql_error());
          $p_data = mysql_fetch_row($p_result);
          if($p_data[0] == 41)
                  $result = mysql_query("select * from $member_table where user_id='$user_id' and password=password('$password')") or error(mysql_error());
          else {
                  $m_result = mysql_query("select * from $member_table where user_id='$user_id' and password=old_password('$password')") or error(mysql_error());
                  $m_data = mysql_fetch_array($m_result);
                  if($m_data[no]) {
                          @mysql_query("update $member_table set password=password('$password') where no='$m_data[no]'") or error("new password update error<br>".mysql_error());
                          $result = mysql_query("select * from $member_table where user_id='$user_id' and password=password('$password')") or error(mysql_error());
                  }
                  else Error("로그인을 실패하였습니다");
          }
          $member_data = mysql_fetch_array($result);


    위와같이 작업하기 전에 zetyx_member_table의 password 컬럼길이를 20에서 41로 조정

     

     

    [출처] g3communication | jjjang (http://www.g3.cc/board/view.php?id=comm04_1&no=593)

    반응형

    댓글()

    mysql-table-sync를 이용한 MySQL 데이터 동기화

    리눅스/MySQL|2015. 1. 16. 11:05
    반응형

    #  MySQL Toolkit, http://mysqltoolkit.sourceforge.net/
    # mysql-table-sync, http://www.xaprb.com/blog/2007/03/18/introducing-mysql-table-sync/

    # 설치 전 요구사항
    - Linux, WIndows
    - perl
    - perl DBI, DBD 모듈

    # 설치

    shell> tar zxvf mysql-table-sync-0.9.2.tar.gz 
    shell> cd mysql-table-sync-0.9.2 
     
    shell> perl Makefile.PL 
    shell> make install 
     

    # 설치 후 작업
    - 소스 데이터 연결을 위한 환경설정

    MySQL 서버가 설치된 서버에서, 
     
    shell> ln -s my.cnf .my.cnf 
     

    # 옵션

    $ mysql-table-sync --help 
    Usage: /usr/bin/mysql-table-sync [OPTION].. <source> <dest> 
     
      --algorithm     -a   Algorithm to use (topdown, bottomup) 
      --[no]analyze   -A   Analyze (find/fix/print) in bottom-up algorithm (default) 
      --branchfactor  -B   Branch factor for bottom-up algorithm (default 128) 
      --bufferresults      Fetch all rows from MySQL before comparing 
      --[no]build     -U   Build tables for bottom-up algorithm (default) 
      --[no]cleanup   -C   Clean up scratch tables for bottom-up algorithm (default) 
      --[no]collate   -O   Use MySQL to compare strings if necessary (default) 
      --columns       -c   Comma-separated column list 
      --debug         -b   Print debugging output to STDOUT 
      --deleteinsert  -l   Convert all UPDATES to DELETE and INSERT 
      --drilldown     -d   Drilldown groupings for top-down algorithm 
      --engine        -E   Storage engine for bottom-up tables 
      --execute       -x   Execute queries required to sync 
      --forupdate     -f   Use SELECT FOR UPDATE or LOCK IN SHARE MODE for checksums 
      --help               Show this help message 
      --[no]lock      -k   Lock tables when beginning work 
      --maxcost       -m   Maximum rowcount before aborting 
      --onlydo        -o   Only do INS/UPD/DEL (default: all) 
      --prefix        -P   Tablename prefix for bottom-up algorithm 
      --print         -p   Print all sync queries to STDOUT 
      --queries       -q   Make debugging output executable SQL 
      --replicate     -r   Change on master. Implies --strategy=r 
      --separator     -e   Separator for CONCAT_WS 
      --singletxn     -1   Do in a single transaction 
      --size          -S   Table size in bottom-up algorithm, not usually needed 
      --strategy      -s   Query strategy when syncing (r=replace, s=ins/upd/del) 
      --temp          -T   Use temporary tables in bottom-up algorithm (default: no) 
      --timeoutok     -t   Keep going if --wait fails 
      --verbose       -v   Explain differences found; specify up to three times 
      --[no]verify    -V   Verify checksum compatibility across servers (default) 
      --wait          -w   Make slave wait for master pos (implies --lock) 
     
    /usr/bin/mysql-table-sync finds and resolves data differences between two MySQL tables. 
    <source> and <dest> are data sources in the format 
       user:pass@host:port/database.table:key 
    Everything but the table name is optional, and defaults will be read from your 
    environment and your .my.cnf file if possible.  Values for <dest> default to the 
    values for <source>. 
     
    For more details, please read the documentation: 
     
       perldoc /usr/bin/mysql-table-sync 
     

    # 소스 테이블과 대상 테이블간 부분 검색 (실제 동기화 작업은 일어나지 않고, 동기화를 위한 스크립트만 출력해준다.)

    $ mysql-table-sync --print ptop:ptoppw@10.30.40.131:3306/ptop.my_box ptop:ptoppw@10.30.40.132:3306/ptop.my_box 
    UPDATE `ptop`.`my_box` SET `session_id`='60331',`page_id`='5981',`title`='My 利앷텒',`box_list_id`='42',`pos_col`='0',`pos_row`='-63.5625',`param1`=NULL,`param2`=NULL,`param3`=NULL,`param4`=NULL,`param5`=NULL,`param_text`=NULL WHERE `id` = '434072'; 
    UPDATE `ptop`.`my_box` SET `session_id`='60331',`page_id`='5981',`title`='怨꾩궛湲?,`box_list_id`='1121',`pos_col`='0',`pos_row`='-67.5625',`param1`='http://wm.daum.net/widget/flash/Calculator.swf',`param2`=NULL,`param3`='185',`param4`='290',`param5`=NULL,`param_text`=NULL WHERE `id` = '434082'; 
    INSERT INTO `ptop`.`my_box`(`id`,`session_id`,`page_id`,`title`,`box_list_id`,`pos_col`,`pos_row`,`param1`,`param2`,`param3`,`param4`,`param5`,`param_text`) VALUES('423482','60331','5981','My 利앷텒','42','1','-6.87408447265625',NULL,NULL,NULL,NULL,NULL,NULL); 
    INSERT INTO `ptop`.`my_box`(`id`,`session_id`,`page_id`,`title`,`box_list_id`,`pos_col`,`pos_row`,`param1`,`param2`,`param3`,`param4`,`param5`,`param_text`) VALUES('427971','60331','5981','Alice in Wonderland','5','1','-12.8740844726561','http://in-wonderland.tistory.com/rss','summary','10','','',NULL); 
    INSERT INTO `ptop`.`my_box`(`id`,`session_id`,`page_id`,`title`,`box_list_id`,`pos_col`,`pos_row`,`param1`,`param2`,`param3`,`param4`,`param5`,`param_text`) VALUES('434081','60331','5981','BBC News | News Front Page | World Edition ','521','0','-59.5625','http://news.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml',NULL,NULL,NULL,NULL,NULL); 
    [mysql@spf-per-db01 ~]$ 
     

    # 소스 테이블 기준으로 대상 테이블과 싱크 맞추기 (동기화를 위한 스크립트 실행한다. 단, 단일 트랜잭션으로 처리한다.)

    $ mysql-table-sync --print --execute --singletxn ptop:ptoppw@10.30.40.131:3306/ptop.my_box ptop:ptoppw@10.30.40.132:3306/ptop.my_box

     

     

    [출처] Mixellaneous | 김영우 (http://mixellaneous.tistory.com/94)

    반응형

    댓글()

    select 결과를 파일로 저장하기

    리눅스/MySQL|2015. 1. 16. 11:05
    반응형

    두가지 방법이 있습니다.

     

    1. 첫번째

    # mysql -uroot -p sysdocu -e "select * from member" -t > member.txt

     

    sysdocu : DB명

    member : 테이블명

    member.txt : 결과를 저장할 파일명

     

     

    2. 두번째

    우선 mysql 에 로그인 후

     

    mysql> use sysdocu

    mysql> select * into outfile '/home/sysdocu/member.txt' from member;

     

    sysdocu : DB명

    /home/sysdocu/member.txt : 결과를 저장할 경로 및 파일명 (경로가 없고 파일명만 쓸경우 mysql 로그인했던 위치에 생성 됨)

    member : 테이블명

    반응형

    댓글()

    latin1 DB data를 euckr DB 로 넣기 (iconv 이용)

    리눅스/MySQL|2015. 1. 16. 11:05
    반응형

    latin1 DB를 dump 받아서 그대로 euckr DB에 넣으면 캐릭터셋이 다르므로 한글이 깨지게 됩니다.

    아래와 같은 절차를 통해 한글이 깨지지 않게 이전을 할 수 있습니다.

    (여기에서는 euckr DB인데 테이블을 latin1로 생성해서 쓰고있을 경우를 설명)

     

    우선 latin1 DB를 사용하는곳에서 dump를 받습니다.

     

    mysqldump -uroot -p sysdocu > sysdocu.sql

     

    latin1 에서 dump 받을 경우 utf8 로 저장되기 때문에 아래와 같이 iconv 로 캐릭터셋 변환 작업을 해주어야 합니다.

     

    iconv -c -f utf8 -t latin1 sysdocu.sql > sysdocu_euckr.sql

     

    변경 후 neulwon_euckr.sql 을 vi 로 열어보면 테이블 생성을 latin1으로 하므로

    vi 편집기를 이용하여 euckr로 변경해줍니다. (utf8 문자도 euckr로 변경)

     

    vi sysdocu_euckr.sql

     

    :%s/latin1/euckr/g        <-- latin1를 euckr로 일괄 변경

    :%s/utf8/euckr/g          <-- utf8을 euckr로 일괄 변경

      

    수정된 파일을 저장을 하여 DB를 이전할 서버로 보냅니다.

    그리고 이전할 서버에서 neulwon 이라는 DB 생성 후 데이타를 import 합니다. 

     

    mysql -uroot -p sysdocu < sysdocu_euckr.sql

     

    mysql 로그인하여 select 해보면 한글이 정상적으로 보이는 것을 확인할 수 있습니다.

    반응형

    댓글()