mysqdump는 이진 데이터를 안정적으로 처리합니까?
MySQL 5.6에는 일부 필드의 대용량 이진 데이터를 포함하는 테이블이 있습니다.사용자가 만든 덤프를 신뢰할 수 있는지 알고 싶습니다.mysqldump또한 FTP, SCP 등의 시스템을 통해 덤프 파일을 전송할 때 해당 바이너리 필드가 쉽게 손상되지 않도록 해야 합니다.또한 이러한 시스템에서 덤프 파일을 아스키 대신 바이너리 전송으로 처리하도록 강제해야 합니까?
어떤 의견이든 미리 감사드립니다!
아니요, 이진 블롭이 있을 때 항상 신뢰할 수 있는 것은 아닙니다.이 경우 올바른 결과를 얻으려면 "--hex-blob" 플래그를 사용해야 합니다.
아래 의견에서 주의할 사항:
--hex-blob을 -T 플래그(테이블당 파일)와 결합하면 hex-blob 플래그가 자동으로 무시됩니다.
다음 호출에 실패하는 경우가 있습니다(다른 서버에서 가져오지만 둘 다 Centos6/MariaDB 10을 실행 중임).
mysqldump --single-transaction --routines --databases myalarm -uroot -p"PASSWORD" | gzip > /FILENAME.sql.gz
gunzip < FILENAME.sql.gz | mysql -p"PASSWORD" -uroot --comments
자동으로 가져오기에 실패하는 파일을 생성합니다."--skip-extended-insert"를 추가하면 디버그하기가 훨씬 쉬운 파일이 제공되며, 이 줄은 생성되지만 읽을 수 없음을 알 수 있습니다(내보내기 또는 가져오기 중 오류는 보고되지 않음).
INSERT INTO `panels` VALUES (1003,1,257126,141,6562,1,88891,'??\\\?ŖeV???,NULL);
원본에는 이진 데이터에 대한 종결 인용문이 누락되어 있습니다.
select hex(packet_key) from panels where id=1003;
--> DE77CF5C075CE002C596176556AAF9ED
열은 이진 데이터입니다.
CREATE TABLE `panels` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`enabled` tinyint(1) NOT NULL DEFAULT '1',
`serial_number` int(10) unsigned NOT NULL,
`panel_types_id` int(11) NOT NULL,
`all_panels_id` int(11) NOT NULL,
`installers_id` int(11) DEFAULT NULL,
`users_id` int(11) DEFAULT NULL,
`packet_key` binary(16) NOT NULL,
`user_deleted` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
...
아니요, 제 sqdump를 반드시 신뢰할 수 있을 뿐만 아니라, 오류가 발생했을 때 이를 보고하는 데도 의존할 수 없습니다.
제가 사용한 추한 해결책은 쓰레기장에 이런 옵션을 추가함으로써 두 개의 피해 테이블을 제외한 제 sqdump였습니다.
--ignore-table=myalarm.panels
그러면 이 BASH 스크립트 해킹.기본적으로 NULL 열이 처리되고 이진 열이 UNHEX() 호출로 전환되는 INSERT 값을 생성하는 SELECT를 실행합니다.
(123,45678,UNHEX("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),"2014-03-17 00:00:00",NULL),
필요한 경우 원하는 편집기에 붙여넣어 재생합니다.
echo "SET UNIQUE_CHECKS=0;SET FOREIGN_KEY_CHECKS=0;DELETE FROM panels;INSERT INTO panels VALUES " > all.sql
mysql -uroot -p"PASSWORD" databasename -e "SELECT CONCAT('(',id,',', enabled,',', serial_number,',', panel_types_id,',', all_panels_id,',', IFNULL(CONVERT(installers_id,CHAR(20)),'NULL'),',', IFNULL(CONVERT(users_id,CHAR(20)),'NULL'), ',UNHEX(\"',HEX(packet_key),'\"),', IF(ISNULL(user_deleted),'NULL',CONCAT('\"', user_deleted,'\"')),'),') FROM panels" >> all.sql
echo "SET UNIQUE_CHECKS=1;SET FOREIGN_KEY_CHECKS=1;" > all.sql
그러면 INSERT에서 세미콜론으로 변환된 마지막 쉼표가 필요한 "all.sql"이라는 파일이 제공되고 위와 같이 실행할 수 있습니다.파일이 크기 때문에 대화형 mysql 셸과 명령줄에 설정된 "large import buffer" 조작이 필요했습니다.
mysql ... --max_allowed_packet=1GB
제가 버그를 보고했을 때 저는 결국 "--hex-blob" 플래그를 가리켰습니다. 이 플래그는 제가 해결하는 방법과 동일하지만 사소한 것으로 수행됩니다.그 옵션을 추가하면 블롭은 육각형으로 버려지고, 끝.
된 에서 생성된 :mysqldump믿을 수 있습니다.
전송하려면 , 의 를 하려면 하려면 를 를 합니다.--hex-blob옵션을 사용하면 각 바이트를 16진수로 변환할 수 있습니다(예: 'bet'은 0x616263이 됩니다).이렇게 하면 덤프가 더 커지지만 가장 호환되고 안전하게 정보를 저장할 수 있습니다(순수 텍스트이므로 텍스트 파일의 이진 데이터로 생성된 특수 기호로 인한 이상한 오역이 없습니다).
rar 또는 zip 파일로 포장하는 덤프 파일의 무결성을 보장하고 전송 속도를 높일 수 있습니다.이렇게 하면 전송 시 손상되지 않았음을 쉽게 감지할 수 있습니다.
서버에 로드하려고 하면 서버에 할당되었는지 확인합니다.my.cnf config file일
[mysqld]
max_allowed_packet=600M
필요한 경우 그 이상.
그렇고 막을 했고, 을 는 를 를 는 .mysqldump그리고 완벽하게 작동했습니다
, 된 할 에 의해 생성된 덤프를 할 수 있습니다.mysqldump.
예, 전송 중 인코딩 변환을 방지하려면 이진 전송을 사용해야 합니다.MySQL 덤프는 덤프에 제어 명령을 추가하여 서버가 재가져올 때 특정 인코딩으로 파일을 해석합니다.이 인코딩을 변경하지 않을 것입니다.
언급URL : https://stackoverflow.com/questions/16559086/does-mysqldump-handle-binary-data-reliably
'codememo' 카테고리의 다른 글
| 데이터베이스에서 순위 읽기 및 C#에서 증분하기 (0) | 2023.09.10 |
|---|---|
| 문자열 값으로 열거형을 정의하는 방법은? (0) | 2023.09.10 |
| 우체부 내선이 응답을 얻지만, 나의 jquery 요청은 그렇지 않습니다. (0) | 2023.09.10 |
| SELECT COUNT(*) vs 명시적 커서로 두 번 가져오기 (0) | 2023.09.05 |
| 리소스 u'tokenizers/punkt/english.pickle'을(를) 찾을 수 없습니다. (0) | 2023.09.05 |