레이블이 mysql인 게시물을 표시합니다. 모든 게시물 표시
레이블이 mysql인 게시물을 표시합니다. 모든 게시물 표시

2018년 3월 10일 토요일

MySQL 자주 사용하는 명령어

mysql 설치

$ sudo apt install mysql-server

mysql 서버 접속

사용자 id가 root 이고 password 가 있는 경우

$ mysql -u root -p

database 목록 표시

mysql> show databases;

database 생성

mysql> create database <db name>;
또는
mysql> create schema <db name>;

예)
mysql> create database test_db;

사용할 database 선택

mysql> use <db name>;

예)
mysql> use test_db;
 

table 생성


양식: http://dev.mysql.com/doc/refman/5.1/en/create-table.html
mysql> create table table_name
    (create_definition, ...)
    [table options]
    [partition options];

예)
mysql> create table users (
    id varchar(256) not null,
    password varchar(256) not null,
    email varchar(256) not null,
    primary key (id)
);

또는 여러 field 값을 primary key 로 설정
mysql> create table users (
    id varchar(256) not null,
    password varchar(256) not null,
    email varchar(256) not null,
    primary key (id, pw)
);


Auto increment

mysql> create table users (id medium int not null auto_increment, ...)


table 속성 보기

msyql> desc <table name>;

예)
msyql> desc user; 
 

table 제거

http://dev.mysql.com/doc/refman/5.5/en/drop-table.html
mysql> drop table [if exists] table_name [, table_name]

예)
mysql> drop table if exists test_tbl;

계정 목록

mysql> select user from mysql.user;

계정 만들기

mysql> create user '<usename>'@'<host>' identified by '<password>';

예)
mysql> create user 'testuser'@'localhost' identified by 'testuserpassword';


계정 권한 주기

mysql> grant all privileges on <db name>.* to <user name>@<host> identified by '<password>' with grant option;

예)
mysql> grant all privileges on test_db.* to 'testuser'@'localhost' identified by 'testuserpassword' with grant option;

DB 백업 (dump)

$ mysqldump -u [username] -p [db name] > [filename]

예)
$ mysqldump -u testuser -p testdb > backupdump.sql

DB 백업 복구


복구하려는 database 는 미리 생성해야 함
$ mysql -u [username] -p [db name] < [filename]

예)
$ mysql -u testuser -p testdb < backupdump.sql

2013년 4월 16일 화요일

[Tomcat] JDBC pool + MySql

참고: http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

MySQL JDBC 드라이버

결과물 폴더 구조
 - 테스트용 프로젝트는 결과적으로 아래와 같은 구조를 갖게 된다.

테스트를 위한 DB 준비
 - 테스트용 DB 계정 생성 및 DB Schema 생성
C:\> mysql -u root -p
Enter password: *******

mysql> grant all privileges on *.* to tester@localhost identified by 'changeit' with grant option;
Query OK, 0 rows affected (0.17 sec)

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

mysql> use javatest;
Database changed

mysql> create table testdata (id int not null auto_increment primary key, foo varchar(25), bar int);
Query OK, 0 rows affected (0.24 sec)

mysql> insert into testdata values(null, 'hello', 12345);
Query OK, 1 row affected (0.02 sec)

mysql> select * from testdata;
+----+-------+-------+
| id | foo   | bar   |
+----+-------+-------+
|  1 | hello | 12345 |
+----+-------+-------+
1 row in set (0.00 sec)

web.xml
- 테스트용 서블릿 (com.javatest.MySqlTestServlet) 을 등록했다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
 id="WebApp_ID" version="3.0">
 <display-name>TomcatTest</display-name>

 <servlet>
  <servlet-name>MySqlTestServlet</servlet-name>
  <servlet-class>com.javatest.MySqlTestServlet</servlet-class>
 </servlet>

 <servlet-mapping>
  <servlet-name>MySqlTestServlet</servlet-name>
  <url-pattern>/MySqlTest</url-pattern>
 </servlet-mapping>

 <welcome-file-list>
  <welcome-file>redirect.jsp</welcome-file>
 </welcome-file-list>
</web-app>

redirect.jsp
- 테스트용 서블릿 (com.javatest.MySqlTestServlet) 으로 redirect 한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
response.sendRedirect("MySqlTest");
%>

context.xml 파일
- DataSource 를 생성한다.
<?xml version="1.0" encoding="UTF-8" ?>
<Context docBase="TomcatTest" path="/TomcatTest" reloadable="true">

<Resource name="jdbc/mySqlDb"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="100" 
minIdle="10"
maxWait="10000"
initialSize="10" 
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000" 
jmxEnabled="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
loginTimeout="10"
username="tester"
password="changeit"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/javatest?autoReconnect=true"
/>

</Context>

