mySQL 4.x 버전에서는 innodb가 기본적으로 탑재되어 있었지만, 5.1.3x 버전부터는 configure 옵션에서

--with-plugins=innobase 또는 --with-plugins=max 옵션을 추가해줘야만 innodb를 사용할 수 있다.

innodb 설치 여부는 콘솔에서 아래와 같이 확인할 수 있다.

mysql> show variables like 'have_innodb';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| have_innodb   | NO    |

+---------------+-------+

1 row in set (0.00 sec)


have_innodb 값이 NO라면 설치가 되어 있지 않은 것이다.

 이런 경우 재설치를 해야만 innodb를 사용할 수 있지만, 구굴링을 해보니 plugin 방식으로 추가할 수 있단다.

/etc/my.cnf 파일에서 [mysqld] 섹션에 아래 부분을 추가한 후 mysql 재실행.

# vi /etc/my.cnf

[mysqld]
ignore-builtin-innodb
plugin-load=innodb=ha_innodb_plugin.so

# /etc/rc.d/init.d/mysqld restart

 mysql 콘솔에서 아래 2가지 방식으로 innodb 로드된 것을 확인.

mysql> show variables like 'have_innodb';

mysql> show engines;

 

출처 : https://blog.naver.com/aramjo/120171873253

--skip-extended-insert
해당옵션은 MySQL덤프를 뜨는경우 VALUES뒤에 여러 개의 데어터셋이 붙어있는 다중열 신텍스 형태로
덤프 뜨지않아 구문어서 해당라인을 찾기가 용의

--allow-keywords 
MySQL예약어와 동일한 필드명이 있을경우 복원시에 에러가 발생시
이옵션을 이용하여 덤프를 받으면 테이블명와 필드명에 ``해당 기호가 삽입되어 정상적으로 인식

--complet-insert -c
완전한 인서트문을 구성한다 .
 ex) insert into table_name(field1,field2) values(value1,value2)

--no-data
덤프시 데이터를 구성하지 말라는 옵션이다 .
이는 스키마 만 덤프를 받아 개발이나 구성서시 주로이용

--no-create-db
테이블 생성 쿼리를 구성하지 말라는 옵선

--quick, -q
대용량 데이타베이스를 덤프뜰때 유용 
한번에 한열씩 축출하며 쓰기전에 메로리에 버퍼링을 하록 하는옵션

--xml -x
XML형태로 덤프 받을시 이용

--default-chareter-set
덤프받을시 지정하는게릭터셋으로 연결하여 덤프 받는 옵션
하지만 테이블의 언어셋을 변경하여 받아주지는않음.


실제 mysqldump의 옵션은 많지만 주로사용하는것만 기술하였다.

 

2. 간단한 사용법에 대해 알아보자

분명히 euc_kr 데이터가 쌓여있는데 덤프를 받으면 깨지는경우

     -  이는 MySQL 서버가 다른언어셋으로 구성되어 있어 이중으로 인코딩되어 
        한글이나 다른언어들이 깨지는 현상이 발생한다 .
 이경우는 다음고 같이 덤프 받는다.

 mysqldump --default-chareter-set=euckr -u user -p  dbname > dbname.sql


버전이 달라  mysql디비가 인서트가안될경우 
     - 메이져 버전이 다를경우 MySQL데이터베이스안의 user,db,hot등의 테이블 구조가 달라 
       일반적으로 덤프를든경우  정상적으로 인서트되니않는다.
 이경우는 다음고 같이 덤프 받는다.

 mysqldump --complet-insert -u user -p  dbname > dbname.sql


예약어와 동일한 필드명 때문에 인서트가안될경우 
     - 필드명으로 인식하기전에 예약어로 인식하여 에러를 발생시킨다.
 이경우는 다음고 같이 덤프 받는다.

 mysqldump --allow-keywords -u user -p  dbname > dbname.sql

 

