'connecting'에 해당되는 글 2건

  1. 2008.10.17 인커밍(incoming) MySQL 커넥션을 테이블에…
  2. 2008.10.17 MySQL과 SQLGate for MySQL 연결방법
2008.10.17 11:01

인커밍(incoming) MySQL 커넥션을 테이블에…

- 원문은 http://www.futhark.ch/mysql/143.html 에 있음

MySQL 5.1에서는 일반적인 쿼리 로그를 테이블에 저장할 수가 있다. 하지만 만약에 모든 단일 명령문을 로그하는 대신에 단지 로깅을 하는 사용자 및 접속을 하는 호스트만 로그 하고자 할 경우에는 어떻게 해야 하는가? 이번 컬럼에서는 위의 문제를 간단하게 해결할 수 있는 방법을 설명하기로 한다. 이 해법은 MySQL 5.0에서도 실행할 수 있으며, 약간의 변경만 하면 이전 버전에서도 실행 시킬 수가 있다.

이에 대한 해결책은 바로 로깅 루틴을 설치하는 도구로 init_connect 서버 변수를 사용하는 것이다. init_connect 변수는 커넥션되는 각 클라이언트(SUPER 사용자는 제외)를 위해 실행되는 SQL 명령문을 가지고 있다.

우선, 커넥션 로그(connecting log)를 보관하기 위한 데이터 베이스와 테이블을 하나씩 생성한다. 새로운 데이터 베이스 sys를 아래와 같이 생성한다.

CREATE DATABASE IF NOT EXISTS sys;

CREATE TABLE sys.connection_log (
log_id INT UNSIGNED NOT NULL auto_increment,
login_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
connection_id INT(10) NOT NULL,
user_id VARCHAR(255) NOT NULL,
PRIMARY KEY (log_id),
KEY (user_id)
);

로그 엔트리를 주문(order)하기 위해서는 auto_increment 컬럼이 필요한데, 그 이유는 TIMESTAMP만으로는 불충분하고 CONNECTION_ID()는 서버가 재 시작(restart)되면 리셋(reset)되어 버리기 때문이다.

다음으로는, 커넥션 정보를 로그에 기록하는 간단한 루틴을 설치한다. CREATE 명령어는 루트(root)로 실행하거나 또는 sys.connection_log 테이블에 INSERT 권한을 가진 사용자로 실행하는 것이 좋다.

delimiter //

CREATE PROCEDURE sys.init_connect()
SQL SECURITY DEFINER
MODIFIES SQL DATA DETERMINISTIC
BEGIN
INSERT INTO connection_log
(connection_id, user_id)
VALUES (CONNECTION_ID(), USER());
END //

delimiter ;

SQL SECURITY를 DEFINER에 설정함으로써, 일반 사용자로부터 오는 로깅 시스템의 모든 내부 정보는 숨길 수가 있게 된다. 우리가 원하는 것은 단지 모든 사용자에게 새로운 데이터 베이스 sys상에서의 글로벌 실행 권한만을 주는 것이다.

REPLACE INTO mysql.db
(Host, Db, User, Execute_priv)
VALUES ('%', 'sys', '', 'Y');

FLUSH PRIVILEGES;

로깅을 활성화 시키기 위해서는, 우리가 사용한 루틴을 init_connect 변수에 연결(hook)하기만 하면 된다:

SET GLOBAL init_connect = 'CALL sys.init_connect()';

만일 서버가 리부팅(rebooting)될 때에도 커넥션 로깅 정보가 남아 있도록 하고자 한다면, 이 설정 내용을 my.cnf 파일에 추가하면 된다:

[mysqld]
init_connect = 'CALL sys.init_connect()'

이와 같이 하면, 모든 커넥션(connection)은 로그가 된다.
실무에 많은 도움이 되시길……….

Trackback 0 Comment 0
2008.10.17 10:57

MySQL과 SQLGate for MySQL 연결방법

SQLGate for MySQL 을 MySQL 과 연결을 못하시는 분들이 많다는걸 알게 되었습니다.
그래서 이렇게 연결을 못해서 사용을 못하시는 분들을 위해 아래와 같은 문서를 작성하였습니다.
아직 연결을 못하신 분들을 아래의 절차를 통해서 연결하시기 바랍니다.

1

telnet 명령어를 통해서 mysql 이 실제 서비스 중인지 확인합니다.

c:\>telnet 아이피주소 3306
3.23.38-nt3?;ft4B3to

만약 telnet 명령어로 위와 같은 답을 못얻었을 경우는 서비스 중이 아니거나 또는 방화벽 또는
포트를 죽였는지 확인해 보시기 바랍니다.

