보통 강제 종료에는 task manager를 이용하나, MySQL 서버는 애플리케이션이 아닌 서비스로 실행. 따라서, Windows 동작 중에는 계속 백그라운드에서 동작. 강제 종료하려면 프로세스 탭을 선택해 이미지 명(mysqld.exe)을 지정하든지 서비스 탭을 선택해 서비스 이름(MySQL57)을 지정.
DBMS에서 데이터를 보존하는 기억장치는 대부분 하드디스크. 데이터베이스의 쓰기는 기억장치의 임의 장소에 무작위로 액세스해서 쓰기를 수행하기 때문에 동기화 쓰기는 느려 성능 면에서 실용적이지 않음. 따라서, 다음 구조를 사용.
데이터베이스의 데이터 파일 변경을 직접 수행하지 않고, 우선 로그로 변경 내용을 기술한 로그 레코드를 써서 동기화하는 구조. (InnoDB 로그)
1. 디스크에 연속해서 쓰기 때문에 무작위로 쓰는 것보다 성능이 좋다.
2. 디스크에 쓰는 용량과 횟수를 줄일 수 있다.
3. 데이터베이스 버퍼를 이용해 데이터베이스의 데이터 파일로의 변경을 효율성 높게 수행한다.
크래시가 발생하면...
마지막으로 커밋된 트랜잭션의 갱신 정보를 가짐
크래시로 내용이 전부 소실
최후 체크포인트까지의 갱신 정보를 가짐
크래시 이후 MySQL 서버를 재시작하면 3과 1의 체크포인트 이후 갱신 정보를 사용해 데이터베이스 파일을 크래시 때까지 커밋된 최신 상태로 수정. 이 동작을 롤 포워드(Roll-Forward)라고 함.
임의의 시점에서의 데이터 변경을 포함한 복원을 PITR(Point-in-time Recovery)라고 함.
PITR에 이용하는 로그는 대부분 WAL을 이용.
크래시 복구용으로는 불필요한 로그도 PITR용으로 보존이 필요할 수 있으며 이를 위한 모드가 '아카이브 지정'.
MySQL에서는 PITR에 바이너리 로그, 크래시 복구에 InnoDB 로그를 이용.
온라인 백업, 백업 대상의 데이터베이스를 정지하지 않고 가동한 채로 백업 데이터를 얻음.
오프라인 백업, 백업 대상의 데이터베이스를 정지한 후 백업 데이터를 얻음.
논리 백업은 SQL 기반 텍스트 형식으로 백업 데이터가 기록.
물리 백업은 데이터 영역을 그대로 덤프하는 이미지로 바이너리 형식으로 기록.
풀 백업은 전체 백업, 데이터베이스 전체 데이터를 매일 백업하는 방식.
부분 백업은 우선 풀 백업을 한 후에 이후 갱신된 데이터를 백업.
차등 백업은 최근에 풀 백업한 이후에 갱신된 데이터를 백업하는 것.
증분 백업은 최근 백업(풀 백업에 한정되지 않음)한 이후에 갱신된 데이터를 백업하는 것.
증분 백업은 데이터의 양이 차등 백업보다 적으나, 복원 시 모든 증분 백업을 차례로 적용해야 해서 절차가 복잡함.
현재의 데이터 베이스 = 풀 백업한 데이터 + 풀 백업 후 얻은 모든 증분 백업
데이터베이스와 백업 데이터를 다른 디스크 장치로 나눠 보관해야 함. 장애 대비 방법을 선택할 때, 상황에 맞게 백업 방식을 고려.
U, 합집합, 공통된 요소를 출력.
UNION
명령어를 사용.
SELECT * FROM sample71_a;
a |
---|
1 |
2 |
3 |
SELECT * FROM sample71_b;
a |
---|
2 |
10 |
11 |
SELECT * FROM sample71_a UNION SELECT * FROM sample71_b;
a |
---|
1 |
2 |
3 |
10 |
11 |
가장 마지막 SELECT 명령에 대해서만 ORDER BY 구를 지정 가능함.
ORDER BY 구에 지정하는 열은 별명을 붙여 이름을 일치시킴.
보통 UNION 명령을 사용하게 되면 중복된 값은 제거하고 하나로만 출력하게 되는 DISTINCT 명령의 기질이 있음.
만약, 이때 중복된 값들은 제거하지 말고 모두 출력하고 싶을 때는 UNION 대신 UNION ALL을 사용하면 됨.
SQL을 기준으로 교집합은 INTERSECT, 차집합은 EXCEPT를 사용.
합집합이나 교집합처럼 집합의 연산 방법 중 하나, 두 개의 집합을 곱하는 연산 방법.
'직접 합' 또는 '카티전곱(Cartesian product)'로 불림.
데이터베이스의 테이블은 집합의 한 종류. 만약 테이블을 두 개 지정하면 이들은 곱집합으로 계산.
SELECT * FROM 테이블명1, 테이블명2;
두 가지 방식이 서로 비슷하다만 확대 방향이 다름.
UNION으로 합집합을 구했을 경우에는 세로 방향으로 더해짐.
FROM 구로 테이블을 결합할 경우에는 가로 방향으로 확대.
교차결합은 테이블 수가 많아지면 조합 수가 집합이 거대해짐. 따라서, 결합 방법으로는 교차결합보다는 내부결합이 더 많이 사용됨.
테이블을 연결하여 사용하는데, 이때 기본키를 지정해두는 것이 좋음.
(참조할 테이블의 기본키와 동일한 이름과 자료형으로 행을 연결)
WHERE 조건을 지정해 곱집합에서 필요한 조합만 검색.
SELECT * FROM 테이블명1 INNER JOIN 테이블명2 ON 결합조건 (WHERE구);
다른 테이블의 기본키를 참조하는 열
테이블에 별명을 붙일 수 있는 기능을 이용해 같은 테이블끼리 결합하는 것
외부결합은 교차결합으로 결합 조건을 지정하여 검색한다는 기본적인 것은 내부결합과 같음. 다만, 어느 한쪽에만 존재하는 데이터 행을 어떻게 다룰지를 변경할 수 있음.
만약 A 테이블에 존재하는 값이 아직 B 테이블에 존재하지 않는다면 LEFT JOIN을 이용해, A 테이블에 기준을 맞출 수 있음.
이 경우, A 테이블에 존재하는 값에 대해서는 B 테이블은 NULL로 표시.
A | B |
---|---|
추가상품 | NULL |
SELECT 상품3.상품명, 재고수.재고수
FROM 상품3 LEFT JOIN 재고수
ON 상품3.상품코드=재고수.상품코드
WHERE 상품3.상품분류 = '식료품';
오른쪽 테이블을 기준으로 삼고 싶은 경우에는 RIGHT JOIN 이용.