mysql 쿼리 정리 (mariadb)
mysql, mariadb 혼용 거의 둘다 사용 가능함
DB 접속
mysql -u DB아이디 -p 패스워드입력
mysql -u DB아이디 -p 패스워드입력 -h 아이피
초기 DB 패스워드 지정
mysqladmin -u root password 비밀번호
예전 방식이고 버전별로 초기 패스워드 정책은 약간식 다름
mysql 도구
myisam_ftdump
MyISAM에서 사용하는 FULLTEXT 인덱스에 대한 정보 출력해주는 TOOL
mysqlaccess
DB에 대한 계정에 접근권한을 체크해주는 TOOL
mysqldumpslow queries.log
slow query log 를 정리해주는 tools
mysqlslap
mysql 서버에 쿼리를 실행하여 부하를 유발할수 있는 Tool
mysqldump
백업
mysqlcheck
tables 점검
DB 목록 보기
show databases;
DB 생성
create database DB이름;
DB 삭제
drop database DB이름
간혹 show database 해보면 빈 DB가 그대로 있는데 이거 까지 지워줄려면 DB 데이터 디렉토리 삭제
경고 없이 바로 삭제되므로 주의해야 함
DB 선택
use DB이름;
테이블 생성 (example)
CREATE TABLE member (
seq INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50),
nickname CHAR(50),
PRIMARY KEY(seq)
) ENGINE=MYISAM CHARSET=euckr;
테이블 목록 출력
show tables;
먼저 use DB이름; 을 한후 이용
show tables from 디비이름
테이블 내용 (레코드) 보기
select * from 테이블이름;
select * from 디비이름.테이블이름;
조건의 맞는 레코드만 조회
select * from 테이블이름here 필드="값";
개수만큼의 레코드만 조회
select * from 테이블이름imit 개수;
% = * select \* from 테이블이름 where 필드 like '값%';
테이블 구조 확인
desc 테이블이름;
show full columns from 테이블이름;
show create table 테이블이름\G;
레코드 삭제
테이블에서 특정 레코드 삭제하기
delete from 테이블이름 where 필드="값";
테이블 검사
check table 테이블이름;
테이블 복구
analyze table 테이블명;
repair table 테이블명;
테이블 이름 바꾸기
alter table oldtable rename newtable;
테이블 복사하기 특정조건
INSERT INTO oldtable
SELECT * FROM newtable
;
테이블2에 있는 조건을 검색해서 테이블1에 INSERT 하기
- INSERT 할때 컬럼수 맞아야 함
INSERT INTO 테이블1 SELECT 테이블컬럼1, 테이블컬럼2 FROM 테이블2 WHERE {조건} ORDER BY 필드이름 ASC;
테이블 복사하기 (KEY 값 무시하기?)
INSERT ignore INTO oldtable
SELECT * FROM newtable
;
복사할 table 이 생성된 경우는 INSERT INTO 복사할 table 을 생성하는 동시에 복사는 CREATE TABLE
테이블 복사하기 (디비간)
INSERT INTO DB.newtable SELECT * FROM DB.oldtable
테이블 복사 (스키마만 복사 데이터는 복사안함)
CREATE TABLE 만들테이블명 LIKE 원본테이블;
레코드 입력
INSERT IGNORE INTO
기존레코드 남아있음, 기존 레코드의 AUTO_INCREMENT 값은 변하지 않음
REPLACE INTO
기존 레코드가 삭제되고, 신규 레코드가 INSERT됨, 따라서 AUTO_INCREMENT의 값이 변경됨
INSERT INTO ON DUPLICATE UPDATE
INSERT IGNORE의 장점 포함함, 중복 키 오류 발생 시, 사용자가 UPDATE될 값을 지정할 수 있음
테이블 삭제하기
drop table 테이블명;
테이블에 레코드 추가
insert into 테이블이름 (필드이름1,필드이름2,필드이름3) values('값1','값2','값3');
순서만 맞으면 필드이름 생략 가능함
update (기존 레코드 변경)
UPDATE 테이블명 SET 필드명='변경할값' WHERE 필드명=해당값;
update 테이블명 set 필드명=NULL; # NULL 값으로 업데이트
정렬
주로 select 구문 뒤에 사용됨
order by asc
order by desc
아이피 주소 정렬
order by INTE_ATON(ip) asc
order by INTE_ATON(ip) desc
범위 지정
where 컬럼 BETWEEN "1" AND "14000"
AUTO_INCREMENT 변경 (초기화)
alter table 테이블명 AUTO_INCREMENT=값;
DB root 패스워드 강제 변경 (OLD)
service mysqld or mariadb stop
mysqld_safe --skip-grant &
mysql -u root mysql
mysql> update user set password=password('new password') where user='root';
mysql> flush privileges;
mysql> quit
service mysqld or mariadb start
mariadb 10.4 user 테이블 뷰로 바뀜
ALTER USER 'root'@'localhost' IDENTIFIED BY 'PASSWORD_STRING';
10.4 이상은 update 문으로 패스워드 변경 불가함
계정
- 사용자 계정 및 권한 명령은 수정이 아닌 이상 delete 와 insert into 사용 권장 하지 않음
계정만 생성
create user '아이디'@'호스트아이피' identified by '패스워드';
계정만 삭제
DROP USER 아이디@호스트;
flush privileges;
권한 테이블 리로드 grant 명령이 아닌 insert into 같은 명령으로 수정한 경우 필요함
계정 패스워드 변경
update user set password=password('비밀번호') where user='유저명';
사용자 생성 및 권한
GRANT 권한 ON DB이름.테이블이름 TO '아이디'@'호스트' IDENTIFIED BY '패스워드';
권한 설정 (테이블에 권한 주기)
grant 권한 on DB이름.테이블이름 to '아이디'@'호스트' with grant option;
with grant option : 권한 선택 가능
권한 종류
SELECT
INSERT
UPDATE
DELETE
CREATE
DROP
INDEX
ALTER
USAGE
all privileges
권한 삭제
REVOKE ALL ON 디비이름.테이블이름 TO 아이디@호스트;
특정 권한만 삭제할 수 있다.
REVOKE SELECT ON 디비이름.테이블이름 TO 아이디@호스트;
- MariaDB 10.8 에서는 TO -> FROM 으로 바뀐듯 함
권한 확인
show grants for 아이디@호스트;
언어셋 확인
use DB명;
show variables like 'character_set%';
언어셋 변경
alter table 테이블이름 convert to character set utf8 collate utf8_unicode_ci;
alter database 디비명 DEFAULT CHARACTER SET utf8 collate utf8_unicode_ci;
utf8_unicode_ci : 정확한 비교 및 정렬 필요,
utf8_general_ci : 일반적으로 사용, 성능 중시, ÀÁÅåāă -> A 로 치환되어 비교 처리
_ci 는 대소문자 비교시 동일한 것으로 처리함?
데이터가 들어있는 경우 언어셋 변경
alter table 테이블명 modify 컬럼 binary(100);
alter table 테이블명 modify 컬럼 varchar(20) collate euckr_korean_ci;
바이러니로 변경후 다시 언어셋 변경 (바로 변경하는 경우 문자 손상 가능성?
테이블 엔진 변경
alter table 테이블명 engine=innodb;
collation 확인
SHOW COLLATION;
백업 및 복구
디비별로 백업
mysqldump -u root -p 디비이름 > 파일명.sql
전체백업
mysqldump -u root -p --all-databases > 파일명.sql
케릭터셋 옵션을 이용한 백업 (euckr, utf8)
mysqldump -u root -p --default-character-set=euckr DB이름 > 파일명.sql
테이블만 덤프
mysqldump -u root -p -B DB명 --tables 테이블명1 테이블명2 테이블명3 > 파일명.sql
테이블만 덤프
mysqldump -u root -p -B 디비명 --tables 테이블명 > 파일명.sql
게릭터셋 옵션을 이용한 덤프 (euckr, utf8)
mysqldump -u root -p --default-character-set=euckr DB명 < 파일명.sql
디비별로 복구
mysql -u root -p DB이름 < 파일명.sql
전체복구
mysql -u root -p < 파일명.sql
프로세스 및 시스템
디비 상태 조회
show status;
디비 변수 조회
show variables;
디비 프로세스 확인
show processlist;
특정 조건으로 디비 프로세스 확인
SELECT \* FROM INFORMATION\_SCHEMA.PROCESSLIST where 필드1 > 조건 and 필드1 is not null;
테이블 락 걸기
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;
락을 건 세션이 종료되면 Lock 자동 해제됨
- select 조회만 가능하며 update insert 같은 쓰기 쿼리는 대기열 상태이며 Lock 이 해제되면 일괄 처리됨
프로시져 목록 보기
show procedure status;
프로시저 내용 보기
show create procedure 프로시저명;
server id 확인 및 변경
show variables like 'server_id';
SET GLOBAL server_id =2;
인덱스 (index) 보기
SHOW INDEX from 테이블명
시간함수
현재
SELECT NOW();
1시간전
SELECT DATE_ADD(NOW(), INTERVAL -1 HOUR);