현재 사용 중인 MySQL Storage Engine 확인 법입니다.
 
root 계정으로 로그인 한 뒤 
 
아래의 명령어를 입력 합니다.
 
show engines\G
 
ex)
 
mysql> show engines\G
*************************** 1. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
 
※ Support에 YES 인 경우 지원이 되는 경우 이며 No로 표기되는 경우 지원이 되지 않는 경우 입니다.



설치 마리아디비 버전은 stable최신버전 10.0.22


1. 소스 다운로드(생략)

2. 압축해제(생략)

3. cmake

#cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mariadb \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mariadb/data \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATEDX_STORAGE_ENGINE=1 \
-DWITH_ARIA_STORAGE_ENGINE=1 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \

4. 사용자 추가

#useradd mysql

5. 폴더 권한 변경

#chown -R mysql.mysql /usr/local/mariadb/

6. 기본 DB 생성

#/usr/local/mariadb/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mariadb --datadir=/usr/local/mariadb/data

7. 기존에 생성된 my.cnf 백업 및 기존에 제공되는 걸로 변경

#mv /etc/my.cnf /etc/my.cnf.bak

#cp /usr/local/mariadb/support-files/my-innodb-heavy-4G.cnf /etc/my.cnf

[7-1] 로그 파일, pid파일 경로 변경시 추가작업

/etc/my.cnf 파일에

log-error=/path/to/logpath/mariadb.log

pid-file=/path/to/pidpath/mariadb.pid

추가.


해당 경로에 디렉토리는 자동으로 생성되지 않으므로 직접 생성해줘야함.

또 디렉토리 생성 후 소유자와 그룹을 mysql로 변경해줘야 파일이 생성됨.


해당 부분 없을시 로그파일과 pid파일은 /usr/local/mariadb/data에 저장된다.


8. my.cnf 파일에 문자열 설정값 추가


character_set_server = utf8

collation_server = utf8_general_ci


9. 마리아디비 구동


#/usr/local/mariadb/support-files/mysql.server start


10. 루트계정 비밀번호 변경


#/usr/local/mariadb/bin/mysqladmin -u root password 'new-password'


-- 트러블슈팅


ERR1) cmake 중

-- Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH)

CMake Error at cmake/readline.cmake:85 (MESSAGE):

  Curses library not found.  Please install appropriate package,


SOLVE) ncurses-devel 설치

yum install ncurses-devel


--


ERR2) cmake 중

-- Looking for event.h - not found

-- Configuring incomplete, errors occurred!


SOLVE) openssl-devel 설치

yum install openssl-devel 


이걸 깔면서 의존성걸린 패키지에서 해결되는듯

--

출처: http://lsfa.tistory.com/15 [주제음슴]

MySQL 의 기본 스토리지 엔진이 무엇인지 확인하고자 할 때 아래 Query 를 실행 할 것

SQL>SELECT engine, support FROM information_schema.engines WHERE support='DEFAULT';

예시)

mysql> SELECT engine, support FROM information_schema.engines WHERE support='DEFAULT';
+--------+---------+
| engine   | support  |
+--------+---------+
| InnoDB  | DEFAULT |
+--------+---------+
1 row in set (0.03 sec)


mysql-5.5.x 에서 character-set 변경시
아래와 같이 my.cnf를 수정 후 mysql 데몬을 재시작 합니다.

 

파일 위치 : /etc/my.cnf

utf-8 에서 euckr 로 변경하는 예)

 

[client]
default-character-set=euckr
 
[mysql-5.5.x 에서 character-set 변경 ]

 

[mysqld]
init_connect=set names euckr
character-set-server=euckr

 

[mysql]
default-character-set=euckr

 

 

mysql 데몬을 stop/start 해줍니다.

예)

# /usr/local/mysql/support-files/mysql.server stop

# /usr/local/mysql/support-files/mysql.server start


MySQL 서버는 자동으로 MyISAM 테이블을 체크하고 repair 하도록 지시할 수 있다. 자동으로 repair 하도록 하면, 서버는 가장 최근에 문제없이 closed 된 테이블인지 보기 위해 그것을 열 때, 각각의 MyISAM 테이블을 체크한다. 테이블이 정상이 아니라면 서버는 테이블을 repair 한다.

자동으로 MyISAM 테이블을 유지보수 하도록 하기 위해서 서버를 --MyISAM-recover 옵션으로 시작해야한다. 이 옵션은 아래에 나와 있는 값을 한 개나 그 이상의 개수로 지정할 수 있으며 콤마로 분리된다.

my.cnf의 [mysqld]항목에 옵션추가

myisam-recover=[mode]