보통 덤프를 받을때 
 mysqldump --allow-keywords --default-chareter-set=euckr --skip-opt  -u user -p  dbname > dbname.sql
 위와 같은 형태로 받는다면 큰무리없이 복원이 가능할것이다.

 

출처 : https://www.linux.co.kr/home/lecture/index.php?cateNo=3&secNo=16&theNo=45&leccode=10956

mysqldump로 백업시에 where조건에 맞는 데이터만 백업하기

이번에는 좀 특이한 백업방법을 소개해 드리겠습니다.   

즉, 지금까지의 백업방법은 대부분 로컬서버나 또는 원격서버의 MYSQL의 특정 데이터베이스를 백업대상으로 하거나 또는
특정 데이터베이스의 테이블들, 또는 데이터베이스 스키마등만을 그 대상으로 하여 백업하였습니다.   

하지만 이번 예에서는 특정 데이터베이스 내에 실제 데이터들 가운데 특정조건에 맞는 데이터만을 백업하는 방법을 소개할까합니다. 

즉 특정 데이터베이스 전체를 대상으로 한 것도 아니고 특정 데이터베이스의 테이블 전체를 대상으로하는 백업도 아닌 
특정 테이블의 데이터(레코드값)들 가운데 조건에 해당하는 데이터(레코드값)만을 골라서 백업하는 방법을 의미합니다.

이와 같은 백업을 하려면 --where옵션을 사용하여 조건문을 지정해 주시면 됩니다.

사용하는 형식은 다음과 같습니다.   

사용형식 : mysqldump -u root -p --where=“WHERE조건문” DB명 테이블명 > 파일명
(위의 형식에서 --where대신에 -w를 사용할 수도 있습니다.)

[주의사항]
* --where 의 조건은 무조건 " " 으로 막고,
* --where 조건안의 조건값은 숫자가 아니면 무조건 ' '으로 막고,
* 모든 테이블이 같은 조건에 적용될 수 밖에 없습니다.

즉, 테이블이 모두 다른 조건 문으로 추출되어야 한다면 사용할 수는 없습니다~!!!!!

아래의 예는 temp_db2데이터베이스 내의 Demo_DomainAdmin이라는 테이블의 실제 데이터들 가운데
admin_id필드값이 “admin”인 레코드만을 백업하여 temp_db2.sql파일에 저장하는 예입니다.

즉, --where=“admin_id=‘admin’”이라는 조건문 때문에 이와 같은 백업이 가능한 것입니다.

[root@file bin]# ./mysqldump -u root -p --where="admin_id='admin'" temp_db2  Demo_DomainAdmin > ./temp_db2.sql

Enter password: ********

[root@file bin]#

[root@file bin]# ls -l temp_db2.sql

-rw-r--r--    1 root     root          506  2월 14 16:46 temp_db2.sql

[root@file bin]#

위와 같이 백업된 temp_db2.sql파일의 내용을 보시면 다음과 같습니다.   

아래의 결과를 보시면 데이터베이스 스키마와 --where조건에 맞는 데이터만이 저장되어 있다는 것을 알 수 있습니다.

[root@file bin]# cat temp_db2.sql

-- MySQL dump 9.08
--
-- Host: localhost    Database: temp_db2

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

-- Server version       4.0.14
--
-- Table structure for table 'Demo_DomainAdmin'
--

CREATE TABLE Demo_DomainAdmin (

  admin_id varchar(12) NOT NULL default '',

  admin_pass varchar(40) default NULL,

  PRIMARY KEY  (admin_id)

) TYPE=MyISAM;

--
-- Dumping data for table 'Demo_DomainAdmin'
--
-- WHERE:  admin_id='admin'

INSERT INTO Demo_DomainAdmin VALUES ('admin','6ffffffffffff996d4');

[root@file bin]#

이제 실무적인 관점에서 한가지만 더 알려드리겠습니다.

위의 방법에서 -t옵션을 추가하여 백업하신 다면 데이터베이스 스키마를 제외한 실질적으로 --where조건에 맞는 순수한 데이터만을 저장할 수 있습니다. 