위에 3.23XXX 쪽은 자신의 MySQL 버전에 따라 다른 문자로 표현될 수 있습니다.

2

Window => 도스프로그램에서 root 권한으로 MySQL에 접속합니다.
Linux => Telnet 접속후 root 권한으로 MySQL에 접속합니다.

mysql>use mysql;

mysql>create database test_db;

mysql>insert into db values('%','test_db','test_user','y','y','y','y','y','y','y','y','y','y');

mysql>insert into user (host,user,password) values('%','test_user',password('1234'));

mysql>flush privileges; or shell환경에서 mysqladmin reload -p

Host 에서 %는 와일드(wild) 문자로 '모든'을 의미합니다. 이 뜻은 모든곳에서 접속이 가능하다는뜻이죠.
Host 에서 localhost 라고 되어 있다면 이것은 결국 서버에서만 접속이 가능하다라는 뜻으로 해석됩니다.
Host 가 localhost 일 경우 대부분 접근 거부 에러를 발생하게 됩니다.

*)다른 방법은 계정접속후에 % 을 지원하도록 하는겁니다.

mysql> GRANT ALL PRIVILEGES ON *.* TO root@%
IDENTIFIED BY '123456' WITH GRANT OPTION;

위에 방법은 root 유저에게는 어디서든지 접속이 가능하게 설정해준 결과가 됩니다. 

3 SQLGate for MySQL 접속합니다.
 

만약 그래도 접속이 잘 안되실 경우는
http://www.sqlgate.com/bbs/zboard.php?id=bug_mysql
에 문의하시기 바랍니다.

다음과 같은 에러가 발생시

  1. I get an error when connecting: 2003 - Can't connect to MySQL server on 'some_host_name' (10060)

    위에 경우에는 물리적으로 MySQL Server 에 접속할 수 없는 경우입니다. 그 이유는 몇가지 있습니다.

    1. 네트워크 연결 상태가 올바르지 않습니다.
    - 네트워크 연결상태를 체크합니다.

    2. MySQL Server 가 올바르게 작동하고 있지 않습니다
    - 시스템 담당자에서 MySQL Service를 Restart 하도록 요청합니다.

    3. 방화벽 또는 포트가 막혀 있습니다.
    - 시스템 담당자에서 포트를 개방해 달라고 요청합니다.

    4.서버셋업시 "--skip-networking" 옵션을 설정한 경우입니다. 이경우에는 로컬호스트 이외에는 접근할 수가 없습니다.
    - Config 설정시 위에 옵션을 제거합니다.

    More - http://www.mysql.com/doc/C/a/Can_not_connect_to_server.html

    아래의 글은 SQLGate for MySQL 사용자의 체험담입니다.
    Linux7.x 버전을 설치하신분은 이런일을 겪지 않을실까 걱정되어 글을 올리게 되네요.
    아무설정도 하지않고 그냥 설치했습니다.
    리눅스 설치할때 보안수준(Firewall)은 미디엄으로 설치했고요. 중간에 하두 안되서 Firewall 수준을 최저로 낮춰봐도 소용이 없더라구요. 그래도 ipchains 의 값은 변경되지 않나봐요. ㅡ.ㅡ;
    암튼 어느 게시판엔가 ipchains -L 해서 몬가 의심스러운(?)게 나온다면 ipchain 을 공부하라고 써있더군요.
    그래서 ipchains -L 해보니 모든 패킷의 input이 다 막혀있고 딱 세가지 telnet, http,ftp 이 세가지만 허용이 되어있더군요.
    이게 리눅스 설치할때 Firewall 수준을 미디엄으로 하면 이렇게 설정되나바요.
    (다른 수준으로 설치해보진 않았음 ^^;)

    결국 그래서 아래 문서보면서 해결하고 있습니다. 일단 깝깝한게 해결되어 기뿐맘으로 글 올립니다. 그럼 고생하세요~. 좋은 작품 기대하겠습니다. 고생스런 답변도 감사하고요. ^^ 즐프~

    http://kldp.org/Translations/IPCHAINS-HOWTO

  2. I get an error when connecting: 1130 - Host "some_client_name_or_ip" is not allowed to connect to this MySQL server

    More -http://www.mysql.com/doc/A/c/Access_denied.html
  3. I get an error when connecting: Error 1045 - Access Denied for User 'XYZ@HOSTXYZ' (Using password: NO)

    More - http://www.mysql.com/doc/A/c/Access_denied.html

Trackback 1 Comment 0