[mode]
DEFAULT = 디폴트 체크를 한다.
BACKUP = 변경된 테이블의 백업을 만들도록 한다.
FORCE =  데이터의 하나 이상의 행을 손실시킨다 하더라도 테이블 복구를 수행하도록 한다.
QUICK = 빠른 복구를 수행한다. DELETE나 UPDATE로 인한 hole을 가지고 있지 않은 테이블은 skip 된다.

ex) myisam-recover=force,backup or myisam-recover=FORCE,BACKUP

<Mysql table 이 손상되는 경우가 발생할 때, 상태 확인 및 복구하는 방법>

1) MySQL 데이터베이스 특정 table 이 손상 되었는지 여부를 확인
#use database이름 : 확인할 DB 선택
#check table table이름 : table 상태 확인 또는 analyze table table이름

2) MySQL Table 복구
#use database이름 : 확인할 DB 선택
#repair table table이름 : table 복구

3) MySQL Table 최적화
#use database이름 : 확인할 DB 선택
#optimize table table이름 : table 최적화



기본적으로 localhost 에서만 접속이 허용되는 DB 를 외부(PC 및 타 서버) 환경에서 접속하려고 할 때

기존의 db 유저의 host를 변경할 것이 아니라 아래의 쿼리문을 이용해 유저를 추가해주면 된다.

(host 부분의 %는 모든 호스트에서 접속 허용이며 이부분을 IP 주소로 입력하면 해당 IP 에서만 접속이 가능함.)

 

[추가]

1. insert into user (host,user,password) values ('%','user_name',password('user_password'));


[mysql 5.5 이상에서는 아래 쿼리를 실행할 것!!!]

insert into user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject, authentication_string) values('%','user_name', password('user_password'),'','','','');


2. insert into db (host,db,user) values ('%','db_name','user_name');

3. flush privileges;
4. grant all privileges on user_name.* to user_name@'%';

 

(Root 계정의 경우 2번은 생략하고 1번 쿼리 이후 4번 쿼리 중 user_name.* 대신 *.* 로 처리할 것!)

 

5. flush privileges;

 

위 방법대로 했는데도 외부 접속이 안된다면 /etc/my.cnf 파일의 항목 중 bind-address = 127.0.0.1 이 있다면

 

이를 주석처리 한다. (bind-address = 127.0.0.1 는  로컬호스트에서만 접속을 허용한다는 의미임.)

 

bind-address = 127.0.0.1 를 주석처리해도 안된다면 방화벽에서의 mysql 포트 (기본:3306)이 차단되어있을 가능성이 있으므로

 

확인 해 볼것! 

 

[삭제]

아래는 위의 방법대로 외부 접속 호스트 추가 후 삭제하는 방법이다.

(user_name 과 host 부분을 and 조건으로 모두 만족해야 처리되니 주의할 것!!  // % 대신 ip를 입력해도 무방)

 

1. delete from user where user='user_name' and host='%';

(root 계정의 경우 1번만 실행하면 됨)
2. delete from db where user='user_name' and host='%';

flush privileges;


DB에 영향을 미치는 쿼리문을 찾아낼 수 있는 좋은 방법.

① mysql> show processlist;
show processlist -i5 여기서 숫자는 리프래쉬할 시간(초)입니다.
]# mysqladmin -uroot -p proc stat -i5 (밑에것 보다 조금더 상세)
]# mysqladmin -uroot -p processlist -i5

② mysql> show status;

기타)

]# top

팁!) ①의 경우 mysql에 접속을 한상태에서 내리는 명령어이지만 아래와 같이 접속하자 마자 바로 보여주는 예도 있다.
]# mysqladmin -uroot -p processlist

------------------------- sleep 죽이는 법 두가지 -------------------------
① mysql>kill id;
② mysqladmin kill id -u root -p

 

MySQL db 일반유저 (root 게정 변경가능) 패스워드 변경하고 싶을 때 방법이다.

# mysql -u root -p
Enter password : (패스워드를 입력하고 들어가서)

mysql>use mysql

mysql> update user set password=password('패스워드') where user='데이터베이스_id';

mysql> flush privileges;


테이블 내의 모든 내용을 삭제하므로 테이블 이름만 남음.
다른 방법으로 delete from tbl_name 과 같음

차이점은 

DELETE의 경우에는 일단 테이블의 내용을 하나의 레코드씩 삭제하는 반면, 

TRUNCATE TABLE은 먼저 테이블을 drop한 후에 테이블의 포맷 파일인 .frm 파일을 보고 테이블을 새로 만들게 된다.

그러므로 TRUNCATE와 DELETE는 동일한 결과를 보이지만 내부적으로 작동하는 방식이 다르다. 
TRUNCATE TABLE의 경우 레코드를 삭제할 필요 없이 테이블을 삭제하므로 레코드의 수가 많을 경우 매우 빠르게 삭제할 수 있다.

[형식]

truncate table tbl_name;