아래의 예는 바로 앞의 mysqldump명령어에 -t옵션만을 추가한 것입니다.   

즉 위의 결과에서 생성된 데이터베이스 스키마를 제외한 순수한 --where조건에 맞는 데이터만을 저장하기 위한 백업입니다.

[root@file bin]# ./mysqldump -u root -p -t --where="admin_id='admin'" temp_db2  Demo_DomainAdmin > ./temp_db2.sql

Enter password: ********

[root@file bin]#

아래는 그 결과를 나타낸 것입니다.   

확인해 보시면 아시겠지만 앞의 결과에서 데이터베이스 스키마를 생성하는 “CREATE TABLE”문이 생략되고
순수한 --where조건에 맞는 결과만이 저장되었다는 것을 확인 할 수 있습니다.   

[root@file bin]# cat temp_db2.sql

-- MySQL dump 9.08
--
-- Host: localhost    Database: temp_db2

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

-- Server version       4.0.14
--
-- Dumping data for table 'Demo_DomainAdmin'
--
-- WHERE:  admin_id='admin'

INSERT INTO Demo_DomainAdmin VALUES ('admin','6ffffffffffff996d4');

[root@file bin]#

실제로 이와 같은 백업방법은 좀 까다로와 보이긴 하지만 잘 활용하신다면 실무에서 매무 강력한 힘을 발휘합니다.   

즉 수많은 데이터들이 저장되어 있는 특정 테이블의 값들 가운데 특정 조건에 맞는 데이터만을 뽑아내려고 할 때에 가장 현실적이고 현명한 방법이기 때문입니다.     

출처 : https://www.linux.co.kr/bbs/board.php?bo_table=lecture&wr_id=3060

mysqldump명령어로 백업할 때에 -d옵션을 사용하면 백업대상 데이터베이스의 스키마(테이블구조)만을 백업 결과파일에 저장해준다.

즉 데이터값(레코드값)을 생성하는 SQL문은 결과파일에 저장되지 않는다는 의미이다. 사용하는 형식은 다음과 같다.

사용형식 : mysqldump -u DB사용자명 -p -d  DB명 > 파일명 (DB명의 전체 테이블의 스키마 백업할 때)
사용형식 : mysqldump -u DB사용자명 -p -d DB명 테이블명 > 파일명 (DB명의 특정테이블만 스키마 백업할 때)

위의 형식에서 -d옵션 대신에 --no-data를 사용할 수도 있다.

 

mysqldump --skip-add-locks --skip-lock-tables db table > test.dump.sql

▶ 덤프 도중 다른 세션에서 insert, update, delete 가능

 

mysqldump --single-transaction  db table > test.dump.sql

 덤프 도중 다른 세션에서 insert, update, delete 가능

 

mysqldump --lock-tables  db table > test.dump.sql

 덤프 도중 다른 세션에서 insert, update, delete 불가능

 

--single-transaction 옵션은 4.0.2 버전부터 추가되었으며, InnoDB에서만 사용 가능합니다.

출처: https://www.unclegom.com/5 [한가한 곰 아저씨의 작업장:티스토리]

MySQL 서버의 time out 설정은 크게 3가지가 있습니다. 
  mysqld time out 
    - connect_timeout (bad handshake timeout)      
    - interactive_timeout (interactive 모드에서 connection time out)      
    - wait_timeout (none interactive 모드에서 connection time out)  

connect_timeout, interactive_timeout 은 튜닝과 좀 거리가 멀고, 실제로 바쁜 서버라면, 반드시 wait_timeout 을 따로 튜닝하여 설정해줘야 합니다. 

[connect_timeout] 
이 설정은 mysqld 와 mysql client 가 연결(connection)을 맺기 위해서mysqld 가 연결 패킷을 기다리는 최대 시간입니다. 
즉 TCP 연결을 맺는 과정(3-way handshake)에서, connect_timeout 동안에도연결 패킷이 들어오지 않으면 연결이 실패(취소가 아님)되고,bad handshake 로 응답합니다. 

  *참고)  
        - 연결 실패 : 연결 과정중에서 fail 되는 경우 (Aborted_connects)      
        - 연결 취소 : 연결이 된 상태에서 강제로 close 된 경우 (Aborted_clients)  

