'MySQL'에 해당되는 글 4건

  1. 2012.06.08 mySQL을 위한 ssh 터널링
  2. 2012.01.12 Ubuntu 개발 시스템 설치
  3. 2006.12.22 MySql Connection Problem..
  4. 2006.12.05 MySQL 사용자 추가

server는 mysql이 설치되어 있는 서버로 대부분의 서버는 mySQL을 3306으로 오픈하고 localhost에서만 

접근이 가능하게 하고 있다.


때문에 local에서 작업을 할 경우 DB연결이 필요한 경우에는 ssh터널링 등을 사용해야 한다.


mySQL 을 로컬 시스템에서 터널링으로 사용하기 위한 커맨드.


ssh -f user_id@server_url -L localport:server_url:server_port -N

ssh -f 사용자아이디@서버주소 -L 로컬포트:서버주소:서버포트 -N

ssh -f my_ssh_id@server.com -L 3306:server.com:3306 -N


ssh옵션 정리

-f : ssh 를  background로 동작하게 한다.

-L: 주어진 로컬 호스트(클라이언트)의 포트를 리모트 사이드(서버)의 포트로 포워드되게 한다.

-N: remote  command 사용을 하지 않는다.


사용예

ssh -L [mysql_forward_port]:localhost:[server_mysql_port] user_id@server_url

mysql -u[mysql_user_id] -p[mysql_password] -P[mysql_forward_port] -h[host_ip] [database_name]


간만에 서버/로컬 의미로 헷갈린다.


참고 사이트

http://wiki.kldp.org/wiki.php/OpenSshTunneling

http://www.revsys.com/writings/quicktips/ssh-tunnel.html

Posted by twintail twintail

1. mysql 설치하기

- sudo apt-get install mysql-server 실행

- 설치 중 root 패스워드를 입력(2회입력) 


2. mysql 접속하기

- mysql -uroot -h127.0.0.1 -p -Dmysql

- 사용자 root로 127.0.0.1의 mysql db로 패스워드 인증방식으로 접속


3. 사용자 추가 및 권한 지정

mysql> CREATE USER 'smpladm'@'localhost' IDENTIFIED BY 'smpladm';

Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON smpladm.* TO 'smpldb'@'localhost';

Query OK, 0 rows affected (0.00 sec)

           

* 참고사항 Auto Commit에 대하여.

SELECT @@AUTOCOMMIT;  

SET AUTOCOMMIT = TRUE;

SET AUTOCOMMIT = FALSE;

COMMIT;

ROLLBACK;


* 참고사항 기본 DB엔진확인

SHOW CREATE TABLE user \G

- innodb를 사용하고 싶다면 /etc/mysql/my.cnf에 다음 라인을 추가함.

  [mysqld]

  default-storage-engine=innodb  


4. 사용자 DB생성 및 테이블 구성


5. memcached 설치

sudo apt-get install memcached

watch "echo stats | nc 127.0.0.1 11211"


6. redis 설치

sudo apt-get install redis-server

watch "echo info | nc 127.0.0.1 6379"

Posted by twintail twintail
TAG MySQL, ubuntu

autoReconnect는 비추천되고 있다. 결과를 가져올때까지 반복하는 것이 해결책으로 제시되고 있다.

참고.


Question:

I have a servlet/application that works fine for a day, and then stops working overnight

Answer:

MySQL closes connections after 8 hours of inactivity. You either need to use a connection pool that handles stale connections or use the "autoReconnect" parameter (see Section 23.3.4.1, “Driver/Datasource Class Names, URL Syntax and Configuration Properties for Connector/J”).

Also, you should be catching SQLExceptions in your application and dealing with them, rather than propagating them all the way until your application exits, this is just good programming practice. MySQL Connector/J will set the SQLState (see java.sql.SQLException.getSQLState() in your APIDOCS) to "08S01" when it encounters network-connectivity issues during the processing of a query. Your application code should then attempt to re-connect to MySQL at this point.

The following (simplistic) example shows what code that can handle these exceptions might look like:

Example 23.12. Example of transaction with retry logic

