source

MariaDB 증분 백업으로 변경되지 않은 데이터베이스에 대한 대용량 파일 생성

manysource 2023. 7. 9. 11:18

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