MySqlTestServlet.java
 - 테스트용 서블릿 소스 코드
 - javax.naming.InitialContext 객체를 생성하고 lookup() 함수로 context.xml 파일에서 설정한 DataSource 객체를 얻는다.
 - 나머지는 일반적인 JDBC 사용법과 같다.
 - JDBC pool 을 사용해도 Connection 객체는 close() 를 해주어야 한다.
  > 참고: http://stackoverflow.com/questions/4938517/closing-jdbc-connections-in-pool
package com.javatest;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class MySqlTestServlet extends HttpServlet {

 protected void doGet(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {

  response.setContentType("text/plain");
  PrintWriter writer = response.getWriter();

  Connection conn = null;

  try {

   Context con = new InitialContext();
   DataSource ds = (DataSource) con
     .lookup("java:comp/env/jdbc/mySqlDb");
   conn = ds.getConnection();

   Statement st = conn.createStatement();
   ResultSet rs = st.executeQuery("select * from testdata");
   ResultSetMetaData rsmd = rs.getMetaData();
   int cnt = rsmd.getColumnCount();
   StringBuffer sb = new StringBuffer();
   for (int i = 0; i < cnt; i++) {
    sb.append(String.format("[%s]\t", rsmd.getColumnName(i + 1)));
   }
   writer.println(sb.toString());
   writer.println("=======================================");
   while (rs.next()) {
    sb = new StringBuffer();
    for (int i = 0; i < cnt; i++) {
     sb.append(String.format("[%s]\t", rs.getString(i + 1)));
    }
    writer.println(sb.toString());
   }

   rs.close();
   st.close();
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (conn != null)
    try {
     conn.close();
    } catch (SQLException e) {
     e.printStackTrace();
    }
  }
 }

}


실행 결과
 - http://localhost:8080/TomcatTest/MySqlTest


2012년 8월 2일 목요일

MyBatis + Software caused connection abort: recv failed

참고: http://linuxism.tistory.com/580

서버를 실행하고 오래 접속을 하지 않으면 아래 와 같은 에러가 발생할 수 있다.
Software caused connection abort: recv failed

바로 다시 접속하면 연결이 되기는 하지만 신경이 쓰이는 부분이다.

DB 와 연결하고 오래 사용하지 않으면 연결이 끊긴다. 그래서 주기적으로 아주 간단한 query 를 날려 줄 필요가 있다.

아래와 같이 설정 하였다.
<environments default="development">
 <environment id="development">
  <transactionManager type="JDBC"/>
  <dataSource type="POOLED">
   <property name="driver" value="${jdbc.driver}"/>
   <property name="url" value="${jdbc.url}"/>
   <property name="username" value="${jdbc.username}"/>
   <property name="password" value="${jdbc.password}"/>
   <!-- Pool ping setting : http://linuxism.tistory.com/580 -->
   <property name="poolMaximumActiveConnections" value="20"/>
   <property name="poolMaximumIdleConnections" value="20"/>
   <property name="poolMaximumCheckoutTime" value="20000"/>
   <property name="poolPingEnabled" value="true"/>
   <property name="poolPingQuery" value="select 1"/>
   <property name="poolPingConnectionsNotUsedFor" value="43200"/>
   <property name="poolTimeToWait" value="30000"/>
   <property name="driver.encoding" value="UTF-8"/>
  </dataSource>
 </environment>

...

poolPingEnabled 를 true 로 설정한다.
poolPingQuery 는 select 1 과 같은 아주 간단한 query 로 설정한다.
poolPingConnectionsNotUsedFor 에 지정한 시간 만큼 사용하지 않으면 ping query 를 날린다. (millisecond 단위)

2012년 2월 5일 일요일

PHP 에서 Mysql 사용시 자주 사용하는 코드

1) DB 연결과 해제:
<?php
 $conn = mysql_connect("hostname", "mysql_user_id", "mysql_user_password");

 if (!$conn) {
  die("mysql_create() error");
 }

 mysql_select_db("dbname");

 mysql_close($conn);
?>

2) DB 테이블 내용 조회:
<?php
 $conn = mysql_connect("hostname", "mysql_user_id", "mysql_user_password");
 if (!$conn) {
  die("mysql_create() error");
 }
 
 mysql_select_db("dbname");
 $query = "select * from 'tablename'";
 $result = mysql_query($query);
 if (!$result) {
  die("mysql_query() error");
 }

 while ($row = mysql_fetch_assoc($result)) {
  // handle row
 }

 mysql_free_result($result);
 mysql_close($conn);
?>
팁) 페이징 처리
select * from 'tablename' limit <start index>, <view count>

3) 간단 조회:
<?php
 $conn = mysql_connect("hostname", "mysql_user_id", "mysql_user_password");
 if (!$conn) {
  die("mysql_create() error");
 }
 mysql_select_db("dbname");

 $query = "select count(*) from 'tablename'";
 $result = mysql_query($query);
 if (!$result) {
  die("mysql_query() error");
 }

 $count = mysql_result($result, 0, 0);

 mysql_free_result($result);
 mysql_close($conn);
?>