논리적 데이터베이스 백업은 어떤 종류의 백업인가요?
우리 모두 알고 있듯이 데이터베이스가 우리가 사용할 데이터를 반환할 때 원래 설계하고 예상했던 특정 논리적 연관 형식의 형태로 데이터를 하나씩 표시하며 특정 비즈니스 논리 속성을 갖습니다. 물리적 저장 수준에서 데이터베이스 소프트웨어는 데이터베이스 소프트웨어가 설계한 특정 형식으로 특정 처리 후 데이터를 저장합니다.
데이터베이스 논리적 백업이란 백업 소프트웨어가 백업 목적으로 미리 정의된 논리적 연결 형식에 따라 데이터베이스와 데이터베이스의 논리적 구조 개체의 논리적 관계를 기반으로 관련 텍스트 파일을 하나씩 생성하는 것을 의미합니다.
일반적으로 사용되는 논리 백업
논리 백업은 중소 규모 시스템에서 가장 간단하고 일반적으로 사용되는 백업 방법이라고 할 수 있습니다. MySQL에서 일반적으로 사용하는 논리적 백업에는 두 가지 주요 유형이 있습니다. 하나는 현재 데이터베이스의 데이터를 완전히 재현할 수 있는 INSERT 문을 생성하는 것이고, 다른 하나는 논리적 백업 소프트웨어를 통해 데이터를 전달하여 데이터베이스 테이블 데이터를 특정하게 분리하는 것입니다. 문자로 구분하여 텍스트 파일에 기록합니다.
1. INSERT 문 백업 생성
두 논리적 백업 모두 장단점이 있으며, 대상으로 하는 사용 시나리오가 약간 다릅니다. 먼저 INSERT 생성의 논리적 백업을 살펴보겠습니다. 진술.
MySQL 데이터베이스에서는 일반적으로 INSERT 문을 주장하는 논리적 백업 파일을 구현하기 위해 MySQL 데이터베이스 소프트웨어와 함께 제공되는 도구 프로그램에서 mysqldump를 사용합니다. 사용법은 기본적으로 다음과 같습니다:
정의 및 데이터 mysql 데이터베이스 또는 테이블 덤프
사용법: mysqldump [OPTIONS] 데이터베이스 [테이블]
OR mysqldump [OPTIONS] -- 데이터베이스 [OPTIONS] DB1 [DB2 DB3...]
OR mysqldump [OPTIONS] --all-databases [OPTIONS]
mysqldump의 사용은 상대적으로 간단하므로 대부분의 필수 정보는 "mysqldump --help"를 실행하여 얻을 수 있습니다. 여기서는 MySQL 데이터베이스의 몇 가지 개념과 원칙을 결합하여 우리가 가지고 있는 기술과 데이터베이스 논리적 백업을 수행하기 위해 mysqldump를 사용할 때 주의해야 할 사항에 대해 논의하고 싶습니다.
우리 모두는 데이터베이스를 사용하는 대부분의 소프트웨어나 웹사이트의 경우 때때로 서비스를 종료하거나 중단하는 대신 데이터베이스가 가능한 최고의 가용성을 제공할 수 있기를 바라고 있다는 것을 알고 있습니다. 데이터베이스가 서비스를 제공할 수 없게 되면 시스템은 더 이상 데이터에 액세스하여 일부 동적 기능을 제공할 수 없습니다. 따라서 대부분의 시스템에서는 모든 백업을 종료하는 것이 허용되지 않을 수 있습니다. 그러나 mysqldump 프로그램의 구현 원칙은 우리가 제공하는 매개 변수 정보와 데이터베이스의 시스템 테이블 정보를 사용하여 하나씩 테이블을 생성하는 것입니다. 데이터를 얻은 다음 INSERT 문을 생성하고 이를 백업 파일에 씁니다. 이로 인해 시스템이 정상적으로 작동하는 동안 데이터 변경 요청이 계속해서 실행될 가능성이 높으며, 이로 인해 mysqldump가 백업하는 데이터에 불일치가 발생할 수 있습니다. 즉, 백업 데이터가 동일한 시점에 있지 않을 수도 있고 무결성 제약 조건을 충족하지 못할 수도 있습니다. 이러한 백업 세트는 일부 시스템에서는 큰 문제가 아닐 수 있지만 데이터 일관성 및 무결성에 대한 엄격한 요구 사항이 있는 일부 시스템에서는 큰 문제가 되며 완전히 유효하지 않은 백업 세트입니다.
이런 경우 어떻게 해야 할까요? 데이터베이스의 데이터가 일관되게 유지되기를 원한다면 이를 달성할 수 있는 상황은 두 가지뿐이라는 것을 알고 있습니다.
첫째, 모든 데이터가 동시에 꺼내집니다.
둘째, 데이터베이스의 데이터는 정적 상태입니다.
첫 번째 상황에서 다들 '이게 가능할까?'라고 생각하실 겁니다. 어쨌든, 테이블이 2개 이상 있는 한, 어떻게 프로그램을 작성하더라도 어젯밤에 같은 시간에 같은 번호를 얻는 것은 불가능합니다. 예, 기존 방법으로는 데이터를 가져오는 시점을 완전히 동일하게 만들 수 없다는 것이 사실입니다. 그러나 동일한 트랜잭션에서 데이터베이스는 읽은 데이터가 동일한 시점에 있음을 보장할 수 있다는 점을 잊지 마십시오. 따라서 Innodb 또는 BDB와 같은 트랜잭션을 지원하는 스토리지 엔진의 경우 동일한 트랜잭션에서 전체 백업 프로세스를 제어하여 백업 데이터의 일관성과 무결성을 달성할 수 있으며 mysqldump 프로그램은 관련 매개변수 옵션도 제공합니다. 이 기능을 지원하려면 "--single-transaction" 옵션을 사용하세요. 이는 데이터베이스의 일반 서비스에 영향을 주지 않습니다.
두 번째 상황에서는 모두가 가장 먼저 생각하는 것이 백업이 필요한 테이블을 잠그고 읽기만 허용하고 쓰기는 허용하지 않는 것이라고 생각합니다. 네, 그게 우리가 할 수 있는 전부입니다. 우리는 데이터베이스가 백업 프로세스 중에 데이터 쿼리 서비스만 제공하고 쓰기 서비스를 잠그도록 타협 방법만 사용할 수 있으므로 데이터는 일시적으로 수정되지 않는 일관된 상태에 있고 mysqldump가 완료될 때까지 기다립니다. 백업 쓰기 잠금을 제거하고 전체 서비스를 재개합니다. mysqldump 프로그램 자체는 실행 전에 테이블을 잠그고 실행 후에 자동으로 잠금을 해제하는 "--lock-tables" 및 "--lock-all-tables"와 같은 관련 옵션도 제공합니다. 여기서 주목해야 할 점은 "--lock-tables"는 한 번에 덤프해야 하는 모든 테이블을 잠그는 것이 아니라, 데이터베이스에서 여러 개의 테이블을 덤프해야 하는 경우 한 번에 하나의 데이터베이스 테이블만 잠급니다. , 데이터의 일관된 무결성을 보장하려면 "--lock-all-tables"를 사용해야 합니다.
mysqldump를 통해 INSERT 문의 논리적 백업 파일을 생성할 때 사용하면 매우 유용한 옵션이 있는데, 바로 "--master-data[=value]"입니다. "--master-data=1"을 추가하면 mysqldump는 현재 MySQL에서 사용하고 있는 binlog 로그의 이름과 위치를 덤프 파일에 기록하게 되는데, 그냥 사용하면 CHANGE_MASTER 문 형태로 기록된다. "- -master-data" 또는 "--masterdata=2"인 경우 CHANGE_MASTER 문은 주석 형식으로 존재합니다. 이 옵션은 슬레이브의 온라인 구축을 구현할 때 매우 유용하며, 경우에 따라 슬레이브가 온라인으로 구축되지 않더라도 복구 프로세스 중에 백업 binlog를 통해 추가 복구 작업을 수행할 수 있습니다.
일부 시나리오에서는 일부 특수 데이터를 다른 데이터베이스로 내보내지만 먼저 임시 테이블을 생성하고 싶지 않을 수도 있습니다. mysqldump 프로그램을 사용하여 "-where='wherecondition'"을 사용할 수도 있습니다. 구현되었지만 하나의 테이블만 덤프하는 경우에만 사용할 수 있습니다. 실제로 위의 팁 외에도 mysqldump는 "--no-data"를 사용하여 데이터베이스 구조 생성 스크립트만 덤프하고 "--no"를 사용하는 등 다양한 시나리오에서 모든 사람이 사용할 수 있는 유용한 옵션을 많이 제공합니다. - createinfo"는 덤프 파일 등에서 테이블 구조를 생성하는 명령을 제거합니다. 관심 있는 독자는 mysqldump 프로그램 사용에 대한 소개를 자세히 읽은 후 직접 테스트해 볼 수 있습니다.
2. 특정 형식으로 일반 텍스트 백업 데이터 파일 백업 생성
INSERT 명령을 생성하여 논리적 백업을 생성하는 것 외에도 데이터베이스의 데이터를 백업하는 다른 방법을 사용할 수도 있습니다. 특정 구분 기호 문자는 텍스트 파일의 데이터 레코드를 분리하여 논리적 백업 효과를 얻습니다. INSERT 명령 파일과 비교할 때 이러한 백업 데이터는 저장 공간이 더 작고 데이터 형식이 더 명확하며 편집하기 쉽습니다. 하지만 단점은 여러 테이블의 백업 데이터가 동일한 백업 파일에 존재할 수 없고, 데이터베이스 구조를 재구축하는 명령이 없다는 점이다. 백업 세트에는 여러 개의 파일이 필요하며, 우리에게 미치는 영향은 더 많은 파일로 인한 유지 관리 및 복구 비용의 증가에 지나지 않지만 이는 기본적으로 몇 가지 간단한 스크립트를 작성하여 달성할 수 있습니다.
그렇다면 일반적으로 무엇을 할 수 있습니까? 이러한 백업 세트 파일을 생성하는 방법은 무엇입니까? 실제로 MySQL은 해당 기능도 구현했습니다.
MySQL에서는 사용자 정의 가능한 구분 기호가 있는 일반 텍스트 백업 파일을 얻는 데 일반적으로 다음 두 가지 방법이 사용됩니다.
1. SELECT ... TO OUTFILE FROM ... 명령을 실행하여
은 사용자가 SQL 문을 통해 특정 데이터를 선택할 수 있도록 설계된 SELECT 구문을 제공합니다. 지정된 형식으로 텍스트 파일로 출력합니다. 또한 내보낸 파일을 그대로 데이터베이스로 쉽게 가져올 수 있는 실용적인 도구 및 관련 명령도 제공합니다. 이것이 바로 백업에 필요한 것 아닌가요?
이 명령에는 다음과 같이 주의해야 할 여러 매개 변수가 있습니다.
문자 이스케이프 기능을 구현하는 "FIELDS ESCAPED BY ['name']"은 필요한 문자를 이스케이프합니다. SQL 문에서 이스케이프됩니다. 의미:
필드의 내용을 "패키지"할 수 있는 "FIELDS [OPTIONALLY] ENCLOSED BY" "OPTIONALLY"를 사용한 후에는 숫자 유형 데이터가 지정된 문자로 "포장"되지 않습니다. 을 추가해야 하나요?
다음 예와 같습니다:
root@localhost : test 10:02:02> SELECT * INTO OUTFILE '/tmp/dump.text'
-> FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
-> LINES TERMINATED BY 'n'
-> FROM test_outfile 한도 100;
쿼리 OK, 100개 행이 영향을 받음(0.00초)
root@localhost : test 10:02:11> 종료
안녕
root@sky:/tmp# cat dump.text
350021,21,"A","abcd"
350022,22,"B","abcd"
350023,23,"C","abcd"
350024,24,"D","abcd"
350025,25,"A","abcd"
... ...
2 , mysqldump를 통해 내보내기
mysqldump가 데이터베이스의 데이터에서 INSERT 문의 형태로 관련 백업 파일을 생성할 수 있다는 사실은 우리 모두 알고 있을 것입니다. 실제로 mysqldump는 INSERT 문을 생성하는 것 외에도 위의 내용을 구현할 수도 있습니다. "SELECT... TOOUTFILE FROM...", 또한 관련 데이터베이스 구조에 해당하는 생성 스크립트를 생성합니다.
다음 예와 같습니다:
root@sky:~# ls -l /tmp/mysqldump
total 0
root@sky:~ # mysqldump -uroot -T/tmp/mysqldump 테스트 test_outfile --fieldsenclosed-by=" --fields-terminating-by=,
root@sky:~# ls -l /tmp/mysqldump
총 8개
-rw-r--r-- 1 루트 root 1346 2008-10-14 22:18 test_outfile.sql
-rw-rw-rw- 1 mysql mysql 2521 2008-10-14 22:18 test_outfile.txt
root@sky:~# cat /tmp/mysqldump/test_outfile.txt
350021,21,"A","abcd "
350022,22,"B","abcd"
350023,23,"C","abcd"
350024,24,"D"," abcd"
350025,25,"A","abcd"
... ...
root@sky:~# cat /tmp/mysqldump/test_outfile .sql
-- MySQL 덤프 10.11
---- 호스트: localhost 데이터베이스: test
-- ------------- -- ----------- 서버 버전 5.0.51a-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @ OLD_COLLATION_CON 넥션= @@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/* !40103 SET TIME_ZONE='+00:00' */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
/*! @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
---- `test_outfile`
테이블의 테이블 구조--`test_outfile`이 존재하는 경우 테이블 삭제;
SET @saved_cs_client = @@character_set_client;
SET Character_set_client = utf8;
CREATE TABLE `test_outfile` (
`id` int(11) NOT NULL 기본값 ' 0',
`t_id` int(11) 기본값 NULL,
`a` char(1) 기본값 NULL,
`mid` varchar(32) 기본값 NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
SET Character_set_client = @saved_cs_client;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_ RESULTS */ ;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- 2008-10에 덤프 완료 -14 14:18:23
이런 종류의 출력 구조는 백업으로 사용하기에 매우 적합합니다. 물론 한 번에 덤프해야 하는 테이블이 여러 개인 경우 두 개의 테이블이 됩니다. 각 테이블에 대해 생성됩니다.
위 내용은 MySQL 데이터 백업의 논리적 백업 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!