다시 말하면 mysqld 와 mysql client 가 TCP 연결을 맺는 최대 시간으로이 시간보다 큰 경우는 모두 Aborted_connects 에 해당됩니다.(단위는 초) 
  연결 실패율(POF) =  (      Aborted_connects * 100 / Connections  ) 
  연결이 실패되는 경우        
        - 연결 패킷에 올바른 연결 정보가 없는 경우      
        - 특정 user 가 권한이 없는 데이터베이스에 접근할 경우      
        - mysqld 접근 password 가 틀린 경우      
        - connect_timeout 보다 긴 연결 과정 

연결 실패율(POF)이 높은 경우는, 대부분 권한이 없는 데이터베이스 연결이나, 틀린 password 를 사용할 경우가 많습니다. 
기본값은 대부분 5(초)로 설정되어 있으며, 따로 튜닝할 필요는 없습니다. 
mysqld 의 --warnings 옵션 사용과 xxx.err 파일에 기록됩니다. 


[interactive_timeout] 
interactive 모드에서 time out 을 말합니다. 
interactive 모드는 'mysql>' 과 같은 프롬프트 있는 콘솔이나 터미널 모드를말합니다. 
mysqld 와 mysql client 가 연결을 맺은 다음, 다음 쿼리까지 기다리는최대 시간을 의미합니다. 
설정된 interactive_timeout 까지도 아무런 요청(쿼리)이 없으면 연결은취소되고, 
그 이후에 다시 요청이 들어오면 연결은 자동으로 맺어집니다. 

interactive_timeout 안에 다시 요청이 들어오면 wait time은 0으로 초기화됩니다(CLIENT_INTERACTIVE). 

  ERROR 2006: MySQL server has gone away  No connection. Trying to reconnect...  Connection id:    12002  Current database: xxx 

이와 같은 연결 취소는 Aborted_clients 에 누계되고, wait_timeout 의결과도 함께 포함됩니다 
기본 값은 28800(8시간) 초로 설정되어 있는데 상당히 관대한 설정입니다. 
약 1시간(3600) 정도로 설정하는 것을 권장합니다. 


[wait_timeout] 
이 설정은 제일 중요한 파라메터 항목입니다. 
interactive 모드가 아닌 경우에 해당되며,mysqld 와 mysql client 가 연결을 맺은 후, 
다음 쿼리까지 기다리는최대 시간을 의미합니다. 
즉 대부분 PHP 나 C, PERL, python 등등의 API 를 이용한 client 프로그램모드를 말합니다. 
interactive_timeout 과 마찬가지로 wait_timeout 까지 아무런 요청(쿼리)이없으면 연결은 취소되고 
그 결과는 Aborted_clients 에 누계됩니다. 
wait_timeout 안에 다시 요청이 들어오면 wait time 은 0 으로 초기화 됩니다.(SESSION.WAIT_TIMEOUT) 
  연결 취소율(POC) =  (      Aborted_clients * 100 / Connections  ) 
  연결이 취소되는 경우(강제 종료됨)  
      - 종료(exit) 되기전 mysql_close() 가 없는 경우      
      - wait_timeout 이나 interactive_timeout 시간까지 아무런 요청(쿼리)이 없는 경우  

기본 값은 interactive_timeout 과 마찬가지로 28800(8시간) 초로 설정되어있는데, 역시 너무 관대한 설정이라고 할 수 있습니다. 
앞에서 연결 취소율(POC)을 계산해 보면, MySQL 서버가 어느 정도 비율로 강제종료하는지 알 수 있습니다. 
예를 들어 POC 가 1 % 이라면, 100 개의 커넥션당 하나 정도는 mysql_close()없이 강제 종료(exit)되고 있다는 의미입니다. 
이 값이 0 %에 가까울수록 좋습니다. 이 의미는 클라이언트 프로그램에서모두 정상적으로 종료했다는 의미입니다.

 

