MariaDB 증분 백업으로 변경되지 않은 데이터베이스에 대한 대용량 파일 생성
기본적으로 mariadb에 대한 증분 백업 시스템을 설정해야 합니다.모든 것이 도커 컨테이너에서 생활하고 있으며, 저는 wal-g(포스트지 및 WAL 아카이브로 설정하는 방법과 유사)를 함께 사용하려고 합니다.mariabackup
백업 작업은 다음을 기준으로 별도의 도커 컨테이너 내에서 실행됩니다.mariadb:10.8.3-jammy
가 있는 .wal-g
실행 입니다).wal-g backup-push
디버깅하는 동안 데이터 폴더로 내보내기를 사용합니다(도커 볼륨으로 마운트됨)./bak
).
아래에서 더 자세한 내용을 설명하지만, 먼저 증분 백업의 규모가 크다는 실제 문제부터 살펴보겠습니다.모든 DB 클라이언트를 사용하지 않도록 설정하고 동일한 백업을 몇 번 연속으로 반복하면(따라서 DB 클라이언트 간에 변경 사항이 없음) 초기 백업은 약 30Mb이고 모든 증분 백업은 각 30Mb입니다.
# Initial
$ sudo docker compose run --rm db_backup wal-g backup-push
[+] Running 1/0
⠿ Container reporting-db-1 Running 0.0s
INFO: 2022/11/20 19:24:01.865762 FILE PATH: stream_20221120T192400Z/stream.lz4
INFO: 2022/11/20 19:24:01.865984 Backup sentinel: {"StartLocalTime":"2022-11-20T19:24:00.366507Z","StopLocalTime":"2022-11-20T19:24:01.86589Z","UncompressedSize":350375370,"CompressedSize":227476734,"Hostname":"b08f12bbbb68"}
# Incremental
$ sudo docker compose run --rm db_backup wal-g backup-push
[+] Running 1/0
⠿ Container reporting-db-1 Running 0.0s
INFO: 2022/11/20 19:24:07.109202 FILE PATH: stream_20221120T192405Z/stream.lz4
INFO: 2022/11/20 19:24:07.109509 Backup sentinel: {"StartLocalTime":"2022-11-20T19:24:05.639259Z","StopLocalTime":"2022-11-20T19:24:07.109321Z","UncompressedSize":28104928,"CompressedSize":14609954,"Hostname":"3d9854550254"}
빈 데이터베이스를 데이터 소스로 제공하면 초기 백업과 증분 백업 모두 크기가 동일(+- 몇 Kb)하다는 점에서 훨씬 더 우스꽝스럽습니다.
는 그것을 생습다니했라고 생각했습니다.mariabackup
는 아리아 스토리지 엔진을 사용하고 증분 백업(소스)을 지원하지 않는 시스템 테이블을 덤프합니다.그러나 수동 검증은 다음과 같이 일치하지 않는 것 같습니다.모두 변환해 보았습니다.mysql.*
InooDB)로 합니다.ALTER TABLE ... engine=innodb
백업을 다시 생성하여 1.5배 더 큰 증분 덤프를 얻을 수 있습니다(압축된 결과가 약간 더 낫긴 하지만).
# Initial
$ sudo docker compose run --rm db_backup wal-g backup-push
[+] Running 1/0
⠿ Container reporting-db-1 Running 0.0s
INFO: 2022/11/20 18:56:06.254782 FILE PATH: stream_20221120T185602Z/stream.lz4
INFO: 2022/11/20 18:56:06.254984 Backup sentinel: {"StartLocalTime":"2022-11-20T18:56:02.328882Z","StopLocalTime":"2022-11-20T18:56:06.254911Z","UncompressedSize":366630153,"CompressedSize":229793575,"Hostname":"843e27ceff9e"}
# Incremental 1
$ sudo docker compose run --rm db_backup wal-g backup-push
[+] Running 1/0
⠿ Container reporting-db-1 Running 0.0s
INFO: 2022/11/20 18:56:15.123822 FILE PATH: stream_20221120T185610Z/stream.lz4
INFO: 2022/11/20 18:56:15.124035 Backup sentinel: {"StartLocalTime":"2022-11-20T18:56:10.974406Z","StopLocalTime":"2022-11-20T18:56:15.12395Z","UncompressedSize":44359711,"CompressedSize":13798326,"Hostname":"26a6e38afb59"}
# Incremental 2
$ sudo docker compose run --rm db_backup wal-g backup-push
[+] Running 1/0
⠿ Container reporting-db-1 Running 0.0s
INFO: 2022/11/20 19:06:57.626672 FILE PATH: stream_20221120T190653Z/stream.lz4
INFO: 2022/11/20 19:06:57.626904 Backup sentinel: {"StartLocalTime":"2022-11-20T19:06:53.667772Z","StopLocalTime":"2022-11-20T19:06:57.626823Z","UncompressedSize":44360402,"CompressedSize":13799019,"Hostname":"184342c39610"}
유감스럽게도, 저는 제 고객에게 편리한 DBMS로 전환해 달라고 요청할 수 없으며, 여기서 무언가를 해야 합니다.피할 수 있다면 모든 백업에 대해 이 30Mb를 저장하고 싶지는 않습니다.
- 제 추론이 괜찮은가요?또 무엇이 이런 이상한 행동을 일으킬 수 있습니까?
- 그냥 모든 시스템 테이블을 InnoDB로 변환할 수 있습니까?mysql 5.7에서 유해할 수 있다는 증거를 찾았지만 더 이상의 최근 참조를 찾을 수 없습니다.그러면 모든 것이 증분 백업을 제대로 지원하기 때문에 문제가 해결될 것입니다. (중복? 그렇지 않습니다).
- 설명된 상황을 더 잘 처리할 수 있는 대체 백업 솔루션이 있습니까?
- 요?
mariabackup
시스템 테이블 백업에서?실행 가능한 솔루션이 될 수 있을지 의문입니다(백업이 완료될수록 백업을 사용하기가 더 쉬워지기 때문입니다). 하지만 잘못된 것일 수도 있습니다.
추가 질문:
- 출력된 이진 스트림을 검사하려면 어떻게 해야 합니까?
mariabackup
시스템 테이블이 실제 문제인지 확인하는 방법(그리고 어떤 테이블이 정확한지 확인) 덤프 크기 변동의 원인은 무엇입니까?여러 개의 증분 백업을 연속으로 실행할 때마다 압축된 크기와 압축되지 않은 크기가 매번 조금씩 다릅니다(이전 실행에 비해 증가하거나 감소할 수 있습니다).백업은 결정론적인 프로세스여야 하며, 위의 모든 작업은 동일한 데이터베이스에서 수행되며, 그 사이에 아무런 수정도 없이 수행됩니다(깨끗한 볼륨이 있는 새 컨테이너에 로드된 로컬 덤프에서 시작했으며, 클라이언트가 해당 인스턴스에 액세스할 수 없으므로 달라질 것이 없습니다). 그렇다면 이 문제가 발생하는 이유는 무엇입니까?확인했습니다.mariabackup
없이wal-g
도구, 그리고 크기는 안정적입니다.그것은 좀 더 높은 수준에서 소개되고, 이것은 덜 흥미롭습니다.
위에서 설명한 모든 것이 단순하게 재현됩니다.mariabackup
또한 증분 백업당 약 27Mb의 파일을 생성합니다.
mariabackup
래퍼 스크립트:
last_lsns=$(ls /bak/lsns/ | sort -rn | head -n1)
if [ -n "$last_lsns" ]; then
ex="/bak/lsns/lsn_$(date +%s)"
mkdir -p "$ex"
mariabackup -H"$WEB_DB_HOST" -uroot -p"$MYSQL_ROOT_PASSWORD" --backup \
--stream=xbstream --datadir=/var/lib/mysql \
--incremental-basedir=/bak/lsns/$last_lsns --extra-lsndir=$ex
else
mkdir -p /bak/lsns/initial
mariabackup -H$WEB_DB_HOST -uroot -p"$MYSQL_ROOT_PASSWORD" --backup \
--stream=xbstream --datadir=/var/lib/mysql \
--extra-lsndir=/bak/lsns/initial
fi
이 스크립트는 다음으로 사용됩니다.WALG_STREAM_CREATE_COMMAND
는 또한 ▁also도 가지고 있습니다.
WALG_MYSQL_DATASOURCE_NAME='root:$MYSQL_ROOT_PASSWORD@tcp($REPORTING_DB_HOST:$REPORTING_DB_PORT)/$REPORTING_DATABASE'
WALG_FILE_PREFIX='/bak/foo'
그리고 이러한 설정(사실 컴포지트 파일로 작성되었지만 중요하지 않을 수도 있음)은 정확한 것처럼 보입니다(실제 설정은 올바른 디렉토리에 작성된 예상대로 작성됩니다.
사용되는 스토리지 유형은 다음과 같습니다.
> select table_schema, table_name, engine from information_schema.tables where table_schema <> 'performance_schema' and engine <> 'MEMORY';
+--------------------+---------------------------+--------+
| table_schema | table_name | engine |
+--------------------+---------------------------+--------+
| information_schema | ALL_PLUGINS | Aria |
| information_schema | CHECK_CONSTRAINTS | Aria |
| information_schema | COLUMNS | Aria |
| information_schema | EVENTS | Aria |
| information_schema | OPTIMIZER_TRACE | Aria |
| information_schema | PARAMETERS | Aria |
| information_schema | PARTITIONS | Aria |
| information_schema | PLUGINS | Aria |
| information_schema | PROCESSLIST | Aria |
| information_schema | ROUTINES | Aria |
| information_schema | SYSTEM_VARIABLES | Aria |
| information_schema | TRIGGERS | Aria |
| information_schema | VIEWS | Aria |
| mysql | slow_log | CSV |
| mysql | db | Aria |
| mysql | help_relation | Aria |
| mysql | general_log | CSV |
| mysql | innodb_index_stats | InnoDB |
| mysql | servers | Aria |
| mysql | time_zone_transition_type | Aria |
| mysql | gtid_slave_pos | InnoDB |
| mysql | time_zone | Aria |
| mysql | roles_mapping | Aria |
| mysql | transaction_registry | InnoDB |
| mysql | procs_priv | Aria |
| mysql | proxies_priv | Aria |
| mysql | global_priv | Aria |
| mysql | func | Aria |
| mysql | innodb_table_stats | InnoDB |
| mysql | help_topic | Aria |
| mysql | time_zone_leap_second | Aria |
| mysql | help_keyword | Aria |
| mysql | time_zone_transition | Aria |
| mysql | event | Aria |
| mysql | columns_priv | Aria |
| mysql | tables_priv | Aria |
| mysql | time_zone_name | Aria |
| mysql | plugin | Aria |
| mysql | table_stats | Aria |
| mysql | index_stats | Aria |
| mysql | proc | Aria |
| mysql | help_category | Aria |
| mysql | column_stats | Aria |
| test_reporting | merchant_configs | InnoDB |
| test_reporting | masterdata_prediction | InnoDB |
| test_reporting | aggregator_config | InnoDB |
| test_reporting | masterdata | InnoDB |
| test_reporting | fixed_costs | InnoDB |
| test_reporting | timeline | InnoDB |
| test_reporting | migrations | InnoDB |
| test_reporting | user_analytics | InnoDB |
| test_reporting | affiliate | InnoDB |
| test_reporting | vat_config | InnoDB |
| sys | sys_config | Aria |
| reporting | merchant_configs | InnoDB |
| reporting | masterdata_prediction | InnoDB |
| reporting | aggregator_config | InnoDB |
| reporting | masterdata | InnoDB |
| reporting | fixed_costs | InnoDB |
| reporting | timeline | InnoDB |
| reporting | migrations | InnoDB |
| reporting | user_analytics | InnoDB |
| reporting | affiliate | InnoDB |
| reporting | vat_config | InnoDB |
| reporting_web | record_change | InnoDB |
| reporting_web | jwt_expiry | InnoDB |
| reporting_web | forecasting | InnoDB |
| reporting_web | users | InnoDB |
| reporting_web | alembic_version | InnoDB |
| reporting_web | merchant_analytics | InnoDB |
| reporting_web | email_config | InnoDB |
| reporting_web | user_company | InnoDB |
| reporting_web | user_detail | InnoDB |
+--------------------+---------------------------+--------+
MDEV-23614에서 언급한 바와 같이 아리아 시스템 테이블은 증분 백업할 수 없습니다.
보신 것처럼 10.4+에서 시스템 테이블을 InnoDB로 변경할 수 있습니다.Azure는 기본적으로 이 작업을 수행합니다.
두 가지 작은 문제로 인해 이 문제가 기본값이 될 수 없습니다.--enforce-storage-engine=InnoDB
도움말 테이블과 관련된 두 가지 항목:
CREATE TABLE IF NOT EXISTS help_relation
에는 한대에 FK 참있다니습에 가 있습니다.help_keyword
,그렇지만help_keyword
않음(, 스왑정easy▁in수easymysql_system_tables.sql
)fill_help_tables.sql
,lock tables help_topic write, help_category write..
InnoDB가 되면, "InnoDB", "InnoDB"를 반환합니다.ER_WRONG_LOCK_OF_SYSTEM_TABLE
의견을 제시할 수 있지만 실제로는 보고/수정이 필요한 버그입니다.
공간을 절약하기 위해 도움말 테이블과 프로세스 테이블이 가장 큽니다.
- 은 " " " 또는 " "의 경우 입니다.
HELP command
잘리거나 수 .잘리거나 제거할 수 있습니다. - proc에는 기본적으로 필요하지 않을 수도 있는 gis 함수가 많이 포함되어 있습니다.
- 둘 다 InnoDB로 변환될 수 있습니다.
대안:
- 이진 로그를 PITR 대체 메커니즘으로 사용하고 추가적인 마리아 백업을 더 적게 수행합니다.
마리아 백업에 패치를 제공합니다.
언급URL : https://stackoverflow.com/questions/74511347/mariadb-incremental-backup-generates-large-files-for-unchanged-database
'source' 카테고리의 다른 글
스프링 부트에서 JSON에서 예외를 다시 던지는 방법 (0) | 2023.07.09 |
---|---|
Oracle 날짜는 어떻게 구현됩니까? (0) | 2023.07.09 |
ggplot2에서 주변 히스토그램이 있는 산점도 (0) | 2023.07.09 |
TypeScript 인터페이스의 선택적 매개 변수 (0) | 2023.07.09 |
스프링 부트가 있는 여러 Rabbitmq 대기열 (0) | 2023.07.09 |