[CODE type=java]public void doBusinessOp() throws SQLException {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

//
// How many times do you want to retry the transaction
// (or at least _getting_ a connection)?
//
int retryCount = 5;

boolean transactionCompleted = false;

do {
try {
conn = getConnection(); // assume getting this from a
// javax.sql.DataSource, or the
// java.sql.DriverManager

conn.setAutoCommit(false);

//
// Okay, at this point, the 'retry-ability' of the
// transaction really depends on your application logic,
// whether or not you're using autocommit (in this case
// not), and whether you're using transacational storage
// engines
//
// For this example, we'll assume that it's _not_ safe
// to retry the entire transaction, so we set retry count
// to 0 at this point
//
// If you were using exclusively transaction-safe tables,
// or your application could recover from a connection going
// bad in the middle of an operation, then you would not
// touch 'retryCount' here, and just let the loop repeat
// until retryCount == 0.
//
retryCount = 0;

stmt = conn.createStatement();

String query = "SELECT foo FROM bar ORDER BY baz";

rs = stmt.executeQuery(query);

while (rs.next()) {
}

rs.close();
rs = null;

stmt.close();
stmt = null;

conn.commit();
conn.close();
conn = null;

transactionCompleted = true;
} catch (SQLException sqlEx) {

//
// The two SQL states that are 'retry-able' are 08S01
// for a communications error, and 40001 for deadlock.
//
// Only retry if the error was due to a stale connection,
// communications problem or deadlock
//

String sqlState = sqlEx.getSQLState();

if ("08S01".equals(sqlState) || "40001".equals(sqlState)) {
retryCount--;
} else {
retryCount = 0;
}
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException sqlEx) {
// You'd probably want to log this . . .
}
}

if (stmt != null) {
try {
stmt.close();
} catch (SQLException sqlEx) {
// You'd probably want to log this as well . . .
}
}

if (conn != null) {
try {
//
// If we got here, and conn is not null, the
// transaction should be rolled back, as not
// all work has been done

try {
conn.rollback();
} finally {
conn.close();
}
} catch (SQLException sqlEx) {
//
// If we got an exception here, something
// pretty serious is going on, so we better
// pass it up the stack, rather than just
// logging it. . .

throw sqlEx;
}
}
}
} while (!transactionCompleted && (retryCount > 0));
}[/CODE]

Note. Use of the autoReconnect option is not recommended because there is no safe method of reconnecting to the MySQL server without risking some corruption of the connection state or database state information. Instead, you should use a connection pool which will enable your application to connect to the MySQL server using an available connection from the pool. The autoReconnect facility is deprecated, and may be removed in a future release.

Posted by twintail twintail

MySQL 사용에서의 일반적인 실수는 사용자의 추가에서 혼동하기 쉽다.

사용자의 추가 방법은 root를 사용하여 user 테이블에 사용자를 추가하는 방법과 Grant 문을 사용하여 사용자를 추가하는 방법 두가지 방법이 있다.

insert를 사용하여 사용자를 추가할 경우 mysql에 대한 접근이 가능하게 되고, grant를 사용하여 해당사용자를 추가할 경우 접근 가능한 db에 대해서만 접근을 허용하게 된다.

이러한 것은 mysql의 보안과 관련이 있는 것이므로 어떤 방법을 사용할 것인지는 신중히 결정해야 한다.

Grant를 사용한 사용자 추가를 권장한다. db 1개에 대하여 사용자 1명을 하는 것이 jdbc를 사용한 컨넥션에 사용하기 좋다.

사용법은 다음과 같다.


1. db를 생성한다. 옵션을 지정할 수 있으나 옵션이 없을 경우는 MySql의 기본 옵션에 따라 db가 생성된다.

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


2. 사용자를 추가하고 생성된 db에 접근 권한을 지정한다. test DB에 대하여 모든 권한을 주게 된다.

GRANT ALL PRIVILEGES ON test.* TO 'test'@'localhost' IDENTIFIED BY 'test';


3. 등록된 사용자의 확인

mysql.user 테이블을 확인해 보면 사용자가 추가된 것을 볼 수 있다. 다만 모든 권한이 N으로 설정되어 있으므로 사용자가 권한이 없는 것으로 보인다. 하지만 db에 대한 사용자의 권한은 mysql.db 테이블에 설정되어 있다.
다음 명령을 사용하여 확인이 가능하다.

mysql> connect mysql;
mysql> select * from user;
mysql> select * from db;

4. jdbc 컨넥션 테스트.

eclipse의 Database explorer를 통하여 확인이 가능하다. 이것을 사용하기 위해서는 MySql Connector/j library가 요구된다.

jdbc driver class 는 com.mysql.jdbc.Driver 이고 별도로 컨넥션에 대한 설정을 변경하지 않았다면 test로 생성된 db에 대한 접근 url은 jdbc:mysql://localhost:3306/test가 된다.




Posted by twintail twintail
TAG JDBC, MySQL