출처 : https://blog.naver.com/bomyzzang/221550485417


MariaDB에 하이픈(-)이나 점(.)을 포함한 이름으로 데이터베이스를 만들면 에러가 납니다.

예를 들어

create database test-test;

라고 하면 다음과 같은 에러 메시지를 출력하면서 데이터베이스를 생성하지 못합니다.

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '-test' at line 1

이 문제를 해결하는 방법은 데이터베이스 이름을 낮은 액센트표(grave accent)로 감싸는 것입니다. 즉

create database `test-test`;

와 같이 하면 됩니다.


출처 : https://www.manualfactory.net/10161


MySQL mysqldump 시 특정테이블만 백업 받는 방법


DB 테이블 덤프할 때 table_* 이런형태의 asterisk 별표를 사용한 특정 테이블만 받고 싶을때 사용할 수 있습니다.


방법은 여러가지가 있지만 아래처럼 하면 간단하게 백업을 받을 수 있습니다.


# mysqldump -u유저아이디 -p비밀번호 dbname table_* > backup.sql

mysqldump: Couldn't find table: "table_*"


이렇게 하면 에러가 나지요~


# mysqldump -u유저아이디 -p비밀번호 dbname $(mysql -u유저아이디 -p비밀번호 dbname -Bse "show tables like 'test_%'") > backup.sql


이런 방법으로 백업이 가능합니다.

$() 변수로 받는다는 의미입니다.


# mysql -u유저아이디 -p비밀번호 dbname -Bse "show tables like 'test_%'"


괄호 안에 있는 내용을 먼저 테스트 해보고 사용하면 됩니다.



출처: https://ivps.tistory.com/204 [iVPS 가상서버호스팅]


확인된 환경 : MySQL 5.0x, MariaDB 10.1.x,

전체 DB 언어셋 및 collation 확인

SELECT SCHEMA_NAME AS 'database', DEFAULT_CHARACTER_SET_NAME AS 'character_set', DEFAULT_COLLATION_NAME AS 'collation' FROM information_schema.SCHEMATA;

특정 db 언어셋 확인

show create database DB명; (Collation확인은) use DB명 → SHOW VARIABLES LIKE 'character_set_database';

특정 테이블 언어셋 확인

show create table 테이블명;  (Collation확인은) SHOW TABLE STATUS WHERE NAME LIKE '테이블명';

특정 테이블 칼럼별 collation 확인

SHOW FULL COLUMNS FROM 테이블명;

특정 데이터베이스의 default character set 수정방법

alter database 디비명 default character set = utf8;

특정 테이블의 default character set 수정방법

alter table 테이블명 default character set = utf8;

[출처] http://www.legendry.net/board_YNNJ65/783


Mysql 4.0 ( euc_kr ) 환경에서 Mysql 5.x ( UTF-8) 환경으로 데이터 이전시

레코드에 포함된 한글 문자열이 모두 깨져서 입력된 경우 이를 올바르게

처리했던 성공사례를 기록한다.

A서버 (Mysql 4.0)

mysqldump -u root -p --default-character-set=euc_kr DB명 > DB명.sql

scp 명령을 이용하여 B서버 (Mysql 5.x) 로 파일 복사

B서버 (Mysql 5.x)

vi 에디터로 sql 파일 내의 TYPE=MyISAM 을 ENGINE=MyISAM 으로 모두 치환

iconv -c -f CP949 -t UTF-8 DB명.sql > DB명_UTF8.sql

CP949 언어셋에 대한 상세 내용은 아래 링크 참조

https://ko.m.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%ED%8E%98%EC%9D%B4%EC%A7%80_949

새롭게 생성된 UTF-8용 sql 파일을 B서버의 DB명 에 import 시킨 후 phpmyadmin 과 같은

프로그램에서 문자열이 깨지지 않는지 체크해 본다.