From 4ccf2bc982ff45c6960242082ae8bfc317d021b5 Mon Sep 17 00:00:00 2001 From: Satya Bodapati Date: Thu, 29 Aug 2024 15:32:20 +0100 Subject: [PATCH 1/2] Revert "Follow up fix to PXB-3316 : Remove doc folder to fix Snyk issues" This reverts commit a627557b8cf5514d3aa699c3eebd987068d5d93a. --- cmake/make_dist.cmake.in | 12 ++++++++++++ man/CMakeLists.txt | 4 ---- sql/CMakeLists.txt | 4 ++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/cmake/make_dist.cmake.in b/cmake/make_dist.cmake.in index b6e6b23f731c..235c0cb3b4a6 100644 --- a/cmake/make_dist.cmake.in +++ b/cmake/make_dist.cmake.in @@ -142,6 +142,18 @@ IF(NOT EXISTS ${PACKAGE_DIR}/Docs/INFO_SRC) CREATE_INFO_SRC(${PACKAGE_DIR}/Docs) ENDIF() +# Add xtrabackup man pages +SET(MAN_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}/storage/innobase/xtrabackup/doc/source/build/man) +SET(MAN_PKG_DIR ${PACKAGE_DIR}/storage/innobase/xtrabackup/doc/source/build/man) + +IF(EXISTS ${MAN_BIN_DIR}) + FILE(GLOB MAN_FILES RELATIVE ${MAN_BIN_DIR} ${MAN_BIN_DIR}/*.1) + FOREACH(MAN_FILE ${MAN_FILES}) + CONFIGURE_FILE(${MAN_BIN_DIR}/${MAN_FILE} + ${MAN_PKG_DIR}/${MAN_FILE} COPYONLY) + ENDFOREACH() +ENDIF() + # In case we used CPack, it could have copied some # extra files that are not usable on different machines. FILE(REMOVE ${PACKAGE_DIR}/CMakeCache.txt) diff --git a/man/CMakeLists.txt b/man/CMakeLists.txt index 520efe5e343c..673aaabaca3d 100644 --- a/man/CMakeLists.txt +++ b/man/CMakeLists.txt @@ -26,10 +26,6 @@ FILE(GLOB MAN1_NDB ndb*.1) FILE(GLOB MAN8 *.8) FILE(GLOB MAN8_NDB ndb*.8) -IF (WITH_XTRABACKUP) - RETURN() -ENDIF() - IF(MAN1_NDB AND NOT WITH_NDB) LIST(REMOVE_ITEM MAN1 ${MAN1_NDB}) ENDIF() diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index b46aa43cddde..24a1f0082eab 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -1237,6 +1237,10 @@ ADD_CUSTOM_TARGET(dist WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) +IF(WITH_MAN_PAGES) + ADD_DEPENDENCIES(dist man) +ENDIF() + ADD_CUSTOM_TARGET(distclean COMMAND ${CMAKE_COMMAND} -E echo WARNING: distclean target is not functional COMMAND ${CMAKE_COMMAND} -E echo Use 'git clean -fdx' instead From a4a1608667640d79df1276e4e01622ba7efd4a55 Mon Sep 17 00:00:00 2001 From: Satya Bodapati Date: Thu, 29 Aug 2024 15:32:36 +0100 Subject: [PATCH 2/2] Revert "PXB-3316 Remove doc folder to fix Snyk issues (8.0)" This reverts commit b4a7208cbbc15c20ff51be5d1e6a6ade4ad175c5. --- README.md | 2 +- storage/innobase/xtrabackup/CMakeLists.txt | 1 + storage/innobase/xtrabackup/doc/.gitignore | 4 + storage/innobase/xtrabackup/doc/Makefile | 103 ++ .../xtrabackup/doc/_resource/.DS_Store | Bin 0 -> 6148 bytes .../doc/_resource/overrides/.DS_Store | Bin 0 -> 6148 bytes .../doc/_resource/overrides/404.html | 9 + .../doc/_resource/overrides/main.html | 59 + .../_resource/overrides/partials/header.html | 77 ++ .../doc/_resource/overrides/partials/nav.html | 36 + .../doc/_resource/templates/styles.scss | 110 ++ .../xtrabackup/doc/_resource/theme/.DS_Store | Bin 0 -> 6148 bytes .../xtrabackup/doc/_resource/theme/main.html | 220 ++++ .../innobase/xtrabackup/doc/docs/.DS_Store | Bin 0 -> 6148 bytes .../xtrabackup/doc/docs/_static/.DS_Store | Bin 0 -> 6148 bytes .../xtrabackup/doc/docs/_static/lru_dump.png | Bin 0 -> 27861 bytes .../doc/docs/_static/percona-logo.svg | 12 + .../docs/_static}/percona-xtrabackup-logo.jpg | Bin .../doc/docs/_static/percona_favicon.ico | Bin 0 -> 894 bytes .../xtrabackup/doc/docs/_static/throttle.png | Bin 0 -> 32074 bytes .../encrypted_innodb_tablespace_backups.md | 545 +++++++++ .../xtrabackup/doc/docs/advanced/locks.md | 71 ++ .../doc/docs/advanced/log_enhancements.md | 85 ++ .../doc/docs/advanced/page_tracking.md | 141 +++ .../doc/docs/advanced/throttling_backups.md | 28 + .../backup_scenarios/compressed_backup.md | 120 ++ .../doc/docs/backup_scenarios/full_backup.md | 219 ++++ .../backup_scenarios/incremental_backup.md | 242 ++++ .../xtrabackup/doc/docs/css/details.css | 36 + .../xtrabackup/doc/docs/css/percona.css | 16 + .../xtrabackup/doc/docs/css/toctree.css | 48 + .../doc/docs/css/version-select.css | 5 + .../xtrabackup/doc/docs/em/instant.md | 65 + storage/innobase/xtrabackup/doc/docs/faq.md | 105 ++ .../innobase/xtrabackup/doc/docs/glossary.md | 182 +++ .../innobase/xtrabackup/doc/docs/how-tos.md | 70 ++ .../doc/docs/how_xtrabackup_works.md | 113 ++ .../doc/docs/howtos/backup_verification.md | 105 ++ .../doc/docs/howtos/enabling_tcp.md | 38 + .../xtrabackup/doc/docs/howtos/permissions.md | 77 ++ .../doc/docs/howtos/recipes_ibkx_gtid.md | 145 +++ .../doc/docs/howtos/recipes_xbk_compressed.md | 113 ++ .../doc/docs/howtos/recipes_xbk_full.md | 35 + .../doc/docs/howtos/recipes_xbk_inc.md | 75 ++ .../doc/docs/howtos/recipes_xbk_partition.md | 100 ++ .../doc/docs/howtos/recipes_xbk_stream.md | 27 + .../doc/docs/howtos/setting_up_replication.md | 347 ++++++ .../xtrabackup/doc/docs/howtos/ssh_server.md | 19 + storage/innobase/xtrabackup/doc/docs/index.md | 174 +++ .../doc/docs/installation/apt_repo.md | 153 +++ .../doc/docs/installation/binary-tarball.md | 28 + .../docs/installation/compiling_xtrabackup.md | 188 +++ .../doc/docs/installation/docker.md | 120 ++ .../doc/docs/installation/yum_repo.md | 86 ++ storage/innobase/xtrabackup/doc/docs/intro.md | 100 ++ .../innobase/xtrabackup/doc/docs/manual.md | 26 + .../xtrabackup/doc/docs/release-notes.md | 58 + .../doc/docs/release-notes/.DS_Store | Bin 0 -> 8196 bytes .../doc/docs/release-notes/8.0/8.0-3-rc1.md | 40 + .../doc/docs/release-notes/8.0/8.0.10.md | 35 + .../doc/docs/release-notes/8.0/8.0.11.md | 21 + .../doc/docs/release-notes/8.0/8.0.12.md | 34 + .../doc/docs/release-notes/8.0/8.0.13.md | 40 + .../doc/docs/release-notes/8.0/8.0.14.md | 51 + .../doc/docs/release-notes/8.0/8.0.22-15.0.md | 62 + .../doc/docs/release-notes/8.0/8.0.23-16.0.md | 57 + .../doc/docs/release-notes/8.0/8.0.25-17.0.md | 50 + .../doc/docs/release-notes/8.0/8.0.26-18.0.md | 43 + .../doc/docs/release-notes/8.0/8.0.27-19.0.md | 60 + .../doc/docs/release-notes/8.0/8.0.28-20.0.md | 72 ++ .../doc/docs/release-notes/8.0/8.0.28-21.0.md | 34 + .../doc/docs/release-notes/8.0/8.0.29-22.0.md | 23 + .../doc/docs/release-notes/8.0/8.0.4.md | 56 + .../doc/docs/release-notes/8.0/8.0.5.md | 93 ++ .../doc/docs/release-notes/8.0/8.0.6.md | 70 ++ .../doc/docs/release-notes/8.0/8.0.7.md | 65 + .../doc/docs/release-notes/8.0/8.0.8.md | 59 + .../doc/docs/release-notes/8.0/8.0.9.md | 19 + .../doc/docs/security/pxb-apparmor.md | 54 + .../doc/docs/security/pxb-selinux.md | 116 ++ .../xtrabackup/doc/docs/trademark-policy.md | 65 + .../doc/docs/using_xtrabackup/comparison.md | 50 + .../doc/docs/using_xtrabackup/configuring.md | 46 + .../doc/docs/using_xtrabackup/privileges.md | 132 ++ .../xtrabackup/doc/docs/version-check.md | 118 ++ .../xtrabackup/doc/docs/xbcloud/xbcloud.md | 298 +++++ .../doc/docs/xbcloud/xbcloud_azure.md | 54 + .../doc/docs/xbcloud/xbcloud_exbackoff.md | 141 +++ .../doc/docs/xbcloud/xbcloud_gcs.md | 53 + .../doc/docs/xbcloud/xbcloud_minio.md | 14 + .../xtrabackup/doc/docs/xbcloud/xbcloud_s3.md | 54 + .../doc/docs/xbcloud/xbcloud_swift.md | 170 +++ .../xtrabackup/doc/docs/xbcrypt/xbcrypt.md | 49 + .../xtrabackup/doc/docs/xbstream/xbstream.md | 69 ++ .../xtrabackup/doc/docs/xtrabackup-files.md | 100 ++ .../analyzing_table_statistics.md | 156 +++ .../xtrabackup_bin/backup.accelerating.md | 61 + .../docs/xtrabackup_bin/backup.encrypting.md | 116 ++ .../doc/docs/xtrabackup_bin/backup.history.md | 163 +++ .../docs/xtrabackup_bin/backup.streaming.md | 127 ++ .../flush-tables-with-read-lock.md | 115 ++ .../xtrabackup_bin/implementation_details.md | 50 + .../xtrabackup_bin/incremental_backups.md | 220 ++++ .../doc/docs/xtrabackup_bin/lru_dump.md | 20 + .../docs/xtrabackup_bin/partial_backups.md | 162 +++ .../xtrabackup_bin/point-in-time-recovery.md | 92 ++ .../doc/docs/xtrabackup_bin/replication.md | 31 + .../restoring_individual_tables.md | 78 ++ .../working_with_binary_logs.md | 32 + .../xtrabackup_bin/xbk_option_reference.md | 974 +++++++++++++++ .../docs/xtrabackup_bin/xtrabackup_binary.md | 80 ++ .../xtrabackup_bin/xtrabackup_exit_codes.md | 5 + .../innobase/xtrabackup/doc/mkdocs-base.yml | 171 +++ .../innobase/xtrabackup/doc/mkdocs-pdf.yml | 9 + .../xtrabackup/doc/mkdocs-percona.yml | 23 + storage/innobase/xtrabackup/doc/mkdocs.yml | 16 + storage/innobase/xtrabackup/doc/netlify.toml | 21 + .../innobase/xtrabackup/doc/requirements.txt | 14 + storage/innobase/xtrabackup/doc/runtime.txt | 1 + .../source/.res/contents/example.xbstream.txt | 74 ++ .../contents/important.storage-engine.txt | 12 + .../instruction.repository.enabling.txt | 6 + .../doc/source/.res/contents/text.pxb.8-0.txt | 14 + .../xtrabackup/doc/source/CMakeLists.txt | 88 ++ .../innobase/xtrabackup/doc/source/README.md | 7 + .../doc/source/_res/images/new-topic.png | Bin 0 -> 60063 bytes .../doc/source/_res/replace/README.txt | 29 + .../doc/source/_res/replace/abbr.txt | 4 + .../doc/source/_res/replace/command.txt | 8 + .../doc/source/_res/replace/file.txt | 3 + .../doc/source/_res/replace/parameter.txt | 5 + .../doc/source/_res/replace/proper.txt | 13 + .../doc/source/_res/replace/pxb-blurb.txt | 1 + .../doc/source/_res/replace/useful-links.txt | 10 + .../doc/source/_static/lru_dump.png | Bin 0 -> 27861 bytes .../doc/source/_static/percona-logo.svg | 12 + .../_static/percona-xtrabackup-logo.jpg | Bin 0 -> 36163 bytes .../doc/source/_static/percona_favicon.ico | Bin 0 -> 894 bytes .../doc/source/_static/throttle.png | Bin 0 -> 32074 bytes .../doc/source/_templates/theme/header.html | 40 + .../doc/source/_templates/theme/layout.html | 19 + .../doc/source/_templates/theme/localtoc.html | 26 + .../doc/source/_templates/theme/relbar2.html | 14 + .../doc/source/_templates/theme/sidebar.html | 22 + .../encrypted_innodb_tablespace_backups.rst | 496 ++++++++ .../xtrabackup/doc/source/advanced/locks.rst | 74 ++ .../doc/source/advanced/log_enhancements.rst | 72 ++ .../doc/source/advanced/page_tracking.rst | 124 ++ .../source/advanced/throttling_backups.rst | 29 + .../backup_scenarios/compressed_backup.rst | 120 ++ .../source/backup_scenarios/full_backup.rst | 215 ++++ .../backup_scenarios/incremental_backup.rst | 245 ++++ .../doc/source/conf-material/conf.py | 34 + .../innobase/xtrabackup/doc/source/conf.py | 299 +++++ .../xtrabackup/doc/source/em/instant.rst | 71 ++ .../innobase/xtrabackup/doc/source/faq.rst | 96 ++ .../xtrabackup/doc/source/glossary.rst | 210 ++++ .../xtrabackup/doc/source/how-tos.rst | 65 + .../doc/source/how_xtrabackup_works.rst | 127 ++ .../doc/source/howtos/backup_verification.rst | 73 ++ .../doc/source/howtos/enabling_tcp.rst | 22 + .../doc/source/howtos/permissions.rst | 54 + .../doc/source/howtos/recipes_ibkx_gtid.rst | 144 +++ .../source/howtos/recipes_xbk_compressed.rst | 119 ++ .../doc/source/howtos/recipes_xbk_full.rst | 38 + .../doc/source/howtos/recipes_xbk_inc.rst | 66 + .../source/howtos/recipes_xbk_partition.rst | 108 ++ .../doc/source/howtos/recipes_xbk_stream.rst | 21 + .../source/howtos/setting_up_replication.rst | 291 +++++ .../doc/source/howtos/ssh_server.rst | 25 + .../innobase/xtrabackup/doc/source/index.rst | 213 ++++ .../doc/source/installation/apt_repo.rst | 159 +++ .../source/installation/binary-tarball.rst | 61 + .../installation/compiling_xtrabackup.rst | 232 ++++ .../doc/source/installation/docker.rst | 124 ++ .../doc/source/installation/yum_repo.rst | 93 ++ .../innobase/xtrabackup/doc/source/intro.rst | 82 ++ .../innobase/xtrabackup/doc/source/manual.rst | 36 + .../doc/source/percona-logo-color.png | Bin 0 -> 17550 bytes .../xtrabackup/doc/source/percona-logo.jpg | Bin 0 -> 55451 bytes .../doc/source/percona-xtrabackup-logo.jpg | Bin 0 -> 36163 bytes .../xtrabackup/doc/source/percona_favicon.ico | Bin 0 -> 894 bytes .../xtrabackup/doc/source/release-notes.rst | 29 + .../source/release-notes/8.0/8.0-3-rc1.rst | 39 + .../doc/source/release-notes/8.0/8.0.10.rst | 31 + .../doc/source/release-notes/8.0/8.0.11.rst | 23 + .../doc/source/release-notes/8.0/8.0.12.rst | 25 + .../doc/source/release-notes/8.0/8.0.13.rst | 27 + .../doc/source/release-notes/8.0/8.0.14.rst | 36 + .../source/release-notes/8.0/8.0.22-15.0.rst | 45 + .../source/release-notes/8.0/8.0.23-16.0.rst | 38 + .../source/release-notes/8.0/8.0.25-17.0.rst | 40 + .../source/release-notes/8.0/8.0.26-18.0.rst | 33 + .../source/release-notes/8.0/8.0.27-19.0.rst | 48 + .../source/release-notes/8.0/8.0.28-20.0.rst | 47 + .../source/release-notes/8.0/8.0.28-21.0.rst | 28 + .../source/release-notes/8.0/8.0.29-22.0.rst | 24 + .../doc/source/release-notes/8.0/8.0.4.rst | 54 + .../doc/source/release-notes/8.0/8.0.5.rst | 88 ++ .../doc/source/release-notes/8.0/8.0.6.rst | 66 + .../doc/source/release-notes/8.0/8.0.7.rst | 63 + .../doc/source/release-notes/8.0/8.0.8.rst | 56 + .../doc/source/release-notes/8.0/8.0.9.rst | 26 + .../doc/source/security/pxb-apparmor.rst | 59 + .../doc/source/security/pxb-selinux.rst | 119 ++ .../doc/source/trademark-policy.rst | 69 ++ .../source/using_xtrabackup/comparison.rst | 37 + .../source/using_xtrabackup/configuring.rst | 50 + .../source/using_xtrabackup/privileges.rst | 147 +++ .../xtrabackup/doc/source/version-check.rst | 121 ++ .../xtrabackup/doc/source/xbcloud/xbcloud.rst | 316 +++++ .../doc/source/xbcloud/xbcloud_azure.rst | 77 ++ .../doc/source/xbcloud/xbcloud_exbackoff.rst | 105 ++ .../doc/source/xbcloud/xbcloud_gcs.rst | 50 + .../doc/source/xbcloud/xbcloud_minio.rst | 19 + .../doc/source/xbcloud/xbcloud_s3.rst | 73 ++ .../doc/source/xbcloud/xbcloud_swift.rst | 161 +++ .../xtrabackup/doc/source/xbcrypt/xbcrypt.rst | 53 + .../doc/source/xbstream/xbstream.rst | 67 ++ .../doc/source/xbstream/xbstream_format.md | 219 ++++ .../doc/source/xtrabackup-files.rst | 86 ++ .../analyzing_table_statistics.rst | 137 +++ .../xtrabackup_bin/backup.accelerating.rst | 69 ++ .../xtrabackup_bin/backup.encrypting.rst | 127 ++ .../source/xtrabackup_bin/backup.history.rst | 108 ++ .../xtrabackup_bin/backup.streaming.rst | 46 + .../flush-tables-with-read-lock.rst | 117 ++ .../xtrabackup_bin/implementation_details.rst | 53 + .../xtrabackup_bin/incremental_backups.rst | 218 ++++ .../doc/source/xtrabackup_bin/lru_dump.rst | 27 + .../source/xtrabackup_bin/partial_backups.rst | 180 +++ .../xtrabackup_bin/point-in-time-recovery.rst | 84 ++ .../doc/source/xtrabackup_bin/replication.rst | 40 + .../restoring_individual_tables.rst | 94 ++ .../working_with_binary_logs.rst | 41 + .../xtrabackup_bin/xbk_option_reference.rst | 1066 +++++++++++++++++ .../xtrabackup_bin/xtrabackup_binary.rst | 70 ++ .../xtrabackup_bin/xtrabackup_exit_codes.rst | 7 + 238 files changed, 19864 insertions(+), 1 deletion(-) create mode 100644 storage/innobase/xtrabackup/doc/.gitignore create mode 100644 storage/innobase/xtrabackup/doc/Makefile create mode 100644 storage/innobase/xtrabackup/doc/_resource/.DS_Store create mode 100644 storage/innobase/xtrabackup/doc/_resource/overrides/.DS_Store create mode 100644 storage/innobase/xtrabackup/doc/_resource/overrides/404.html create mode 100644 storage/innobase/xtrabackup/doc/_resource/overrides/main.html create mode 100644 storage/innobase/xtrabackup/doc/_resource/overrides/partials/header.html create mode 100644 storage/innobase/xtrabackup/doc/_resource/overrides/partials/nav.html create mode 100644 storage/innobase/xtrabackup/doc/_resource/templates/styles.scss create mode 100644 storage/innobase/xtrabackup/doc/_resource/theme/.DS_Store create mode 100644 storage/innobase/xtrabackup/doc/_resource/theme/main.html create mode 100644 storage/innobase/xtrabackup/doc/docs/.DS_Store create mode 100644 storage/innobase/xtrabackup/doc/docs/_static/.DS_Store create mode 100644 storage/innobase/xtrabackup/doc/docs/_static/lru_dump.png create mode 100644 storage/innobase/xtrabackup/doc/docs/_static/percona-logo.svg rename storage/innobase/xtrabackup/{ => doc/docs/_static}/percona-xtrabackup-logo.jpg (100%) create mode 100644 storage/innobase/xtrabackup/doc/docs/_static/percona_favicon.ico create mode 100644 storage/innobase/xtrabackup/doc/docs/_static/throttle.png create mode 100644 storage/innobase/xtrabackup/doc/docs/advanced/encrypted_innodb_tablespace_backups.md create mode 100644 storage/innobase/xtrabackup/doc/docs/advanced/locks.md create mode 100644 storage/innobase/xtrabackup/doc/docs/advanced/log_enhancements.md create mode 100644 storage/innobase/xtrabackup/doc/docs/advanced/page_tracking.md create mode 100644 storage/innobase/xtrabackup/doc/docs/advanced/throttling_backups.md create mode 100644 storage/innobase/xtrabackup/doc/docs/backup_scenarios/compressed_backup.md create mode 100644 storage/innobase/xtrabackup/doc/docs/backup_scenarios/full_backup.md create mode 100644 storage/innobase/xtrabackup/doc/docs/backup_scenarios/incremental_backup.md create mode 100644 storage/innobase/xtrabackup/doc/docs/css/details.css create mode 100644 storage/innobase/xtrabackup/doc/docs/css/percona.css create mode 100644 storage/innobase/xtrabackup/doc/docs/css/toctree.css create mode 100644 storage/innobase/xtrabackup/doc/docs/css/version-select.css create mode 100644 storage/innobase/xtrabackup/doc/docs/em/instant.md create mode 100644 storage/innobase/xtrabackup/doc/docs/faq.md create mode 100644 storage/innobase/xtrabackup/doc/docs/glossary.md create mode 100644 storage/innobase/xtrabackup/doc/docs/how-tos.md create mode 100644 storage/innobase/xtrabackup/doc/docs/how_xtrabackup_works.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/backup_verification.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/enabling_tcp.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/permissions.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/recipes_ibkx_gtid.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_compressed.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_full.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_inc.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_partition.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_stream.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/setting_up_replication.md create mode 100644 storage/innobase/xtrabackup/doc/docs/howtos/ssh_server.md create mode 100644 storage/innobase/xtrabackup/doc/docs/index.md create mode 100644 storage/innobase/xtrabackup/doc/docs/installation/apt_repo.md create mode 100644 storage/innobase/xtrabackup/doc/docs/installation/binary-tarball.md create mode 100644 storage/innobase/xtrabackup/doc/docs/installation/compiling_xtrabackup.md create mode 100644 storage/innobase/xtrabackup/doc/docs/installation/docker.md create mode 100644 storage/innobase/xtrabackup/doc/docs/installation/yum_repo.md create mode 100644 storage/innobase/xtrabackup/doc/docs/intro.md create mode 100644 storage/innobase/xtrabackup/doc/docs/manual.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/.DS_Store create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0-3-rc1.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.10.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.11.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.12.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.13.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.14.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.22-15.0.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.23-16.0.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.25-17.0.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.26-18.0.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.27-19.0.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.28-20.0.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.28-21.0.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.29-22.0.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.4.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.5.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.6.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.7.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.8.md create mode 100644 storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.9.md create mode 100644 storage/innobase/xtrabackup/doc/docs/security/pxb-apparmor.md create mode 100644 storage/innobase/xtrabackup/doc/docs/security/pxb-selinux.md create mode 100644 storage/innobase/xtrabackup/doc/docs/trademark-policy.md create mode 100644 storage/innobase/xtrabackup/doc/docs/using_xtrabackup/comparison.md create mode 100644 storage/innobase/xtrabackup/doc/docs/using_xtrabackup/configuring.md create mode 100644 storage/innobase/xtrabackup/doc/docs/using_xtrabackup/privileges.md create mode 100644 storage/innobase/xtrabackup/doc/docs/version-check.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_azure.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_exbackoff.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_gcs.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_minio.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_s3.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_swift.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xbcrypt/xbcrypt.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xbstream/xbstream.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup-files.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/analyzing_table_statistics.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.accelerating.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.encrypting.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.history.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.streaming.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/flush-tables-with-read-lock.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/implementation_details.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/incremental_backups.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/lru_dump.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/partial_backups.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/point-in-time-recovery.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/replication.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/restoring_individual_tables.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/working_with_binary_logs.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xbk_option_reference.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xtrabackup_binary.md create mode 100644 storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xtrabackup_exit_codes.md create mode 100644 storage/innobase/xtrabackup/doc/mkdocs-base.yml create mode 100644 storage/innobase/xtrabackup/doc/mkdocs-pdf.yml create mode 100644 storage/innobase/xtrabackup/doc/mkdocs-percona.yml create mode 100644 storage/innobase/xtrabackup/doc/mkdocs.yml create mode 100644 storage/innobase/xtrabackup/doc/netlify.toml create mode 100644 storage/innobase/xtrabackup/doc/requirements.txt create mode 100644 storage/innobase/xtrabackup/doc/runtime.txt create mode 100644 storage/innobase/xtrabackup/doc/source/.res/contents/example.xbstream.txt create mode 100644 storage/innobase/xtrabackup/doc/source/.res/contents/important.storage-engine.txt create mode 100644 storage/innobase/xtrabackup/doc/source/.res/contents/instruction.repository.enabling.txt create mode 100644 storage/innobase/xtrabackup/doc/source/.res/contents/text.pxb.8-0.txt create mode 100644 storage/innobase/xtrabackup/doc/source/CMakeLists.txt create mode 100644 storage/innobase/xtrabackup/doc/source/README.md create mode 100644 storage/innobase/xtrabackup/doc/source/_res/images/new-topic.png create mode 100644 storage/innobase/xtrabackup/doc/source/_res/replace/README.txt create mode 100644 storage/innobase/xtrabackup/doc/source/_res/replace/abbr.txt create mode 100644 storage/innobase/xtrabackup/doc/source/_res/replace/command.txt create mode 100644 storage/innobase/xtrabackup/doc/source/_res/replace/file.txt create mode 100644 storage/innobase/xtrabackup/doc/source/_res/replace/parameter.txt create mode 100644 storage/innobase/xtrabackup/doc/source/_res/replace/proper.txt create mode 100644 storage/innobase/xtrabackup/doc/source/_res/replace/pxb-blurb.txt create mode 100644 storage/innobase/xtrabackup/doc/source/_res/replace/useful-links.txt create mode 100644 storage/innobase/xtrabackup/doc/source/_static/lru_dump.png create mode 100644 storage/innobase/xtrabackup/doc/source/_static/percona-logo.svg create mode 100644 storage/innobase/xtrabackup/doc/source/_static/percona-xtrabackup-logo.jpg create mode 100644 storage/innobase/xtrabackup/doc/source/_static/percona_favicon.ico create mode 100644 storage/innobase/xtrabackup/doc/source/_static/throttle.png create mode 100644 storage/innobase/xtrabackup/doc/source/_templates/theme/header.html create mode 100644 storage/innobase/xtrabackup/doc/source/_templates/theme/layout.html create mode 100644 storage/innobase/xtrabackup/doc/source/_templates/theme/localtoc.html create mode 100644 storage/innobase/xtrabackup/doc/source/_templates/theme/relbar2.html create mode 100644 storage/innobase/xtrabackup/doc/source/_templates/theme/sidebar.html create mode 100644 storage/innobase/xtrabackup/doc/source/advanced/encrypted_innodb_tablespace_backups.rst create mode 100644 storage/innobase/xtrabackup/doc/source/advanced/locks.rst create mode 100644 storage/innobase/xtrabackup/doc/source/advanced/log_enhancements.rst create mode 100644 storage/innobase/xtrabackup/doc/source/advanced/page_tracking.rst create mode 100644 storage/innobase/xtrabackup/doc/source/advanced/throttling_backups.rst create mode 100644 storage/innobase/xtrabackup/doc/source/backup_scenarios/compressed_backup.rst create mode 100644 storage/innobase/xtrabackup/doc/source/backup_scenarios/full_backup.rst create mode 100644 storage/innobase/xtrabackup/doc/source/backup_scenarios/incremental_backup.rst create mode 100644 storage/innobase/xtrabackup/doc/source/conf-material/conf.py create mode 100644 storage/innobase/xtrabackup/doc/source/conf.py create mode 100644 storage/innobase/xtrabackup/doc/source/em/instant.rst create mode 100644 storage/innobase/xtrabackup/doc/source/faq.rst create mode 100644 storage/innobase/xtrabackup/doc/source/glossary.rst create mode 100644 storage/innobase/xtrabackup/doc/source/how-tos.rst create mode 100644 storage/innobase/xtrabackup/doc/source/how_xtrabackup_works.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/backup_verification.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/enabling_tcp.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/permissions.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/recipes_ibkx_gtid.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_compressed.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_full.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_inc.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_partition.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_stream.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/setting_up_replication.rst create mode 100644 storage/innobase/xtrabackup/doc/source/howtos/ssh_server.rst create mode 100644 storage/innobase/xtrabackup/doc/source/index.rst create mode 100644 storage/innobase/xtrabackup/doc/source/installation/apt_repo.rst create mode 100644 storage/innobase/xtrabackup/doc/source/installation/binary-tarball.rst create mode 100644 storage/innobase/xtrabackup/doc/source/installation/compiling_xtrabackup.rst create mode 100644 storage/innobase/xtrabackup/doc/source/installation/docker.rst create mode 100644 storage/innobase/xtrabackup/doc/source/installation/yum_repo.rst create mode 100644 storage/innobase/xtrabackup/doc/source/intro.rst create mode 100644 storage/innobase/xtrabackup/doc/source/manual.rst create mode 100644 storage/innobase/xtrabackup/doc/source/percona-logo-color.png create mode 100644 storage/innobase/xtrabackup/doc/source/percona-logo.jpg create mode 100644 storage/innobase/xtrabackup/doc/source/percona-xtrabackup-logo.jpg create mode 100644 storage/innobase/xtrabackup/doc/source/percona_favicon.ico create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0-3-rc1.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.10.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.11.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.12.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.13.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.14.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.22-15.0.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.23-16.0.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.25-17.0.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.26-18.0.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.27-19.0.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.28-20.0.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.28-21.0.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.29-22.0.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.4.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.5.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.6.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.7.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.8.rst create mode 100644 storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.9.rst create mode 100644 storage/innobase/xtrabackup/doc/source/security/pxb-apparmor.rst create mode 100644 storage/innobase/xtrabackup/doc/source/security/pxb-selinux.rst create mode 100644 storage/innobase/xtrabackup/doc/source/trademark-policy.rst create mode 100644 storage/innobase/xtrabackup/doc/source/using_xtrabackup/comparison.rst create mode 100644 storage/innobase/xtrabackup/doc/source/using_xtrabackup/configuring.rst create mode 100644 storage/innobase/xtrabackup/doc/source/using_xtrabackup/privileges.rst create mode 100644 storage/innobase/xtrabackup/doc/source/version-check.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_azure.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_exbackoff.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_gcs.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_minio.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_s3.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_swift.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xbcrypt/xbcrypt.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xbstream/xbstream.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xbstream/xbstream_format.md create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup-files.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/analyzing_table_statistics.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.accelerating.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.encrypting.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.history.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.streaming.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/flush-tables-with-read-lock.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/implementation_details.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/incremental_backups.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/lru_dump.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/partial_backups.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/point-in-time-recovery.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/replication.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/restoring_individual_tables.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/working_with_binary_logs.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xbk_option_reference.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xtrabackup_binary.rst create mode 100644 storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xtrabackup_exit_codes.rst diff --git a/README.md b/README.md index 3a85f3e36ab9..5ee647671220 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## Percona XtraBackup -![PXB logo](storage/innobase/xtrabackup/percona-xtrabackup-logo.jpg) +![PXB logo](storage/innobase/xtrabackup/doc/source/percona-xtrabackup-logo.jpg) Percona XtraBackup is an open-source hot backup utility for MySQL - based servers that doesn’t lock your database during the backup. diff --git a/storage/innobase/xtrabackup/CMakeLists.txt b/storage/innobase/xtrabackup/CMakeLists.txt index a41551e9ee4c..39e8a968c14a 100644 --- a/storage/innobase/xtrabackup/CMakeLists.txt +++ b/storage/innobase/xtrabackup/CMakeLists.txt @@ -24,6 +24,7 @@ INSTALL_SCRIPT(${CMAKE_CURRENT_BINARY_DIR}/xbcloud_osenv ) ADD_SUBDIRECTORY(src) +ADD_SUBDIRECTORY(doc/source) IF(INSTALL_MYSQLTESTDIR) INSTALL( diff --git a/storage/innobase/xtrabackup/doc/.gitignore b/storage/innobase/xtrabackup/doc/.gitignore new file mode 100644 index 000000000000..61b55b2800cb --- /dev/null +++ b/storage/innobase/xtrabackup/doc/.gitignore @@ -0,0 +1,4 @@ +build/ +source/ext/psdom.pyc +source/percona-theme/ +COMMIT_MESSAGE \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/Makefile b/storage/innobase/xtrabackup/doc/Makefile new file mode 100644 index 000000000000..8e9fbd382f1a --- /dev/null +++ b/storage/innobase/xtrabackup/doc/Makefile @@ -0,0 +1,103 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " offhtml to make standalone HTML files without fetching the new theme files" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + -rm -rf $(BUILDDIR)/* + + + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PerconaServer.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PerconaServer.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/PerconaServer" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PerconaServer" + @echo "# devhelp" + + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: ext + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + diff --git a/storage/innobase/xtrabackup/doc/_resource/.DS_Store b/storage/innobase/xtrabackup/doc/_resource/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c7745a25fb5c3da558b8ab2065b12087dabf1828 GIT binary patch literal 6148 zcmeHK&5qMB5FU41NVG!g0VKr964y#JD$;_uMBU{D2!aEkl8}gv$i`KYZVy$ZJOI4V zKFB@~-`MWLs_b=Dp_$75#^V|Pe2(l65vlnqkBG)Z6reB;LR9|{?&q>618*4tl^vs@ zl5#4j&D%Y1F&rWTe0Cujy2Pn9_}!e}w<4R8eYm9Pgj*5lrXSp~%+l zGOJ96psQ?Im2EejUaP^;aP;6|5Cq4;m*m{6lP>L6?L2KhaqB&1$##00eJG3dV*L2j z)LmNEMPmcXynxH+k7b>k_1vuLytT23>j=UyT#TP>HqmtUa-yTzbUV?TD4M;V=vOBv z+ie&;dH&+fyTy;{qBcKyPxxT*#aemfaRdsI8ig_T*gLdW2P&Ha0EaMJfzG)E$7qkS$KD}&Aj*XT zU8wRYhH~MsYws6(>>avrQa<@merDw}6lG_}_}aRYiXBQV3X>2-3JrxmWNF7U7)07qAmG0f9`E^r~_$AI)z*gc!+?CXIOmGjDfx z-U_`!qY)A9zWS}mMnqb;p?q6dnw^_3>>)D>gyW8PIm#eYKfMi$>h*+iTRDOEA)mkb zujBaFJJxSzmI_b-DnJFO02NqMza0lP&G#k4Lb5A>uTa07KAhn#3IypaOTLfHu4RuEQ&3Z(Y2c_1XeIz^&#CH^bT~2;Po?-j1=c fcKqx`QCDn@^O`sZIvshZ1Nk#xy3nY=e=BeSoa_~s literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/_resource/overrides/404.html b/storage/innobase/xtrabackup/doc/_resource/overrides/404.html new file mode 100644 index 000000000000..3d3717301a99 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/_resource/overrides/404.html @@ -0,0 +1,9 @@ +{#- + This file was automatically generated - do not edit +-#} +{% extends "main.html" %} +{% block content %} +

404 - Not found

+

+We can't find the page you are looking for. Try using the Search or return to homepage .

+{% endblock %} diff --git a/storage/innobase/xtrabackup/doc/_resource/overrides/main.html b/storage/innobase/xtrabackup/doc/_resource/overrides/main.html new file mode 100644 index 000000000000..efbad3fc802c --- /dev/null +++ b/storage/innobase/xtrabackup/doc/_resource/overrides/main.html @@ -0,0 +1,59 @@ +{# +MkDocs template for Netlify builds to customize docs layout +by adding marketing-requested elements +#} + +{# Import the theme's layout. #} +{% extends "base.html" %} + +{%- macro relbar2 () %} +
+
+ +
+
+{%- endmacro %} + + {% block content %} + + + {% if page.edit_url %} + + {% include ".icons/material/pencil.svg" %} + + {% endif %} + + + {% if not "\x3ch1" in page.content %} +

{{ page.title | d(config.site_name, true)}}

+ {% endif %} + + + {{ page.content }} + + {{ relbar2() }} + + + {% if page and page.meta %} + {% if page.meta.git_revision_date_localized or + page.meta.revision_date + %} + {% include "partials/source-file.html" %} + {% endif %} + {% endif %} + {% endblock %} + + diff --git a/storage/innobase/xtrabackup/doc/_resource/overrides/partials/header.html b/storage/innobase/xtrabackup/doc/_resource/overrides/partials/header.html new file mode 100644 index 000000000000..abdeeb03fa1d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/_resource/overrides/partials/header.html @@ -0,0 +1,77 @@ +{#- + This file was automatically generated - do not edit +-#} +
+ +
diff --git a/storage/innobase/xtrabackup/doc/_resource/overrides/partials/nav.html b/storage/innobase/xtrabackup/doc/_resource/overrides/partials/nav.html new file mode 100644 index 000000000000..ac1fceb029ac --- /dev/null +++ b/storage/innobase/xtrabackup/doc/_resource/overrides/partials/nav.html @@ -0,0 +1,36 @@ +{#- + This file was automatically generated - do not edit +-#} +{% set class = "md-nav md-nav--primary" %} +{% if "navigation.tabs" in features %} + {% set class = class ~ " md-nav--lifted" %} +{% endif %} +{% if "toc.integrate" in features %} + {% set class = class ~ " md-nav--integrated" %} +{% endif %} + + diff --git a/storage/innobase/xtrabackup/doc/_resource/templates/styles.scss b/storage/innobase/xtrabackup/doc/_resource/templates/styles.scss new file mode 100644 index 000000000000..23fcf4065e16 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/_resource/templates/styles.scss @@ -0,0 +1,110 @@ +/* Style for PDF created by MkDocs with mkdocs-with-pdf plugin (https://pypi.org/project/mkdocs-with-pdf/) */ +@media print { + html { + font-size: 100%; + font-family: "Noto Sans", sans-serif; + } + + body { + font-family: "Noto Sans", sans-serif; + color: slategrey; + } + + article { + font-family: "Noto Sans", sans-serif; + text-align: justify; + } + + pre, + code, + var, + samp, + kbd, + tt { + font-family: monospace; + font-size: 110%; + } + + pre code, + pre var, + pre samp, + pre kbd, + pre tt { + font-size: 110%; + } +} + +@page { + size: a4 portrait; + margin: 25mm 20mm 25mm 20mm; + counter-increment: page; + white-space: pre; + color: slategrey; + + @top-right { + content: string(chapter); + } + + @bottom-left { + content: string(subtitle); + } + + @bottom-center { + content: counter(page)' of 'counter(pages); + } + + @bottom-right { + } +} + +@page :first { + @top-right { + content: ''; + } + + @bottom-right { + content: ''; + } + + @bottom-left { + content: ''; + } +} + +article { + page-break-before: always; + min-height: 100%; +} + +article { + + h1, + h2, + h3 { + border-bottom: 0px solid #fff; + } + + h1>.pdf-order, + h2>.pdf-order, + h3>.pdf-order { + padding-left: 6px; + padding-right: 0.8rem; + } +} + +article h1, +h2, +h3 { + border-bottom: 0px solid #fff; + color: #e97e03; +} + +.admonition { + font-size: 100%; +} + +.md-typeset .admonition.note, +.md-typeset details.note { + color: slategrey; + border-color: #fff; +} \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/_resource/theme/.DS_Store b/storage/innobase/xtrabackup/doc/_resource/theme/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 + + +{% endmacro %} + +{#### 'Edit this page' and 'Report issue' links #} +{% macro edit_report() %} +{% if page and page.edit_url %} + +{% endif %} +{% endmacro %} + +{#### 'Last updated' (and later, other info such as author, tester) #} +{% macro last_updated() %} +
+
    + {% if page and page.meta.revision_date %} +
  • + {{ config.extra.updated_text }} {{ page.meta.revision_date }} +
  • + {% endif %} +
+
+{% endmacro %} + +{#### Contents of left column navigation bar #} +{% macro sidebar() %} +
+
+ {@ product_logo @} + {@ product_pdf_download @} + {{ version_menu() }} +

Table Of Contents

+ {{ toctree(nav, default_level) }} + {{ relations() }} + {@ product_series @} +
+
+{% endmacro %} + +{### Left nav column previous/next links #} +{% macro relations() %} +{% if page.previous_page %} +

Previous page

+

+ {{ page.previous_page.title|e }} +

+{% endif %} +{% if page.next_page %} +

Next page

+

+ {{ page.next_page.title|e }} +

+{% endif %} +{% endmacro %} + + +{# +Used by toctree() + +MkDocs doesn't allow a section link. Example, in mkdocs.yaml: + +nav: + - SECTION TITLE: + - intro: dir/index.md + - another: dir/section.md + +The toctree will render without a link for 'SECTION TITLE', +as it doesn't have a file. 'SECTION TITLE' is just a cosmetic +label. + +To match Sphinx's behaviour, this macro detects special +section labels as 'TITLE=path' (splitting on the equals sign). +The new nav element would then be: + +nav: + - SECTION TITLE=/dir/: + - intro: dir/index.md + - another: dir/section.md + +This macro will put a link to /dir/ for the toc entry +'SECTION TITLE'. If there is not an index.md file in +the subdir, link to a file with its .html extension. + +nav: + - SECTION TITLE=/dir/myindex.html: + - intro: dir/index.md + - another: dir/section.md + +#} +{%- macro navi(item, class, close) %} +
  • +{%- if item.url %} + {{ item.title }} +{%- else %} + {{ item.title }} +{% endif %} + +{%- if close %} +
  • +{% endif %} +{% endmacro %} + +{# Table of contents for left nav column #} +{% macro toctree(n, level) %} +{% if level <= max_level %} +
      +{% for i in n %} +{{ navi(i, "toctree-l" + level|string) }} +{% if i.children %} +{{ toctree(i.children, level+1) }} +{% endif %} +{% endfor %} +
    +{% endif %} +{% endmacro %} + +{# Inserts script items from mkdocs.yml #} +{%- macro script() %} +{%- for scriptfile in config.extra_javascript %} + +{% endfor %} +{% endmacro %} + +{# Inserts CSS files from mkdocs.yml #} +{%- macro css() %} +{%- for cssfile in config.extra_css %} + +{%- endfor %} +{% endmacro %} + +{%- macro metatags() %} +{# TODO #} +{% endmacro %} + +{% macro version_menu() %} +
    + +
    +{% endmacro %} + +{# Layout for content as hosted by Drupal (no outer html tag) #} +{# NOTE: title and head are ignored by Drupal's container #} +{{ site_name|e }}{% if page_title %} — {{ page_title|striptags|e }}{% endif %} + + + {{ metatags() }} + {{ script() }} + + {% if page.next_page %} + + {% endif %} + {% if page.previous %} + + {% endif %} + + + + {{ css() }} + {{ script() }} +
    +
    +
    + {{ relbar() }} + {{ edit_report() }} +
    +
    + {{ page.content }} +
    +
    + {{ last_updated() }} + {{ relbar() }} +
    + {{ sidebar() }} +
    +
    +
    + \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/docs/.DS_Store b/storage/innobase/xtrabackup/doc/docs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d65717cb50743efd8c5faf35fbc0f41431ebd982 GIT binary patch literal 6148 zcmeHK-EI;=6h2c>7Hbn?YSPP1OuV8IS_&oJAmR(SMlaOhF1w+dE<1!>N+TiRy59H< zK84rnGkEQtui-a8t-FB6c%jD3keP3G&N;Jlz7J*?B4XXCUni;%k%cO-cmvIbBJ85B zl`TE83uJPRltLQ#$sqFhnztD+3>XIfH3r0Qw?utPC?yy5>i5edvD6h)G^{%VJ{rp` z*y}Ir9wXlCc@g(uv2Gn-+--gM_+XQl{|jE@lkD5xVjAp2F8OqZHl_guZa4A>rS4Frzf08-euqQo`%7!U)g=g@SHXQooAQ2 z1AzjHP+e#e(7p^v(aT9zfv$<1ZwPhI@ok+TAftJ9&Jr9vXdL0yQ}X||&W*-V)jnz- z38C8uwW{4XZ2pGMD_Q*{;T0W}M)_8Mp{(uvuz4~J7zPXja{so$gV-lJ8kY*?)`3P| z0f0pe%YweRONba-V@KmsAuK3Ng#uM5(^m|p!ZB`ZzmCSGLKRL-Up|2;BkK3mt46KAcB`U+JP q;kQ&ML(u5sSa!rwyoV|aY_{kCI~tb?F@j?L2uK=CV;K0O415Ew&izyX literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/docs/_static/.DS_Store b/storage/innobase/xtrabackup/doc/docs/_static/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/docs/_static/percona-logo.svg b/storage/innobase/xtrabackup/doc/docs/_static/percona-logo.svg new file mode 100644 index 000000000000..178f62b2d135 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/_static/percona-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/storage/innobase/xtrabackup/percona-xtrabackup-logo.jpg b/storage/innobase/xtrabackup/doc/docs/_static/percona-xtrabackup-logo.jpg similarity index 100% rename from storage/innobase/xtrabackup/percona-xtrabackup-logo.jpg rename to storage/innobase/xtrabackup/doc/docs/_static/percona-xtrabackup-logo.jpg diff --git a/storage/innobase/xtrabackup/doc/docs/_static/percona_favicon.ico b/storage/innobase/xtrabackup/doc/docs/_static/percona_favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f426064d6f505e77365a8980046b58ae465ea6b0 GIT binary patch literal 894 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 literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/docs/advanced/encrypted_innodb_tablespace_backups.md b/storage/innobase/xtrabackup/doc/docs/advanced/encrypted_innodb_tablespace_backups.md new file mode 100644 index 000000000000..662f5432c5d4 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/advanced/encrypted_innodb_tablespace_backups.md @@ -0,0 +1,545 @@ +# Encrypted InnoDB tablespace backups + +InnoDB supports [data encryption for InnoDB tables] +(https://dev.mysql.com/doc/refman/8.0/en/innodb-data-encryption.html) +stored in file-per-table tablespaces. This feature provides an at-rest +encryption for physical tablespace data files. + +For an authenticated user or application to access an encrypted +tablespace, InnoDB uses the master encryption key to decrypt +the tablespace key. The master encryption key is stored in a keyring. +*xtrabackup* supports two keyring plugins: `keyring_file`, and +`keyring_vault`. These plugins are installed into the `plugin` directory. + +## Version Updates + +Percona XtraBackup 8.0.25-17 adds support for the `keyring_file` component, +which is part of the component-based infrastructure MySQL which extends the +server capabilities. The component is stored in the `plugin` directory. + +See +a [comparison of keyring components and keyring plugins](https://dev.mysql.com/doc/refman/8.0/en/keyring-component-plugin-comparison.html) +for more information. + +Percona XtraBackup 8.0.27-19 adds support for the Key Management +Interoperability Protocol (KMIP) which enables the communication between +the key management system and encrypted database server. This feature is +*tech preview* quality. + +Percona XtraBackup 8.0.28-21 adds support for the Amazon Key Management +Service (AWS KMS). AWS KMS is cloud-based encryption and key management +service. The keys and functionality can be used for other AWS services +or your applications that use AWS. No configuration is required to back +up a server with AWS KMS-enabled encryption. This feature is *tech +preview* quality. + +## Use `keyring_file` plugin + +In order to back up and prepare a database containing encrypted InnoDB +tablespaces, specify the path to a keyring file as the value of the +`--keyring-file-data` option. + +``` +$ xtrabackup --backup --target-dir=/data/backup/ --user=root \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +After *xtrabackup* takes the backup, the following +message confirms the action: + +``` +xtrabackup: Transaction log of lsn (5696709) to (5696718) was copied. +160401 10:25:51 completed OK! +``` + +**WARNING**: *xtrabackup* does not copy the keyring file into the backup +directory. To prepare the backup, you must copy the keyring file manually. + +### Prepare the backup with the `keyring_file` plugin + +To prepare the backup specify the keyring-file-data. + +``` +$ xtrabackup --prepare --target-dir=/data/backup \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +After *xtrabackup* takes the backup, the following message confirms +the action: + +``` +InnoDB: Shutdown completed; log sequence number 5697064 +160401 10:34:28 completed OK! +``` + +The backup is now prepared and can be restored with the `--copy-back` +option. In case the keyring has been rotated, you must restore the +keyring used when the backup was taken and prepared. + +## Use `keyring_vault` plugin + +Keyring vault plugin settings are +described [here](https://www.percona. +com/doc/percona-server/LATEST/security/using-keyring-plugin.html#using-keyring-plugin). + +### Create a backup with the `keyring_vault` plugin + +The following command creates a backup in the `/data/backup` directory: + +``` +$ xtrabackup --backup --target-dir=/data/backup --user=root +``` + +After *xtrabackup* completes the action, the following confirmation message +appears: + +``` +xtrabackup: Transaction log of lsn (5696709) to (5696718) was copied. +160401 10:25:51 completed OK! +``` + +### Prepare the backup with the `keyring_vault` plugin + +To prepare the backup, *xtrabackup* must access the keyring. +*xtrabackup* does not communicate with the *MySQL* server or read the +default `my.cnf` configuration file. Specify the keyring settings in the +command line: + +``` +$ xtrabackup --prepare --target-dir=/data/backup \ +--keyring-vault-config=/etc/vault.cnf +``` + +**NOTE**: Please +look [using the keyring vault plugin](https://www.percona.com/doc/percona-server/LATEST/security/using-keyring-plugin.html#using-keyring-plugin) +for a description of keyring vault plugin settings. + +After *xtrabackup* completes the action, the following confirmation message +appears: + +``` +InnoDB: Shutdown completed; log sequence number 5697064 +160401 10:34:28 completed OK! +``` + +The backup is now prepared and can be restored with the `--copy-back` +option: + +``` +$ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql +``` + +## Use the `keyring_file` component + +A component is not loaded with the `--early_plugin_load` option. The +server uses a manifest to load the component and the component has its +own configuration file. See the [MySQL documentation on the component +installation](https://dev.mysql.com/doc/refman/8.0/en/keyring-component-installation.html) for more +information. + +An example of a manifest and a configuration file follows: + +An example of `./bin/mysqld.my`: + +``` +{ + "components": "file://component_keyring_file" +} +``` + +An example of `/lib/plugin/component_keyring_file.cnf`: + +``` +{ + "path": "/var/lib/mysql-keyring/keyring_file", "read_only": false +} +``` + +For more information, +see [Keyring Component Installation](https://dev.mysql.com/doc/refman/8.0/en/keyring-component-installation.html) +and [Using the keyring_file File-Based Keyring Plugin](https://dev.mysql.com/doc/refman/8.0/en/keyring-file-plugin.html). + +With the appropriate privilege, you can `SELECT` on +the [performance_schema.keyring_component_status table](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-keyring-component-status-table.html) +to view the attributes and status of the installed keyring component +when in use. + +The component has no special requirements for backing up a database that +contains encrypted InnoDB tablespaces. + +``` +xtrabackup --backup --target-dir=/data/backup --user=root +``` + +After *xtrabackup* completes the action, the following confirmation message +appears: + +``` +xtrabackup: Transaction log of lsn (5696709) to (5696718) was copied. +160401 10:25:51 completed OK! +``` + +**WARNING**: *xtrabackup* does not copy the keyring file into the backup +directory. To prepare the backup, you must copy the keyring file manually. + +### Prepare the backup with the `keyring_file` component + +*xtrabackup* reads the keyring_file component configuration +from `xtrabackup_component_keyring_file.cnf`. You must specify the +keyring_file data path if the `keyring-file-data` is not located in the +attribute `PATH` from the xtrabackup_component_keyring_file.cnf. + +The following is an example of adding the location for the +keyring-file-data: + +``` +xtrabackup --prepare --target-dir=/data/backup \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +**NOTE**: *xtrabackup* attempts to +read `xtrabackup_component_keyring_file.cnf`. You can assign another +keyring file component configuration by passing +the `--component-keyring-file-config` option. + +After *xtrabackup* completes preparing the backup, the following +confirmation message appears: + +``` +InnoDB: Shutdown completed; log sequence number 5697064 +160401 10:34:28 completed OK! +``` + +The backup is prepared. To restore the backup use the `--copy-back` option. +If the keyring has been rotated, you must restore the specific keyring used +to take and prepare the backup. + +## Incremental encrypted InnoDB tablespace backups with `keyring_file` + +The process of taking incremental backups with InnoDB tablespace encryption +is +similar to taking the Incremental Backups with unencrypted tablespace. + +**NOTE**: The `keyring-file` component should not used in production or for +regulatory compliance. + +## Create an incremental backup + +To make an incremental backup, begin with a full backup. The *xtrabackup* +binary +writes a file called `xtrabackup_checkpoints` into the backup’s target +directory. This file contains a line showing the `to_lsn`, which is the +database’s LSN at the end of the backup. First you need to create a full +backup with the following command: + +``` +$ xtrabackup --backup --target-dir=/data/backups/base \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +**WARNING**: *xtrabackup* will not copy the keyring file into the backup +directory. In order to +prepare the backup, you must make a copy of the keyring file yourself. If +you +try to restore the backup after the keyring has been changed you’ll see +errors +like `ERROR 3185 (HY000): Can't find master key from keyring, please check +keyring plugin is loaded.` when trying to access an encrypted table. + +If you look at the `xtrabackup_checkpoints` file, you should see +contents similar to the following: + +``` +backup_type = full-backuped +from_lsn = 0 +to_lsn = 7666625 +last_lsn = 7666634 +compact = 0 +recover_binlog_info = 1 +``` + +Now that you have a full backup, you can make an incremental backup based +on it. Use a command such as the following: + +``` +$ xtrabackup --backup --target-dir=/data/backups/inc1 \ +--incremental-basedir=/data/backups/base \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +**WARNING**: *xtrabackup* does not copy the keyring file into the backup +directory. To prepare the backup, you must copy the keyring file manually. + +If the +keyring has not been rotated you can use the same as the one you’ve +backed-up +with the base backup. If the keyring has been rotated, or you have +upgraded the plugin to a component, you must back up the keyring file. +Otherwise, you cannot prepare the backup. + +The `/data/backups/inc1/` directory should now contain delta files, such +as `ibdata1.delta` and `test/table1.ibd.delta`. These represent the +changes since the `LSN 7666625`. If you examine the +`xtrabackup_checkpoints` file in this directory, you should see +something similar to the following: + +``` +backup_type = incremental +from_lsn = 7666625 +to_lsn = 8873920 +last_lsn = 8873929 +compact = 0 +recover_binlog_info = 1 +``` + +Use this directory as the base for yet another incremental backup: + +``` +$ xtrabackup --backup --target-dir=/data/backups/inc2 \ +--incremental-basedir=/data/backups/inc1 \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +### Prepare incremental backups + +The `--prepare` step for incremental backups is not the same as for +normal backups. In normal backups, two types of operations are performed to +make +the database consistent: committed transactions are replayed from the log +file +against the data files, and uncommitted transactions are rolled back. You +must +skip the rollback of uncommitted transactions when preparing a backup, +because +transactions that were uncommitted at the time of your backup may be in +progress, and it’s likely that they will be committed in the next +incremental +backup. You should use the `--apply-log-only` option to prevent the +rollback phase. + +**WARNING**: If you do not use the `--apply-log-only` option to prevent the +rollback phase, then your incremental backups are useless. After +transactions have been rolled back, further incremental backups cannot be +applied. + +Beginning with the full backup you created, you can prepare it and then +apply +the incremental differences to it. Recall that you have the following +backups: + +``` +/data/backups/base +/data/backups/inc1 +/data/backups/inc2 +``` + +To prepare the base backup, you need to run `--prepare` as usual, but +prevent the rollback phase: + +``` +$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +The output should end with some text such as the following: + +``` +InnoDB: Shutdown completed; log sequence number 7666643 +InnoDB: Number of pools: 1 +160401 12:31:11 completed OK! +``` + +To apply the first incremental backup to the full backup, you should use +the +following command: + +``` +$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \ +--incremental-dir=/data/backups/inc1 \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +**WARNING**: The backup should be prepared with the keyring file and type +that was used when backup was being +taken. This means that if the keyring has been rotated, or you have +upgraded +from a plugin to a component between the base and +incremental backup that you must use the keyring that was in use when +the first incremental backup has been taken. + +Preparing the second incremental backup is a similar process: apply the +deltas +to the (modified) base backup, and you will roll its data forward in +time to the point of the second incremental backup: + +``` +$ xtrabackup --prepare --target-dir=/data/backups/base \ +--incremental-dir=/data/backups/inc2 \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +**NOTE**: `--apply-log-only` should be used when merging all +incremental backups except the last one. That’s why the previous line +does not +contain +the `--apply-log-only` option. Even if the `--apply-log-only` +was used on the last step, backup would still be consistent but in that +case +server would perform the rollback phase. + +The backup is now prepared and can be restored with `--copy-back` option. +In +case the keyring has been rotated you’ll need to restore the keyring which +was +used to take and prepare the backup. + +## Use the Key Management Interoperability Protocol (KMIP) + +This feature is *tech preview* quality. + +Percona XtraBackup 8.0.27-19 adds support for the Key Management +Interoperability Protocol (KMIP) which enables the communication between +the key management system and encrypted database server. + +Percona XtraBackup has no special requirements for backing up a database +that contains encrypted InnoDB tablespaces. + +Percona XtraBackup performs the following actions: + +1. Connects to the MySQL server + +2. Pulls the configuration + +3. Connects to the KMIP server + +4. Fetches the necessary keys from the KMIP server + +5. Stores the KMIP server configuration settings in the + `xtrabackup_component_keyring_kmip.cnf` file in the backup directory + +When preparing the backup, Percona XtraBackup connects to the KMIP server +with the settings from the `xtrabackup_component_keyring_kmip.cnf` file. + +## Restore a backup when the keyring is not available + +While the described restore method works, this method requires access to +the same +keyring that the server is using. It may not be possible if the backup is +prepared +on a different server or at a much later time, when keys in the keyring are +purged, or, in the case of a malfunction, when the keyring vault server is +not +available at all. + +The `--transition-key=` option should be used to make it +possible +for *xtrabackup* to process the backup without access to the keyring vault +server. In this case, *xtrabackup* derives the AES encryption key from the +specified passphrase and will use it to encrypt tablespace keys of +tablespaces +that are being backed up. + +### Create a backup with a passphrase + +The following example illustrates how the backup can be created in this +case: + +``` +$ xtrabackup --backup --user=root -p --target-dir=/data/backup \ +--transition-key=MySecetKey +``` + +If `--transition-key` is specified without a value, *xtrabackup* will ask +for +it. + +**NOTE**: *xtrabackup* scrapes `--transition-key` so that its value is not +visible in +the `ps` command output. + +### Prepare a backup with a passphrase + +The same passphrase should be specified for the prepare command: + +``` +$ xtrabackup --backup --target-dir=/data/backup \ +--transition-key=MySecretKey +``` + +There are no `--keyring-vault...`,\`\`–keyring-file…\`\`, +or `--component-keyring-file-config` options here, +because *xtrabackup* does not talk to the keyring in this case. + +### Restore a backup with a generated key + +When restoring a backup you will need to generate a new master key. Here is +the +example for `keyring_file` plugin or component: + +``` +$ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \ +--transition-key=MySecetKey --generate-new-master-key \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +In case of `keyring_vault`, it will look like this: + +``` +$ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \ +--transition-key=MySecetKey --generate-new-master-key \ +--keyring-vault-config=/etc/vault.cnf +``` + +*xtrabackup* will generate a new master key, store it in the target keyring +vault server and re-encrypt the tablespace keys using this key. + +### Make a backup with a stored transition key + +Finally, there is an option to store a transition key in the keyring. In +this case, +*xtrabackup* will need to access the same keyring file or vault server +during +prepare and copy-back but does not depend on whether the server keys have +been +purged. + +In this scenario, the three stages of the backup process look as follows. + +* Backup + + ``` + $ xtrabackup --backup --user=root -p --target-dir=/data/backup \ + --generate-transition-key + ``` + +* Prepare + + - `keyring_file` variant: + + ``` + $ xtrabackup --prepare --target-dir=/data/backup \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + ``` + + - `keyring_vault` variant: + + ``` + $ xtrabackup --prepare --target-dir=/data/backup \ + --keyring-vault-config=/etc/vault.cnf + ``` + +* Copy-back + + - `keyring_file` variant: + + ``` + $ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \ + --generate-new-master-key --keyring-file-data=/var/lib/mysql-keyring/keyring + ``` + + - `keyring_vault` variant: + + ``` + $ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \ + --generate-new-master-key --keyring-vault-config=/etc/vault.cnf + ``` diff --git a/storage/innobase/xtrabackup/doc/docs/advanced/locks.md b/storage/innobase/xtrabackup/doc/docs/advanced/locks.md new file mode 100644 index 000000000000..d97087aa0e8b --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/advanced/locks.md @@ -0,0 +1,71 @@ +# `lock-ddl-per-table` option improvements + +To block DDL statements on an instance, Percona Server implemented LOCK +TABLES FOR BACKUP. *Percona XtraBackup* uses this lock for the +duration of the backup. This lock does not affect DML statements. + +*Percona XtraBackup* has also implemented `--lock-ddl-per-table`, which +blocks DDL statements by using metadata locks (MDL). + +The following procedures describe a simplified backup operation when using +`--lock-ddl-per-table`: + +1. Parse and copy all redo logs after the checkpoint mark + +2. Fork a dedicated thread to continue following new redo log entries + +3. List the tablespaces required to copy + +4. Iterate through the list. The following steps occur with each listed + tablespace: + +> a. Query INFORMATION_SCHEMA.INNODB_TABLES to find which tables belong +> to the tablespace ID and take an MDL on the underlying table or tables in +> case there is a shared tablespace. + +> Copy the tablespace `.ibd` files. + +The backup process may encounter a redo log event, generated by the bulk +load +operations, which notifies backup tools that data file changes have been +omitted from the redo log. This event is an `MLOG_INDEX_LOAD`. If this +event is found by the redo follow thread, the backup continues and assumes +the backup is safe because the MDL protects tablespaces already copied and +the MLOG_INDEX_LOAD event is for a tablespace that is not copied. + +These assumptions may not be correct and may lead to inconsistent backups. + +## `--lock-ddl-per-table` redesign + +Implemented in *Percona XtraBackup* version 8.0.22-15.0, the +`--lock-ddl-per-table` has been redesigned to minimize inconsistent +backups. +The following procedure reorders the steps: + +* The MDL lock acquired at the beginning of the backup + +* Scan the redo logs. An `MLOG_INDEX_LOAD` event may be recorded if + a `CREATE INDEX` statement has occurred before the backup starts. At this + time, the backup process is safe and can parse and accept the event. + +* After the first scan has completed, the follow redo log thread is + initiated. This thread stops the backup process if an `MLOG_INDEX_LOAD` + event is found. + +* Gather the tablespace list to copy + +* Copy the `.ibd` files. + +## Other Improvements + +The following improvements have been added: + +* If the `.ibd` file belongs to a temporary table, the `SELECT` query is + skipped. + +* For a FullText Index, an MDL is acquired on the base table. + +* A `SELECT` query that acquires an MDL does not retrieve any data. + +**WARNING**: The `lock-ddl-per-table` variable is deprecated in *Percona +Server for MySQL* 8.0. Use `--lock-ddl` instead of this variable. diff --git a/storage/innobase/xtrabackup/doc/docs/advanced/log_enhancements.md b/storage/innobase/xtrabackup/doc/docs/advanced/log_enhancements.md new file mode 100644 index 000000000000..052bbba32e24 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/advanced/log_enhancements.md @@ -0,0 +1,85 @@ +# Improved Log statements + +**Percona XtraBackup** is an open-source command-line utility. Command-line +tools have limited interaction with the background operations and the logs +provide the progress of an operation or more information about errors. + +In earlier versions, the error logs did not have a standard structure. +Notice in the following examples the variance in the log statements: + +* The backup log statement header has the name of the module, `xtrabackup`, + which generated the statement but no timestamp: + +``` + xtrabackup: recognized client arguments: --parallel=4 --target-dir=/data/backups/ --backup=1 + +./bin/xtrabackup version 8.0.27-19 based on MySQL server 8.0.27 Linux (x86_64) (revision id: b0f75188ca3) +``` + +* The copy-back log statement has a timestamp but no module name. The + timestamp is a mix of UTC and the local timezone. + +``` +220322 19:05:13 [01] Copying undo_001 to /data/backups/undo_001 +``` + +* The following prepare log statements do not have header information, + which makes diagnosing an issue more difficult. + +``` +Completed space ID check of 1008 files. +Initializing buffer pool, total size = 128.000000M, instances = 1, chunk size =128.000000M +Completed initialization of buffer pool +If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority(). +``` + +## Log statement structure + +Starting in **Percona XtraBackup** 8.0.28-20, changes have been made to +improve the log statements. The improved log structure is displayed in the +backup, prepare, move-back/copy-back error logs. + +Each log statement has the following attributes: + +* **Timestamp** - a timestamp for when the event occurred in a UTC format. + + +* **Severity** - the severity level of a statement indicates the importance + of an event. + + +* **ID** - this identifier is currently not used but may be used in future + versions. + + +* **Context** - the name of the module that issued the log statement, such + as **XtraBackup**, **InnoDB**, or **Server**. + + +* **Message** - a description of the event generated by the module. + +An example of a `prepare` log that is generated with the improved structure. +The +uniformity of the headers makes it easier to follow an operation’s progress +or review the log to diagnose issues. + +``` +2022-03-22T19:15:36.142247+05:30 0 [Note] [MY-011825] [Xtrabackup] This target seems to be not prepared yet. +2022-03-22T19:15:36.142792+05:30 0 [Note] [MY-013251] [InnoDB] Number of pools: 1 +2022-03-22T19:15:36.149212+05:30 0 [Note] [MY-011825] [Xtrabackup] xtrabackup_logfile detected: size=8388608, start_lsn=(33311656) +2022-03-22T19:15:36.149998+05:30 0 [Note] [MY-011825] [Xtrabackup] using the following InnoDB configuration for recovery: +2022-03-22T19:15:36.150023+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_data_home_dir = . +2022-03-22T19:15:36.150036+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_data_file_path = ibdata1:12M:autoextend +2022-03-22T19:15:36.150078+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_group_home_dir = . +2022-03-22T19:15:36.150095+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_files_in_group = 1 +2022-03-22T19:15:36.150111+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_file_size = 8388608 +2022-03-22T19:15:36.151667+05:30 0 [Note] [MY-011825] [Xtrabackup] inititialize_service_handles suceeded +2022-03-22T19:15:36.151903+05:30 0 [Note] [MY-011825] [Xtrabackup] using the following InnoDB configuration for recovery: +2022-03-22T19:15:36.151926+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_data_home_dir = . +2022-03-22T19:15:36.151954+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_data_file_path = ibdata1:12M:autoextend +2022-03-22T19:15:36.151976+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_group_home_dir = . +2022-03-22T19:15:36.151991+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_files_in_group = 1 +2022-03-22T19:15:36.152004+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_file_size = 8388608 +2022-03-22T19:15:36.152021+05:30 0 [Note] [MY-011825] [Xtrabackup] Starting InnoDB instance for recovery. +2022-03-22T19:15:36.152035+05:30 0 [Note] [MY-011825] [Xtrabackup] Using 104857600 bytes for buffer pool (set by --use-memory parameter) +``` diff --git a/storage/innobase/xtrabackup/doc/docs/advanced/page_tracking.md b/storage/innobase/xtrabackup/doc/docs/advanced/page_tracking.md new file mode 100644 index 000000000000..ddd0b3b24ce1 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/advanced/page_tracking.md @@ -0,0 +1,141 @@ +# Incremental backup using page tracking + +This feature is *tech preview* quality. + +Percona XtraBackup 8.0.27 adds support for the page tracking functionality +for [incremental backup](https://www.percona.com/doc/percona-xtrabackup/8.0/backup_scenarios/incremental_backup.html). + +To create an incremental backup with page tracking, Percona XtraBackup uses +the MySQL mysqlbackup component. This component provides a list of pages +modified since the last backup, and Percona XtraBackup copies only those +pages. This operation removes the need to scan the pages in the +database. If the majority of pages have not been modified, the page +tracking feature can improve the speed of incremental backups. + +## Install the component + +To start using the page tracking functionality, do the following steps: + +1. Install the mysqlbackup component and enable it on the server: + +> ``` +> $ INSTALL COMPONENT "file://component_mysqlbackup"; +> ``` + +1. Check whether the mysqlbackup component is installed successfully: + +> ``` +> SELECT COUNT(1) FROM mysql.component WHERE component_urn='file://component_mysqlbackup'; +> ``` + +## Using page tracking + +You can enable the page tracking functionality for the full and incremental +backups with the `--page-tracking` option. + +The option has the following benefits: + +* Resets page tracking to the start of the backup. This reset allows the + next incremental backup to use page tracking. + + +* Allows the use of page tracking for an incremental backup if the page + tracking data is available from the backup’s start checkpoint LSN. + +> **NOTE**: Percona XtraBackup processes a list of all the tracked pages in +> memory. If Percona XtraBackup does not have enough available memory to +> process this list, Percona XtraBackup throws an +> error and exits. For example, if an incremental backup uses 200GB, Percona +> XtraBackup can additionally use about 100MB of memory to store the page +> tracking data. + +An example of creating a full backup using the `--page-tracking` option. + +> ``` +> $> xtrabackup --backup --target-dir=$FULL_BACK --page-tracking +> ``` + +An example of creating an incremental backup using the `--page-tracking` +option. + +> ``` +> $> xtrabackup --backup --target-dir=$INC_BACKUP +> --incremental-basedir=$FULL_BACKUP --page-tracking +> ``` + +After enabling the functionality, the next incremental backup finds changed +pages using page tracking. + +**NOTE**: For the very first full backup using page tracking, Percona +XtraBackup may have a delay. The following is an example of the message you +can receive: + +``` +xtrabackup: pagetracking: Sleeping for 1 second, waiting for checkpoint lsn 17852922 / +to reach to page tracking start lsn 21353759 +``` + +You can avoid this delay by enabling page tracking before creating the +first backup. Thus, you ensure that page tracking log sequence number (LSN) +is more than the checkpoint LSN of the server. + +## Start page tracking manually + +After the mysqlbackup component is loaded and active on the server, you can +start page tracking manually with the following option: + +> ``` +> $ SELECT mysqlbackup_page_track_set(true); +> ``` + +## Check the LSN value + +Check the LSN value starting from which changed pages are tracked with the +following option: + +> ``` +> $ SELECT mysqlbackup_page_track_get_start_lsn(); +> ``` + +## Stop page tracking + +To stop page tracking, use the following command: + +> ``` +> $ SELECT mysqlbackup_page_track_set(false); +> ``` + +## Purge page tracking data + +When you start page tracking, it creates a file under the server’s datadir +to collect data about changed pages. This file grows until you stop the +page tracking. If you stop the server and then restart it, page tracking +creates a new file but also keeps the old one. The old file continues to +grow until you stop the page tracking explicitly. + +If you purge the page tracking data, you should create a full backup +afterward. To purge the page tracking data, do the following steps: + +> ``` +> $ SELECT mysqlbackup_page_track_set(false); +> $ SELECT mysqlbackup_page_track_purge_up_to(9223372036854775807); +> /* Specify the LSN up to which you want to purge page tracking data. / +> 9223372036854775807 is the highest possible LSN which purges all page tracking files.*/ +> $ SELECT mysqlbackup_page_track_set(true); +> ``` + +## Known issue + +If the index is built in place using an exclusive algorithm and then is +added to a table after the last LSN checkpoint, you may get a bad +incremental backup using page tracking. Find more details +in [PS-8032](https://jira.percona.com/browse/PS-8032) . + +## Uninstall the mysqlbackup component + +If you need to uninstall the mysqlbackup component, use the following +option: + +> ``` +> $ UNINSTALL COMPONENT "file://component_mysqlbackup" +> ``` diff --git a/storage/innobase/xtrabackup/doc/docs/advanced/throttling_backups.md b/storage/innobase/xtrabackup/doc/docs/advanced/throttling_backups.md new file mode 100644 index 000000000000..cc4185da9611 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/advanced/throttling_backups.md @@ -0,0 +1,28 @@ +# Throttling Backups + +Although *xtrabackup* does not block your database’s operation, any backup +can add load to the system being backed up. On systems that do not have +much +spare I/O capacity, it might be helpful to throttle the rate at which +*xtrabackup* reads and writes data. You can do this with the +`--throttle` option. This option limits the number of chunks copied per +second. The chunk ++size is *10 MB*. + +The image below shows how throttling works when `--throttle` is +set to `1`. + +![how throttling works](../_static/throttle.png) + +When specified with the `--backup` option, this option +limits the number of pairs of read-and-write operations per second that +*xtrabackup* will perform. If you are creating an incremental backup, then +the +limit is the number of read I/O operations per second. + +By default, there is no throttling, and *xtrabackup* reads and writes data +as +quickly as it can. If you set too strict of a limit on the IOPS, the +backup might be so slow that it will never catch up with the transaction +logs +that InnoDB is writing, so the backup might never complete. diff --git a/storage/innobase/xtrabackup/doc/docs/backup_scenarios/compressed_backup.md b/storage/innobase/xtrabackup/doc/docs/backup_scenarios/compressed_backup.md new file mode 100644 index 000000000000..305c7a8e7299 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/backup_scenarios/compressed_backup.md @@ -0,0 +1,120 @@ +# Compressed Backup + +*Percona XtraBackup* supports compressed backups. A local or streaming +backup +can be compressed or decompressed with *xbstream*. + +## Creating Compressed Backups + +In order to make a compressed backup you’ll need to use the `--compress` +option: + +``` +$ xtrabackup --backup --compress --target-dir=/data/compressed/ +``` + +The `--compress` uses the `qpress` tool that you can install via +the `percona-release` package configuration tool as follows: + +``` +$ sudo percona-release enable tools +$ sudo apt update +$ sudo apt install qpress +``` + +**NOTE**: Enable the +repository: `percona-release enable-only tools release` + +If *Percona XtraBackup* is intended to be used in combination with +the upstream MySQL Server, you only need to enable the `tools` +repository: `percona-release enable-only tools`. + +If you want to speed up the compression you can use the parallel +compression, +which can be enabled with `--compress-threads` option. +Following example will use four threads for compression: + +``` +$ xtrabackup --backup --compress --compress-threads=4 \ +--target-dir=/data/compressed/ +``` + +Output should look like this + +``` +... +170223 13:00:38 [01] Compressing ./test/sbtest1.frm to /tmp/compressed/test/sbtest1.frm.qp +170223 13:00:38 [01] ...done +170223 13:00:38 [01] Compressing ./test/sbtest2.frm to /tmp/compressed/test/sbtest2.frm.qp +170223 13:00:38 [01] ...done +... +170223 13:00:39 [00] Compressing xtrabackup_info +170223 13:00:39 [00] ...done +xtrabackup: Transaction log of lsn (9291934) to (9291934) was copied. +170223 13:00:39 completed OK! +``` + +### Preparing the backup + +Before you can prepare the backup you’ll need to uncompress all the files. +*Percona XtraBackup* has implemented `--decompress` option +that can be used to decompress the backup. + +``` +$ xtrabackup --decompress --target-dir=/data/compressed/ +``` + +**NOTE**: `--parallel` can be used with +`--decompress` option to decompress multiple files +simultaneously. + +*Percona XtraBackup* does not automatically remove the compressed files. In +order to clean up the backup directory you should use +`--remove-original` option. Even if they’re not removed +these files will not be copied/moved over to the datadir if +`--copy-back` or `--move-back` are used. + +When the files are uncompressed you can prepare the backup with the +`--prepare` option: + +``` +$ xtrabackup --prepare --target-dir=/data/compressed/ +``` + +You should check for a confirmation message: + +``` +InnoDB: Starting shutdown... +InnoDB: Shutdown completed; log sequence number 9293846 +170223 13:39:31 completed OK! +``` + +Now the files in `/data/compressed/` are ready to be used by the server. + +### Restoring the backup + +*xtrabackup* has a `--copy-back` option, which performs the +restoration of a backup to the server’s datadir: + +``` +$ xtrabackup --copy-back --target-dir=/data/backups/ +``` + +It will copy all the data-related files back to the server’s datadir, +determined by the server’s `my.cnf` configuration file. You should check +the last line of the output for a success message: + +``` +170223 13:49:13 completed OK! +``` + +You should check the file permissions after copying the data back. You may +need +to adjust them with something like: + +``` +$ chown -R mysql:mysql /var/lib/mysql +``` + +Now that the datadir contains the restored data. You are ready to start +the server. diff --git a/storage/innobase/xtrabackup/doc/docs/backup_scenarios/full_backup.md b/storage/innobase/xtrabackup/doc/docs/backup_scenarios/full_backup.md new file mode 100644 index 000000000000..3ff75e86375c --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/backup_scenarios/full_backup.md @@ -0,0 +1,219 @@ +# The Backup Cycle - Full Backups + +## Creating a backup + +To create a backup, run **xtrabackup** with the `--backup` +option. You also need to specify the `--target-dir` option, which is where +the backup will be stored, if the *InnoDB* data or log files are not stored +in +the same directory, you might need to specify the location of those, too. +If the +target directory does not exist, *xtrabackup* creates it. If the directory +does +exist and is empty, *xtrabackup* will succeed. + +*xtrabackup* will not overwrite existing files, it will fail with operating +system error 17, `file exists`. + +To start the backup process run: + +``` +$ xtrabackup --backup --target-dir=/data/backups/ +``` + +This will store the backup at `/data/backups/`. If you specify a +relative path, the target directory will be relative to the current +directory. + +During the backup process, you should see a lot of output showing the data +files being copied, as well as the log file thread repeatedly scanning the +log +files and copying from it. Here is an example that shows the log thread +scanning the log in the background, and a file copying thread working on +the +`ibdata1` file: + +``` +160906 10:19:17 Finished backing up non-InnoDB tables and files +160906 10:19:17 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS... +xtrabackup: The latest check point (for incremental): '62988944' +xtrabackup: Stopping log copying thread. +.160906 10:19:18 >> log scanned up to (137343534) +160906 10:19:18 Executing UNLOCK TABLES +160906 10:19:18 All tables unlocked +160906 10:19:18 Backup created in directory '/data/backups/' +160906 10:19:18 [00] Writing backup-my.cnf +160906 10:19:18 [00] ...done +160906 10:19:18 [00] Writing xtrabackup_info +160906 10:19:18 [00] ...done +xtrabackup: Transaction log of lsn (26970807) to (137343534) was copied. +160906 10:19:18 completed OK! +``` + +The last thing you should see is something like the following, where the +value +of the `` will be a number that depends on your system: + +``` +$ xtrabackup: Transaction log of lsn () to () was copied. +``` + +**NOTE**: Log copying thread checks the transactional log every second to +see if there +were any new log records written that need to be copied, but there is a +chance that the log copying thread might not be able to keep up with the +amount of writes that go to the transactional logs, and will hit an error +when the log records are overwritten before they could be read. + +After the backup is finished, the target directory will contain files such +as +the following, assuming you have a single InnoDB table `test.tbl1` and you +are using MySQL’s innodb_file_per_table option: + +``` +$ ls -lh /data/backups/ +total 182M +drwx------ 7 root root 4.0K Sep 6 10:19 . +drwxrwxrwt 11 root root 4.0K Sep 6 11:05 .. +-rw-r----- 1 root root 387 Sep 6 10:19 backup-my.cnf +-rw-r----- 1 root root 76M Sep 6 10:19 ibdata1 +drwx------ 2 root root 4.0K Sep 6 10:19 mysql +drwx------ 2 root root 4.0K Sep 6 10:19 performance_schema +drwx------ 2 root root 4.0K Sep 6 10:19 sbtest +drwx------ 2 root root 4.0K Sep 6 10:19 test +drwx------ 2 root root 4.0K Sep 6 10:19 world2 +-rw-r----- 1 root root 116 Sep 6 10:19 xtrabackup_checkpoints +-rw-r----- 1 root root 433 Sep 6 10:19 xtrabackup_info +-rw-r----- 1 root root 106M Sep 6 10:19 xtrabackup_logfile +``` + +The backup can take a long time, depending on how large the database is. It +is +safe to cancel at any time, because *xtrabackup* does not modify the +database. + +The next step is getting your backup ready to be restored. + +## Preparing a backup + +After making a backup with the `--backup` option, you need to +prepare it in order to restore it. Data files are not point-in-time +consistent +until they are *prepared*, because they were copied at different times as +the +program ran, and they might have been changed while this was happening. + +If you try to start InnoDB with these data files, it will detect corruption +and +stop working to avoid running on damaged data. The `--prepare` step +makes the files perfectly consistent at a single instant in time, so you +can run +*InnoDB* on them. + +You can run the *prepare* operation on any machine; it does not need to be +on the +originating server or the server to which you intend to restore. You can +copy +the backup to a utility server and prepare it there. + +Note that *Percona XtraBackup* 8.0 can only prepare backups of *MySQL* +8.0, *Percona Server for MySQL* 8.0, and *Percona XtraDB Cluster* 8.0 +databases. Releases prior to 8.0 are not supported. + +During the *prepare* operation, *xtrabackup* boots up a kind of modified +embedded InnoDB (the libraries *xtrabackup* was linked against). The +modifications are necessary to disable InnoDB standard safety checks, such +as +complaining about the log file not being the right size. This warning is +not +appropriate for working with backups. These modifications are only for the +xtrabackup binary; you do not need a modified *InnoDB* to use *xtrabackup* +for +your backups. + +The *prepare* step uses this “embedded InnoDB” to perform crash recovery on +the +copied data files, using the copied log file. The `prepare` step is very +simple to use: you simply run *xtrabackup* with the `--prepare` option +and tell it which directory to prepare, for example, to prepare the +previously +taken backup run: + +``` +$ xtrabackup --prepare --target-dir=/data/backups/ +``` + +When this finishes, you should see an `InnoDB shutdown` with a message such +as the following, where again the value of LSN will depend on your +system: + +``` +InnoDB: Shutdown completed; log sequence number 137345046 +160906 11:21:01 completed OK! +``` + +All following prepares will not change the already prepared data files, +you’ll +see that output says: + +``` +xtrabackup: This target seems to be already prepared. +xtrabackup: notice: xtrabackup_logfile was already used to '--prepare'. +``` + +It is not recommended to interrupt xtrabackup process while preparing +backup +because it may cause data files corruption and backup will become unusable. +Backup validity is not guaranteed if prepare process was interrupted. + +**NOTE**: If you intend the backup to be the basis for further incremental +backups, you +should use the `--apply-log-only` option when preparing +the backup, or you will not be able to apply incremental backups to it. See +the documentation on preparing incremental backups for more details. + +## Restoring a Backup + +**WARNING**: Backup needs to be prepared before it can be +restored. + +For convenience, *xtrabackup* binary has the `--copy-back` +option to copy the backup to the datadir of the server: + +``` +$ xtrabackup --copy-back --target-dir=/data/backups/ +``` + +If you don’t want to save your backup, you can use the +`--move-back` option which will move the backed up data to +the datadir. + +If you don’t want to use any of the above options, you can additionally use +**rsync** or **cp** to restore the files. + +**NOTE**: The datadir must be empty before restoring the backup. Also, it’s +important to note that MySQL server needs to be shut down before restore is +performed. You cannot restore to a datadir of a running mysqld instance +(except when importing a partial backup). + +Example of the **rsync** command that can be used to restore the backup +can look like this: + +``` +$ rsync -avrP /data/backup/ /var/lib/mysql/ +``` + +You should check that the restored files have the correct ownership and +permissions. + +As files’ attributes will be preserved, in most cases you will need to +change +the files’ ownership to `mysql` before starting the database server, as +they +will be owned by the user who created the backup: + +``` +$ chown -R mysql:mysql /var/lib/mysql +``` + +Data is now restored, and you can start the server. diff --git a/storage/innobase/xtrabackup/doc/docs/backup_scenarios/incremental_backup.md b/storage/innobase/xtrabackup/doc/docs/backup_scenarios/incremental_backup.md new file mode 100644 index 000000000000..29931fd148c1 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/backup_scenarios/incremental_backup.md @@ -0,0 +1,242 @@ +# Incremental Backup + +*xtrabackup* supports incremental backups, which means that they can copy +only +all the data that has changed since the last backup. + +**NOTE**: Incremental backups on the MyRocks storage engine do not +determine if an earlier full backup or incremental backup contains the same +files. **Percona XtraBackup** copies all the MyRocks files each time it +takes a backup. + +You can perform many incremental backups between each full backup, so you +can +set up a backup process such as a full backup once a week and an +incremental +backup every day, or full backups every day and incremental backups every +hour. + +Incremental backups work because each *InnoDB* page contains a log sequence +number, or LSN. The LSN is the system version number for the +entire database. Each page’s LSN shows how recently it was changed. + +An incremental backup copies each page whose LSN is newer than the +previous incremental or full backup’s LSN. There are two algorithms in +use to find the set of such pages to be copied. The first one, available +with +all the server types and versions, is to check the page LSN directly by +reading all the data pages. The second one, available with *Percona Server +for MySQL*, is +to enable +the [changed page tracking](http://www.percona.com/doc/percona-server/5.6/management/changed_page_tracking.html) +feature on the server, which will note the pages as they are being changed. +This information will be then written out in a compact separate so-called +bitmap file. The *xtrabackup* binary will use that file to read only the +data +pages it needs for the incremental backup, potentially saving many read +requests. The latter algorithm is enabled by default if the *xtrabackup* +binary +finds the bitmap file. It is possible to specify +`--incremental-force-scan` to read all the pages even if the +bitmap data is available. + +## Creating an Incremental Backup + +To make an incremental backup, begin with a full backup as usual. The +*xtrabackup* binary writes a file called `xtrabackup_checkpoints` into +the backup’s target directory. This file contains a line showing the +`to_lsn`, which is the database’s LSN at the end of the backup. +Create the full backup with a following command: + +``` +$ xtrabackup --backup --target-dir=/data/backups/base +``` + +If you look at the `xtrabackup_checkpoints` file, you should see similar +content depending on your LSN nuber: + +``` +backup_type = full-backuped +from_lsn = 0 +to_lsn = 1626007 +last_lsn = 1626007 +compact = 0 +recover_binlog_info = 1 +``` + +Now that you have a full backup, you can make an incremental backup based +on +it. Use the following command: + +``` +$ xtrabackup --backup --target-dir=/data/backups/inc1 \ +--incremental-basedir=/data/backups/base +``` + +The `/data/backups/inc1/` directory should now contain delta files, such +as `ibdata1.delta` and `test/table1.ibd.delta`. These represent the +changes since the `LSN 1626007`. If you examine the +`xtrabackup_checkpoints` file in this directory, you should see similar +content to the following: + +``` +backup_type = incremental +from_lsn = 1626007 +to_lsn = 4124244 +last_lsn = 4124244 +compact = 0 +recover_binlog_info = 1 +``` + +`from_lsn` is the starting LSN of the backup and for incremental it has to +be +the same as `to_lsn` (if it is the last checkpoint) of the previous/base +backup. + +It’s now possible to use this directory as the base for yet another +incremental +backup: + +``` +$ xtrabackup --backup --target-dir=/data/backups/inc2 \ +--incremental-basedir=/data/backups/inc1 +``` + +This folder also contains the `xtrabackup_checkpoints`: + +``` +backup_type = incremental +from_lsn = 4124244 +to_lsn = 6938371 +last_lsn = 7110572 +compact = 0 +recover_binlog_info = 1 +``` + +**NOTE**: In this case you can see that there is a difference between +the `to_lsn` +(last checkpoint LSN) and `last_lsn` (last copied LSN), this means that +there was some traffic on the server during the backup process. + +## Preparing the Incremental Backups + +The `--prepare` step for incremental backups is not the same +as for full backups. In full backups, two types of operations are performed +to +make the database consistent: committed transactions are replayed from the +log +file against the data files, and uncommitted transactions are rolled back. +You +must skip the rollback of uncommitted transactions when preparing an +incremental backup, because transactions that were uncommitted at the time +of +your backup may be in progress, and it’s likely that they will be committed +in +the next incremental backup. You should use the +`--apply-log-only` option to prevent the rollback phase. + +**WARNING**: **If you do not use the** `--apply-log-only` **option to +prevent the rollback phase, then your incremental backups will be useless** +. +After transactions have been rolled back, further incremental backups +cannot +be applied. + +Beginning with the full backup you created, you can prepare it, and then +apply +the incremental differences to it. Recall that you have the following +backups: + +``` +/data/backups/base +/data/backups/inc1 +/data/backups/inc2 +``` + +To prepare the base backup, you need to run `--prepare` as +usual, but prevent the rollback phase: + +``` +$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base +``` + +The output should end with text similar to the following: + +``` +InnoDB: Shutdown completed; log sequence number 1626007 +161011 12:41:04 completed OK! +``` + +The log sequence number should match the `to_lsn` of the base backup, which +you saw previously. + +**NOTE**: This backup is actually safe to restore as-is +now, even though the rollback phase has been skipped. If you restore it and +start *MySQL*, *InnoDB* will detect that the rollback phase was not +performed, and it will do that in the background, as it usually does for a +crash recovery upon start. It will notify you that the database was not +shut +down normally. + +To apply the first incremental backup to the full backup, run the following +command: + +``` +$ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \ +--incremental-dir=/data/backups/inc1 +``` + +This applies the delta files to the files in `/data/backups/base`, which +rolls them forward in time to the time of the incremental backup. It then +applies the redo log as usual to the result. The final data is in +`/data/backups/base`, not in the incremental directory. You should see +an output similar to: + +``` +incremental backup from 1626007 is enabled. +xtrabackup: cd to /data/backups/base +xtrabackup: This target seems to be already prepared with --apply-log-only. +xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(4124244) +... +xtrabackup: page size for /tmp/backups/inc1/ibdata1.delta is 16384 bytes +Applying /tmp/backups/inc1/ibdata1.delta to ./ibdata1... +... +161011 12:45:56 completed OK! +``` + +Again, the LSN should match what you saw from your earlier inspection of +the +first incremental backup. If you restore the files from +`/data/backups/base`, you should see the state of the database as of the +first incremental backup. + +**WARNING**: *Percona XtraBackup* does not support using the same +incremental backup directory to prepare +two copies of backup. Do not run `--prepare` with the same +incremental backup directory (the value of –incremental-dir) more than +once. + +Preparing the second incremental backup is a similar process: apply the +deltas +to the (modified) base backup, and you will roll its data forward in time +to +the point of the second incremental backup: + +``` +$ xtrabackup --prepare --target-dir=/data/backups/base \ +--incremental-dir=/data/backups/inc2 +``` + +**NOTE**: `--apply-log-only` should be used when merging the +incremental backups +except +the last one. That’s why the previous line does not contain the +`--apply-log-only` option. Even if the `--apply-log-only` was +used on the last step, backup would still be consistent but in that case +server +would perform the rollback phase. + +Once prepared incremental backups are the same as the full backups, and +they +can be restored in the same +way. diff --git a/storage/innobase/xtrabackup/doc/docs/css/details.css b/storage/innobase/xtrabackup/doc/docs/css/details.css new file mode 100644 index 000000000000..e9e925576879 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/css/details.css @@ -0,0 +1,36 @@ +details { + display: block; +} + +details[open] > summary::before { + content: "\25BC"; +} + +details summary { + display: block; + cursor: pointer; +} + +details summary:focus { + outline: none; +} + +details summary::before { + content: "\25B6"; + padding-right: 0.5em; +} + +details summary::-webkit-details-marker { + display: none; +} + +/* Attach the "no-details" class to details tags + in browsers that do not support them to get + open/show functionality. */ +details.no-details:not([open]) > * { + display: none; +} + +details.no-details:not([open]) summary { + display: block; +} diff --git a/storage/innobase/xtrabackup/doc/docs/css/percona.css b/storage/innobase/xtrabackup/doc/docs/css/percona.css new file mode 100644 index 000000000000..ce46731d2935 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/css/percona.css @@ -0,0 +1,16 @@ +[data-md-color-scheme="percona-light"] { + --md-primary-fg-color: #e97e03; + --md-primary-fg-color--light: #ECB7B7; + --md-primary-fg-color--dark: #90030C; +} +[data-md-color-scheme="slate"] { + --md-primary-fg-color: #e97e03; + /* + --md-primary-fg-color--light: #ECB7B7; + --md-primary-fg-color--dark: #90030C; + */ + --md-hue: 210; /* [0, 360] */ + } +ul li p { + margin: 0; +} diff --git a/storage/innobase/xtrabackup/doc/docs/css/toctree.css b/storage/innobase/xtrabackup/doc/docs/css/toctree.css new file mode 100644 index 000000000000..0de776193231 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/css/toctree.css @@ -0,0 +1,48 @@ +.sphinxsidebarwrapper { + padding-right: 0 !important; +} +/* Turns off bullets within toctree */ +.sphinxsidebarwrapper ul { + list-style: none; +} +.sphinxsidebarwrapper>ul { + padding-left: 0; +} +.sphinxsidebarwrapper>ul>li { + padding: 0 0 10px 0; + margin: 0; +} +.custom-button { + cursor: pointer; + display: inline-flex; + justify-content: center; + align-items: center; + width: 10px; + margin-right: 5px; + margin-bottom: 0; + font-size: 18px; + font-weight: 400; + border: none; + background-color: transparent; + outline: none; +} + +.custom-button~ul { + display: none; +} + +.custom-button--main-active { + background-color: #e3e3e3 +} + +.custom-button.custom-button--active~ul { + display: block; +} + +.custom-button:before { + content: '+'; +} + +.custom-button.custom-button--active:before { + content: '-'; +} diff --git a/storage/innobase/xtrabackup/doc/docs/css/version-select.css b/storage/innobase/xtrabackup/doc/docs/css/version-select.css new file mode 100644 index 000000000000..49079bf4686e --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/css/version-select.css @@ -0,0 +1,5 @@ +@media only screen and (max-width:76.1875em) { + #version-selector { + padding: .6rem .8rem; + } +} diff --git a/storage/innobase/xtrabackup/doc/docs/em/instant.md b/storage/innobase/xtrabackup/doc/docs/em/instant.md new file mode 100644 index 000000000000..d8ebf98c50cf --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/em/instant.md @@ -0,0 +1,65 @@ +# Error Message: Found tables with row versions due to INSTANT ADD/DROP columns + +*MySQL* 8.0.29 extended the support for `ALTER TABLE … ALGORITHM=INSTANT` to allow users to add a column in any table position or drop any column. As part of this update, the redo log format has changed for all server DML operations. This updated redo log format has a design flaw that can cause data corruption for tables with INSTANT ADD/DROP COLUMNS. + +The corruption happens when the crash recovery occurs. InnoDB applies redo logs at startup. Xtrabackup copies the redo log during the backup and applies the log as part of the `--prepare` step to bring the backup to a consistent state. + +Percona fixed the corruption issue and several other issues with the INSTANT ADD/DROP column feature in the upcoming Percona Server for MySQL 8.0.29. + +For more details, see the following: + + +* [PS-8291](https://jira.percona.com/browse/PS-8291), + + +* [PS-8292](https://jira.percona.com/browse/PS-8292) + + +* [PS-8303](https://jira.percona.com/browse/PS-8303) + +Percona XtraBackup 8.0.29 is able to take backups of Percona Server for MySQL 8.0.29 with tables that have INSTANT ADD/DROP COLUMNS. However, the issues in MySQL 8.0.29 make this version unsafe to take backups. + +It is impossible for XtraBackup to deal with the corrupted redo log generated by MySQL 8.0.29 and, for this reason, XtraBackup 8.0.29 version will not take backups if it detects tables with `INSTANT ADD/DROP COLUMNS` and generates an error listing the affected tables and providing instructions to convert them to regular tables. + +Please avoid ALTER ADD/DROP COLUMN without an explicit ALGORITHM=INPLACE. The default ALGORITHM is INSTANT, so ALTER TABLE without the ALGORITHM keyword uses the newly introduced INSTANT algorithm. + +If you already have such tables (information below on how to find such tables), users are advised to do `OPTIMIZE TABLE` against these tables before taking backups. + +To find tables with `INSTANT ADD/DROP COLUMNS` run the following command: + +```mysql +mysql> SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE TOTAL_ROW_VERSIONS > 0; ++---------+ +| NAME | ++---------+ +| test/t1 | +| test/t2 | +| test/t3 | ++---------+ +3 rows in set (0.02 sec) +``` + +If this query shows an empty result set, you have no issues. Percona Xtrabackup takes the backup of your MySQL 8.0.29 server. If the results are a list of tables, please run OPTIMIZE TABLE on the list before taking the backup. + +## Percona XtraBackup Error Message + +If Percona XtraBackup detects that MySQL 8.0.29 server has tables with instant add/drop columns, it aborts with the following error message + +```mysql +2022-07-01T15:18:35.127689+05:30 0 [ERROR] [MY-011825] [Xtrabackup] Found tables with row versions due to INSTANT ADD/DROP columns +2022-07-01T15:18:35.127714+05:30 0 [ERROR] [MY-011825] [Xtrabackup] This feature is not stable and will cause backup corruption. +2022-07-01T15:18:35.127723+05:30 0 [ERROR] [MY-011825] [Xtrabackup] Tables found: +2022-07-01T15:18:35.127730+05:30 0 [ERROR] [MY-011825] [Xtrabackup] test/t1 +2022-07-01T15:18:35.127737+05:30 0 [ERROR] [MY-011825] [Xtrabackup] test/t2 +2022-07-01T15:18:35.127744+05:30 0 [ERROR] [MY-011825] [Xtrabackup] test/t3 +2022-07-01T15:18:35.127752+05:30 0 [ERROR] [MY-011825] [Xtrabackup] Please run OPTIMIZE TABLE or ALTER TABLE ALGORITHM=COPY on all listed tables to fix this issue. +``` + +## Summary + +The option, `ALGORITHM=INSTANT` is the default value in MySQL 8.0.29. If you do not specify an algorithm, all `ALTER TABLE ADD/DROP COLUMN` statements use this algorithm. + +The `INSTANT` algorithm is unstable at this point. + +Percona XtraBackup refuses to take backups from MySQL 8.0.29 tables that have used this algorithm. +Percona Server users do not suffer the same limitations as the corruption issues are fixed in the upcoming release of Percona Server for MySQL 8.0.29 diff --git a/storage/innobase/xtrabackup/doc/docs/faq.md b/storage/innobase/xtrabackup/doc/docs/faq.md new file mode 100644 index 000000000000..c3b627cbf8d1 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/faq.md @@ -0,0 +1,105 @@ +# Frequently Asked Questions + +## Does *Percona +XtraBackup* 8.0 support making backups of databases in versions prior to 8.0? + +*Percona XtraBackup* 8.0 does not support making backups of databases +created in versions prior to 8.0 of *MySQL*, *Percona Server for MySQL* or +*Percona XtraDB Cluster*. As the changes that *MySQL* 8.0 introduced +in *data dictionaries*, *redo log* and *undo log* are incompatible +with previous versions, it is currently impossible for *Percona XtraBackup* +8.0 to also support versions prior to 8.0. + +Due to changes in MySQL 8.0.20 released by Oracle at the end of April 2020, +*Percona XtraBackup* 8.0, up to version 8.0.11, is not compatible with +MySQL version 8.0.20 or +higher, or Percona products that are based on it: Percona Server for MySQL +and +Percona XtraDB Cluster. + +For more information, +see [Percona XtraBackup 8.x and MySQL 8.0.20](https://www.percona.com/blog/2020/04/28/percona-xtrabackup-8-x-and-mysql-8-0-20/) + +## Why will `innobackupex` not run in *Percona XtraBackup* 8.0? + +**innobackupex** has been removed from *Percona XtraBackup* +8.0 in favor of **xtrabackup**. + +## Are you aware of any web-based backup management tools (commercial or not) built around * +Percona XtraBackup*? + +[Zmanda Recovery Manager](http://www.zmanda.com/zrm-mysql-enterprise.html) +is +a commercial tool that uses *Percona XtraBackup* for Non-Blocking Backups: + +> *“ZRM provides support for non-blocking backups of MySQL using Percona +> XtraBackup. ZRM with \*Percona XtraBackup* provides resource utilization +> management by providing throttling based on the number of IO operations +> per +> second. *Percona XtraBackup* based backups also allow for table level +> recovery +> even though the backup was done at the database level (needs the recovery +> database server to be *Percona Server for MySQL* with XtraDB).”\* + +## *xtrabackup* binary fails with a floating point exception + +In most of the cases this is due to not having installed the required +libraries +(and version) by *xtrabackup*. Installing the *GCC* suite with the +supporting +libraries and recompiling *xtrabackup* solves the issue. See +[Compiling and Installing from Source Code](https://docs.percona.com/percona-xtrabackup/latest/installation/compiling_xtrabackup.html) for instructions on the +procedure. + +## How xtrabackup handles the ibdata/ib_log files on restore if they aren’t in mysql datadir? + +In case the `ibdata` and `ib_log` files are located in different +directories outside the datadir, you will have to put them in their +proper +place after the logs have been applied. + +## Backup fails with Error 24: ‘Too many open files’ + +This usually happens when database being backed up contains large amount of +files and *Percona XtraBackup* can’t open all of them to create a +successful +backup. In order to avoid this error the operating system should be +configured +appropriately so that *Percona XtraBackup* can open all its files. On +Linux, +this can be done with the `ulimit` command for specific backup session or +by +editing the `/etc/security/limits.conf` to change it globally (**NOTE**: +the maximum possible value that can be set up is `1048576` which is a +hard-coded constant in the Linux kernel). + +## How to deal with skipping of redo logs for DDL operations? + +To prevent creating corrupted backups when running DDL operations, +Percona XtraBackup aborts if it detects that redo logging is disabled. +In this case, the following error is printed: + +``` +[FATAL] InnoDB: An optimized (without redo logging) DDL operation has been performed. All modified pages may not have been flushed to the disk yet. +Percona XtraBackup will not be able to take a consistent backup. Retry the backup operation. +``` + +**NOTE**: Redo logging is disabled during +a [sorted index build](https://dev.mysql.com/doc/refman/8.0/en/sorted-index-builds.html). To avoid this error, +Percona XtraBackup can use metadata locks on tables while they are copied: + +* To block all DDL operations, use the `--lock-ddl` option + that issues `LOCK TABLES FOR BACKUP`. + + +* If `LOCK TABLES FOR BACKUP` is not supported, + you can block DDL for each table + before XtraBackup starts to copy it + and until the backup is completed + using the `--lock-ddl-per-table` option. + +**NOTE**: As of *Percona XtraBackup* 8.0.15, the –lock-ddl-per-table option +is deprecated. +Use the –lock-ddl option. + + diff --git a/storage/innobase/xtrabackup/doc/docs/glossary.md b/storage/innobase/xtrabackup/doc/docs/glossary.md new file mode 100644 index 000000000000..da67a4fb0a67 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/glossary.md @@ -0,0 +1,182 @@ +# Glossary + +.CSM + +Each table with the **CSV Storage Engine** has `.CSM` file which contains the metadata of it. + +.CSV + +Each table with the **CSV Storage** engine has `.CSV` file which contains the data of it (which is a standard Comma Separated Value file). + +.exp + +Files with the `.exp` extension are created by **Percona XtraBackup** per each _InnoDB_ tablespace when the [`--export`](https://docs.percona.com/percona-xtrabackup/latest/xtrabackup_bin/xbk_option_reference.html#cmdoption-export) option is used on prepare. See [restoring individual tables](https://docs.percona.com/percona-xtrabackup/latest/xtrabackup_bin/restoring_individual_tables.html). + +.frm + +For each table, the server will create a file with the `.frm` extension containing the table definition (for all storage engines). + +.ibd + +On a multiple tablespace setup ([innodb\_file\_per\_table] enabled), _MySQL_ will store each newly created table on a file with a `.ibd` extension. + +.MRG + +Each table using the **MERGE** storage engine, besides of a `.frm` file, +will have `.MRG` file containing the names of the _MyISAM_ tables +associated with it. + +.MYD + +Each _MyISAM_ table has `.MYD` (MYData) file which contains the data on it. + +.MYI + +Each _MyISAM_ table has `.MYI` (MYIndex) file which contains the table’s indexes. + +.opt + +_MySQL_ stores options of a database (like charset) in a file with a `.opt` extension in the database directory. + +.par + +Each partitioned table has `.par` file which contains metadata about the partitions. + +.TRG + +The file contains the triggers associated with a table, for example, `\mytable.TRG`. With the `.TRN` file, they represent all the trigger definitions. + +.TRN + +The file contains the names of triggers that are associated with a table, for example, `\mytable.TRN`. With the `.TRG` file, they represent all the trigger definitions. + +backup + +The process of copying data or tables to be stored in a different location. + +compression + +The method that produces backups in a reduced size. + +configuration file + +The file that contains the server startup options. + +crash + +An unexpected shutdown which does not allow the normal server shutdown cleanup activities. + +crash recovery + +The actions that occur when MySQL is restarted after a crash. + +data dictionary + +The metadata for the tables, indexes, and table columns stored in the InnoDB system tablespace. + +datadir + +The directory in which the database server stores its data files. Most Linux distribution use `/var/lib/mysql` by default. + +full backup + +A backup that contains the complete source data from an instance. + +ibdata + +The default prefix for tablespace files. For example, `ibdata1` is a 10MB auto-extensible file that _MySQL_ creates for a shared tablespace by default. + +incremental backup + +A backup stores data from a specific point in time. + +InnoDB + +Storage engine which provides ACID-compliant transactions and foreign +key support, among others improvements over _MyISAM_. It is the default +engine for _MySQL_ as of the 8.0 series. + +innodb\_buffer\_pool\_size + +The size in bytes of the memory buffer to cache data and indexes of _InnoDB_’s tables. This aims to reduce disk access to provide better performance. + +> \[mysqld\]
    +> innodb\_buffer\_pool\_size=8MB + +innodb\_data\_home\_dir + +The directory (relative to `datadir`) where the database server stores +the files in a shared tablespace setup. This option does not affect the location of `innodb\_file\_per\_table`. For example: + +> \[mysqld\]
    +> innodb\_data\_home\_dir = ./ + +innodb\_data\_file\_path + +Specifies the names, sizes and location of shared tablespace files: + +> \[mysqld\]
    +> innodb\_data\_file\_path=ibdata1:50M;ibdata2:50M:autoextend + +innodb\_file\_per\_table + +By default, InnoDB creates tables and indexes in a [file-per-tablespace](https://dev.mysql.com/doc/refman/8.0/en/innodb-file-per-table-tablespaces.html). If the `innodb_file_per_table` variable is disabled, you can enable the variable in your configuration file: + +> \[mysqld\]
    +> innodb\_file\_per\_table
    +> or
    +> start the server with `--innodb_file_per_table`. + +innodb\_log\_group\_home\_dir + +Specifies the location of the _InnoDB_ log files: + +> \[mysqld\]
    +> innodb\_log\_group\_home=/var/lib/mysql + +logical backup + +A backup which contains a set of SQL statements. The statements can be used to recreate the databases. + +LSN + +Each InnoDB page contains a log sequence number(LSN). The LSN is the system version number for the database. Each page’s LSN shows how recently it was changed. + +my.cnf + +The database server’s main configuration file. Most Linux distributions place it as `/etc/mysql/my.cnf` or `/etc/my.cnf`, but the location and name depends on the particular installation. Note that this method is not the only way of configuring the server, some systems rely on the command options. + +MyISAM + +The _MySQL_ default storage engine until version 5.5. It doesn’t fully +support transactions but in some scenarios may be faster than _InnoDB_. +Each table is stored on disk in 3 files: `.frm`, `.MYD`, `.MYI`. + +physical backup + +A backup that copies the data files. + +point in time recovery + +This method restores the data into the state it was at any selected point of time. + +prepared backup + +A consistent set of backup data that is ready to be restored. + +restore + +Copies the database backups taken using the backup command to the original location or a different location. A restore returns data that has been either lost, corrupted, or stolen to the original condition at a specific point in time. + +xbcrypt + +To support the encryption and the decryption of the backups, a new tool xbcrypt was introduced to **Percona XtraBackup**. This utility has been modeled after the **xbstream** binary to perform encryption and decryption outside **Percona XtraBackup**. + +xbstream + +To support simultaneous compression and streaming, **Percona XtraBackup** uses the **xbstream** format. For more information see [`--stream`](https://docs.percona.com/percona-xtrabackup/latest/xtrabackup_bin/xbk_option_reference.html#cmdoption-stream) + +XtraDB + +_Percona XtraDB_ is an enhanced version of the InnoDB storage engine, designed to better scale on modern hardware. _Percona XtraDB_ includes features which are useful in a high performance environment. It is fully backward-compatible, and is a drop-in replacement for the standard InnoDB storage engine. For more information, see [The Percona XtraDB Storage Engine](https://www.percona.com/doc/percona-server/8.0/percona_xtradb.html). + diff --git a/storage/innobase/xtrabackup/doc/docs/how-tos.md b/storage/innobase/xtrabackup/doc/docs/how-tos.md new file mode 100644 index 000000000000..9b1d6c693a28 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/how-tos.md @@ -0,0 +1,70 @@ +# How-tos and Recipes + +## Recipes for *xtrabackup* + + +* [Making a Full Backup](https://docs.percona.com/percona-xtrabackup/8.0/backup_scenarios/full_backup.html) + + +* [Making an Incremental Backup](https://docs.percona.com/percona-xtrabackup/8.0/backup_scenarios/incremental_backup.html) + + +* [Make a Streaming Backup +](https://docs.percona.com/percona-xtrabackup/8.0/howtos/recipes_xbk_stream.html) + +* [Making a Compressed Backup](https://docs.percona.com/percona-xtrabackup/8.0/backup_scenarios/compressed_backup.html) + + +* [Backing Up and Restoring Individual Partitions](https://docs.percona.com/percona-xtrabackup/8.0/howtos/recipes_xbk_partition.html) + + +## How-Tos + + +* [Privileges and Permissions for Users](https://docs.percona.com/percona-xtrabackup/8.0/howtos/permissions.html) + + +* [How to set up a replica for replication in 6 simple steps with Percona XtraBackup](https://docs.percona.com/percona-xtrabackup/8.0/howtos/setting_up_replication.html) + + +* [Verifying Backups with replication and pt-checksum](https://docs.percona.com/percona-xtrabackup/8.0/howtos/backup_verification.html) + + +* [How to create a new (or repair a broken) GTID-based Replica](https://docs.percona.com/percona-xtrabackup/8.0/howtos/recipes_ibkx_gtid.html) + + +## Assumptions in this section + +Most of the time, the context will make the recipe or tutorial understandable. +To assure that, a list of the assumptions, names and “things” that will appear +in this section is given. At the beginning of each recipe or tutorial they will +be specified in order to make it quicker and more practical. + +`HOST` + +> A system with a *MySQL*-based server installed, configured and running. We +> will assume the following about this system: + +> > +> > * the MySQL server is able to communicate with others by the +> > standard TCP/IP port; + + +> > * an SSH server is installed and configured - see here if it is not; + + +> > * you have a user account in the system with the appropriate +> > permissions and + + +> > * you have a MySQL’s user account with appropriate Connection and Privileges Needed. + +`USER` + + An user account in the system with shell access and appropriate permissions + for the task. A guide for checking them is here. + +`DB-USER` + + An user account in the database server with appropriate privileges for the + task. A guide for checking them is here. diff --git a/storage/innobase/xtrabackup/doc/docs/how_xtrabackup_works.md b/storage/innobase/xtrabackup/doc/docs/how_xtrabackup_works.md new file mode 100644 index 000000000000..a61ed057c2d3 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/how_xtrabackup_works.md @@ -0,0 +1,113 @@ +# How Percona XtraBackup Works + +*Percona XtraBackup* is based on InnoDB’s crash-recovery functionality. +It copies your *InnoDB* data files, which results in data that is internally +inconsistent; but then it performs crash recovery on the files to make them a +consistent, usable database again. + +This works because *InnoDB* maintains a redo log, also called the transaction +log. This contains a record of every change to InnoDB data. When *InnoDB* +starts, it inspects the data files and the transaction log, and performs two +steps. It applies committed transaction log entries to the data files, and it +performs an undo operation on any transactions that modified data but did not +commit. + +*Percona XtraBackup* works by remembering the log sequence number (LSN) +when it starts, and then copying away the data files. It takes some time to do +this, so if the files are changing, then they reflect the state of the database +at different points in time. At the same time, *Percona XtraBackup* runs a +background process that watches the transaction log files, and copies changes +from it. *Percona XtraBackup* needs to do this continually because the +transaction logs are written in a round-robin fashion, and can be reused after a +while. *Percona XtraBackup* needs the transaction log records for every change +to the data files since it began execution. + +*Percona XtraBackup* uses [Backup locks](https://docs.percona.com/percona-server/8.0/management/backup_locks.html) +where available as a lightweight alternative to `FLUSH TABLES WITH READ +LOCK`. This feature is available in *Percona Server for MySQL* 5.6+. *MySQL* 8.0 allows +acquiring an instance level backup lock via the `LOCK INSTANCE FOR BACKUP` +statement. + +Locking is only done for *MyISAM* and other non-InnoDB tables +**after** *Percona XtraBackup* finishes backing up all InnoDB/XtraDB data and +logs. *Percona XtraBackup* uses this automatically to copy non-InnoDB data to +avoid blocking DML queries that modify *InnoDB* tables. + +**_Important_** - The `BACKUP_ADMIN` privilege is required to query the +`performance_schema_log_status` for either `LOCK +INSTANCE FOR +BACKUP` or `LOCK TABLES FOR BACKUP`. + +*xtrabackup* tries to avoid backup locks and `FLUSH TABLES WITH READ LOCK` +when the instance contains only InnoDB tables. In this case, *xtrabackup* +obtains binary log coordinates from `performance_schema.log_status`. `FLUSH +TABLES WITH READ LOCK` is still required in MySQL 8.0 when xtrabackup is +started with the `--slave-info`. The `log_status` table in Percona +Server for MySQL 8.0 is extended to include the relay log coordinates, so no locks are +needed even with the `--slave-info` option. + +**_See also_** [*MySQL* Documentation: LOCK INSTANCE FOR BACKUP](https://dev.mysql.com/doc/refman/8.0/en/lock-instance-for-backup.html) + +When backup locks are supported by the server, *xtrabackup* first copies +*InnoDB* data, runs the `LOCK TABLES FOR BACKUP` and then copies the *MyISAM* +tables. Once this is done, the backup of the files will +begin. It will backup .frm, .MRG, .MYD, .MYI, .CSM, +.CSV, `.sdi` and `.par` files. + +After that *xtrabackup* will use `LOCK BINLOG FOR BACKUP` to block all +operations that might change either binary log position or +`Exec_Master_Log_Pos` or `Exec_Gtid_Set` (i.e. source binary log coordinates +corresponding to the current SQL thread state on a replication replica) as +reported by `SHOW MASTER/SLAVE STATUS`. *xtrabackup* will then finish copying +the REDO log files and fetch the binary log coordinates. After this is completed +*xtrabackup* will unlock the binary log and tables. + +Finally, the binary log position will be printed to `STDERR` and *xtrabackup* +will exit returning 0 if all went OK. + +Note that the `STDERR` of *xtrabackup* is not written in any file. You will +have to redirect it to a file, e.g., `xtrabackup OPTIONS 2> backupout.log`. + +It will also create the following files in the +directory of the backup. + +During the `prepare` phase, *Percona XtraBackup* performs crash recovery against +the copied data files, using the copied transaction log file. After this is +done, the database is ready to restore and use. + +The backed-up *MyISAM* and *InnoDB* tables will be eventually consistent with +each other, because after the prepare (recovery) process, *InnoDB*’s data is +rolled forward to the point at which the backup completed, not rolled back to +the point at which it started. This point in time matches where the `FLUSH +TABLES WITH READ LOCK` was taken, so the *MyISAM* data and the prepared +*InnoDB* data are in sync. + +The *xtrabackup* offers many features not mentioned in the preceding +explanation. The functionality of each tool is explained in more +detail further in this manual. In brief, though, the tools enable you +to do operations such as streaming and incremental backups with +various combinations of copying the data files, copying the log files, +and applying the logs to the data. + +## Restoring a backup + +To restore a backup with *xtrabackup* you can use the `--copy-back` or +`--move-back` options. + +*xtrabackup* will read from the `my.cnf` the variables datadir, +innodb_data_home_dir, innodb_data_file_path, +innodb_log_group_home_dir and check that the directories exist. + +It will copy the *MyISAM* tables, indexes, etc. (.MRG, .MYD, +.MYI, .CSM, .CSV, `.sdi`, +and `par` files) first, *InnoDB* tables and indexes next and the log files at +last. It will preserve file’s attributes when copying them, you may have to +change the files’ ownership to `mysql` before starting the database server, as +they will be owned by the user who created the backup. + +Alternatively, the `--move-back` option may be used to +restore a backup. This option is similar to `--copy-back` +with the only difference that instead of copying files it moves them to their +target locations. As this option removes backup files, it must be used with +caution. It is useful in cases when there is not enough free disk space to hold +both data files and their backup copies. diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/backup_verification.md b/storage/innobase/xtrabackup/doc/docs/howtos/backup_verification.md new file mode 100644 index 000000000000..9ca468a4e0a9 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/backup_verification.md @@ -0,0 +1,105 @@ +# Verifying Backups with replication and pt-checksum + +One way to verify if the backup is consistent is by setting up the +replication and +running [pt-table-checksum](http://www.percona.com/doc/percona-toolkit/pt-table-checksum.html) +. This can be used to verify any type of backups, but before setting up +replication, backup should be prepared and be able to run (this means that +incremental backups should be merged to full backups, encrypted backups +decrypted etc.). + +## Setting up the replication + +How to set up a replica for replication in 6 simple steps with Percona +XtraBackup guide provides a detailed instructions on how to take the backup +and set up the replication. + +For checking the backup consistency you can use either the original server +where the backup was taken, or another test server created by using a +different backup method (such as cold backup, mysqldump or LVM snapshots) +as the source server in the replication setup. + +## Using pt-table-checksum + +This tool is part of the *Percona Toolkit*. It performs an online +replication consistency check by executing checksum queries on the source, +which produces different results on replicas that are inconsistent with the +source. + +After you confirmed that replication has been set up successfully, you +can [install](http://www.percona.com/doc/percona-toolkit/installation.html) +or download *pt-table-checksum*. This example shows downloading the latest +version of *pt-table-checksum*: + +``` +$ wget percona.com/get/pt-table-checksum +``` + +**NOTE**: In order for pt-table-checksum to work +correctly `libdbd-mysql-perl` will need to be installed on *Debian/Ubuntu* +systems or `perl-DBD-MySQL` on *RHEL/CentOS*. If you installed the * +percona-toolkit* package from the Percona repositories package manager +should install those libraries automatically. + +After this command has been run, *pt-table-checksum* will be downloaded to +your current working directory. + +Running the *pt-table-checksum* on the source will create `percona` +database with the `checksums` table which will be replicated to the +replicas as well. Example of the *pt-table-checksum* will look like this: + +``` +$ ./pt-table-checksum + TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE + 04-30T11:31:50 0 0 633135 8 0 5.400 exampledb.aka_name +04-30T11:31:52 0 0 290859 1 0 2.692 exampledb.aka_title +Checksumming exampledb.user_info: 16% 02:27 remain +Checksumming exampledb.user_info: 34% 01:58 remain +Checksumming exampledb.user_info: 50% 01:29 remain +Checksumming exampledb.user_info: 68% 00:56 remain +Checksumming exampledb.user_info: 86% 00:24 remain +04-30T11:34:38 0 0 22187768 126 0 165.216 exampledb.user_info +04-30T11:38:09 0 0 0 1 0 0.033 mysql.time_zone_name +04-30T11:38:09 0 0 0 1 0 0.052 mysql.time_zone_transition +04-30T11:38:09 0 0 0 1 0 0.054 mysql.time_zone_transition_type +04-30T11:38:09 0 0 8 1 0 0.064 mysql.user +``` + +If all the values in the `DIFFS` column are 0 that means that backup is +consistent with the current setup. + +In case backup was not consistent *pt-table-checksum* should spot the +difference and point to the table that does not match. Following example +shows adding new user on the backed up replica in order to simulate the +inconsistent backup: + +``` +mysql> grant usage on exampledb.* to exampledb@localhost identified by 'thisisnewpassword'; +``` + +If we run the *pt-table-checksum* now difference should be spotted + +``` +$ ./pt-table-checksum +TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE +04-30T11:31:50 0 0 633135 8 0 5.400 exampledb.aka_name +04-30T11:31:52 0 0 290859 1 0 2.692 exampledb.aka_title +Checksumming exampledb.user_info: 16% 02:27 remain +Checksumming exampledb.user_info: 34% 01:58 remain +Checksumming exampledb.user_info: 50% 01:29 remain +Checksumming exampledb.user_info: 68% 00:56 remain +Checksumming exampledb.user_info: 86% 00:24 remain +04-30T11:34:38 0 0 22187768 126 0 165.216 exampledb.user_info +04-30T11:38:09 0 0 0 1 0 0.033 mysql.time_zone_name +04-30T11:38:09 0 0 0 1 0 0.052 mysql.time_zone_transition +04-30T11:38:09 0 0 0 1 0 0.054 mysql.time_zone_transition_type +04-30T11:38:09 1 0 8 1 0 0.064 mysql.user +``` + +This output shows that source and the replica aren’t in consistent state +and that the difference is in the `mysql.user` table. + +More information on different options that pt-table-checksum provides can +be found in the * +pt-table-checksum* [documentation](http://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html) +. diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/enabling_tcp.md b/storage/innobase/xtrabackup/doc/docs/howtos/enabling_tcp.md new file mode 100644 index 000000000000..477bae120ccf --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/enabling_tcp.md @@ -0,0 +1,38 @@ +# Enabling the server to communicate via TCP/IP + +Most of the Linux distributions do not enable by default to accept TCP/IP +connections from outside in their MySQL or Percona Server packages. + +You can check it with `netstat` on a shell: + +``` +$ netstat -lnp | grep mysql +tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2480/mysqld +unix 2 [ ACC ] STREAM LISTENING 8101 2480/mysqld /tmp/mysql.sock +``` + +You should check two things: + +* there is a line starting with `tcp` (the server is indeed accepting TCP + connections) + + +* the first address (`0.0.0.0:3306` in this example) is different + from `127.0.0.1:3306` (the bind address is not localhost’s). + +In the first case, the first place to look is the `my.cnf` file. If you +find the option `skip-networking`, comment it out or just delete it. Also +check that *if* the variable `bind_address` is set, then it should not be +set to localhost’s but to the host’s IP. Then restart the MySQL server and +check it again with `netstat`. If the changes had no effect, then +you should look at your distribution’s startup scripts (like `rc.mysqld`). +You should comment out flags like `--skip-networking` and/or change +the `bind-address`. + +After you get the server listening to remote TCP connections properly, the +last thing to do is checking that the port (3306 by default) is indeed +open. Check your firewall configurations (`iptables -L`) and that you are +allowing remote hosts on that port (in `/etc/hosts.allow`). + +And we’re done! We have a MySQL server running which is able to communicate +with the world through TCP/IP. diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/permissions.md b/storage/innobase/xtrabackup/doc/docs/howtos/permissions.md new file mode 100644 index 000000000000..aed50f9b412b --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/permissions.md @@ -0,0 +1,77 @@ +# Privileges and Permissions for Users + +We will be referring to *permissions* to the ability of a user to access +and perform changes on the relevant parts of the host’s filesystem, +starting/stopping services and installing software. + +By *privileges*, we refer to the abilities of a database user to perform +different kinds of actions on the database server. + +## At a system level + +There are many ways for checking the permission on a file or directory. For +example, `ls -ls /path/to/file` or `stat /path/to/file | grep Access` will +do the job: + +``` +$ stat /etc/mysql | grep Access +Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) +Access: 2011-05-12 21:19:07.129850437 -0300 +$ ls -ld /etc/mysql/my.cnf +-rw-r--r-- 1 root root 4703 Apr 5 06:26 /etc/mysql/my.cnf +``` + +As in this example, `my.cnf` is owned by `root` and not writable for anyone +else. Assuming that you do not have `root`‘s password, you can check what +permissions you have on these types of files with `sudo -l`: + +``` +$ sudo -l +Password: +You may run the following commands on this host: +(root) /usr/bin/ +(root) NOPASSWD: /etc/init.d/mysqld +(root) NOPASSWD: /bin/vi /etc/mysql/my.cnf +(root) NOPASSWD: /usr/local/bin/top +(root) NOPASSWD: /usr/bin/ls +(root) /bin/tail +``` + +Being able to execute with `sudo` scripts in `/etc/init.d/`, `/etc/rc.d/` +or `/sbin/service` is the ability to start and stop services. + +Also, If you can execute the package manager of your distribution, you can +install or remove software with it. If not, having `rwx` permission over a +directory will let you do a local installation of software by compiling it +there. This is a typical situation in many hosting companies’ services. + +There are other ways for managing permissions, such as using *PolicyKit*, * +Extended ACLs* or *SELinux*, which may be preventing or allowing your +access. You should check them in that case. + +## At a database server level + +To query the privileges that your database user has been granted, at a +console of the server execute: + +``` +mysql> SHOW GRANTS; +``` + +or for a particular user with: + +``` +mysql> SHOW GRANTS FOR 'db-user'@'host'; +``` + +It will display the privileges using the same format as for +the [GRANT statement](http://dev.mysql.com/doc/refman/8.0/en/show-grants.html) +. + +Note that privileges may vary across versions of the server. To list the +exact list of privileges that your server support (and a brief description +of them) execute: + +``` +mysql> SHOW PRIVILEGES; +``` diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/recipes_ibkx_gtid.md b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_ibkx_gtid.md new file mode 100644 index 000000000000..12db5955f962 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_ibkx_gtid.md @@ -0,0 +1,145 @@ +# How to create a new (or repair a broken) GTID-based Replica + +*MySQL* 5.6 introduced the Global Transaction +ID ([GTID](http://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html)) +support in replication. *Percona XtraBackup* automatically +stores the `GTID` value in the `xtrabackup_binlog_info` when doing the +backup of *MySQL* and *Percona Server for MySQL* 5.7 with the `GTID` mode +enabled. This +information can be used to create a new (or repair a broken) `GTID`-based +replica. + +## STEP 1: Take a backup from any server on the replication environment, source or replica + +The following command takes a backup and saves it in +the `/data/backups/$TIMESTAMP` folder: + +``` +$ xtrabackup --backup --target-dirs=/data/backups/ +``` + +In the destination folder, there will be a file with the name +`xtrabackup_binlog_info`. This file contains both binary log coordinates +and the `GTID` information. + +``` +$ cat xtrabackup_binlog_info +mysql-bin.000002 1232 c777888a-b6df-11e2-a604-080027635ef5:1-4 +``` + +That information is also printed by xtrabackup after taking the backup: + +``` +xtrabackup: MySQL binlog position: filename 'mysql-bin.000002', position 1232, GTID of the last change 'c777888a-b6df-11e2-a604-080027635ef5:1-4' +``` + +## STEP 2: Prepare the backup + +The backup will be prepared with the following command on the Source: + +``` +$ xtrabackup --prepare --target-dir=/data/backup +``` + +You need to select the path where your snapshot has been taken, for example +`/data/backups/2013-05-07_08-33-33`. If everything is ok you should get the +same OK message. Now, the transaction logs are applied to the data files, +and new +ones are created: your data files are ready to be used by the MySQL server. + +## STEP 3: Move the backup to the destination server + +Use **rsync** or **scp** to copy the data to the destination +server. If you are synchronizing the data directly to the already running +replica’s data +directory it is advised to stop the *MySQL* server there. + +``` +$ rsync -avprP -e ssh /path/to/backupdir/$TIMESTAMP NewSlave:/path/to/mysql/ +``` + +After you copy the data over, make sure *MySQL* has proper permissions to +access them. + +``` +$ chown mysql:mysql /path/to/mysql/datadir +``` + +## STEP 4: Configure and start replication + +Set the `gtid_purged` variable to the `GTID` from +`xtrabackup_binlog_info`. Then, update the information about the +source node and, finally, start the replica. Run the following commands on +the replica if you are using a version before 8.0.22: + +``` +# Using the mysql shell + > SET SESSION wsrep_on = 0; + > RESET MASTER; + > SET SESSION wsrep_on = 1; + > SET GLOBAL gtid_purged=''; + > CHANGE MASTER TO + MASTER_HOST="$masterip", + MASTER_USER="repl", + MASTER_PASSWORD="$slavepass", + MASTER_AUTO_POSITION = 1; + > START SLAVE; +``` + +If you are using version 8.0.22 or later, use `START REPLICA` instead +of `START SLAVE`. `START SLAVE` is deprecated as of that release. If you +are using version 8.0.21 or earlier, use `START SLAVE`. + +If you are using a version 8.0.23 or later, run the following commands: + +``` +# Using the mysql shell + > SET SESSION wsrep_on = 0; + > RESET MASTER; + > SET SESSION wsrep_on = 1; + > SET GLOBAL gtid_purged=''; + > CHANGE REPLICATION SOURCE TO + SOURCE_HOST="$masterip", + SOURCE_USER="repl", + SOURCE_PASSWORD="$slavepass", + SOURCE_AUTO_POSITION = 1; + > START REPLICA; +``` + +If you are using version 8.0.23 or later, +use [CHANGE_REPLICATION_SOURCE_TO and the appropriate options](https://dev.mysql.com/doc/refman/8.0/en/change-replication-source-to.html) +. `CHANGE_MASTER_TO` is deprecated as of that release. + +**NOTE**: The example above is applicable to Percona XtraDB Cluster. +The `wsrep_on` variable +is set to 0 before resetting the source (`RESET MASTER`). The +reason is that Percona XtraDB Cluster will not allow resetting the source +if +`wsrep_on=1`. + +## STEP 5: Check the replication status + +The following command returns the replica status: + +``` +SHOW REPLICA STATUS\G +[..] +Slave_IO_Running: Yes +Slave_SQL_Running: Yes +[...] +Retrieved_Gtid_Set: c777888a-b6df-11e2-a604-080027635ef5:5 +Executed_Gtid_Set: c777888a-b6df-11e2-a604-080027635ef5:1-5 +``` + +**NOTE**: The +command [SHOW SLAVE STATUS](https://dev.mysql.com/doc/refman/8.0/en/show-slave-status.html) +is deprecated. +Use [SHOW REPLICA STATUS](https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html) +. + +We can see that the replica has retrieved a new transaction with number 5, +so +transactions from 1 to 5 are already on this slave. + +We have created a new replica in our `GTID` based replication +environment. diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_compressed.md b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_compressed.md new file mode 100644 index 000000000000..93316ef3050e --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_compressed.md @@ -0,0 +1,113 @@ +# Making a Compressed Backup + +In order to make a compressed backup, use the `--compress` option along +with the `--backup` and `--target-dir` options. By default +`--compress` uses the `quicklz` compression algorithm. + +``` +$ xtrabackup --backup --compress --target-dir=/data/backup +``` + +You can also use the `lz4` compression algorithm by setting : +option:`--compress` to `lz4`. + +``` +$ xtrabackup --backup --compress=lz4 --target-dir=/data/backup +``` + +If you want to speed up the compression you can use the parallel +compression, which can be enabled with `--compress-threads` +option. The following example uses four threads for compression. + +``` +$ xtrabackup --backup --compress --compress-threads=4 --target-dir=/data/backup +``` + +Output should look like this + +``` +... + +[01] Compressing ./imdb/comp_cast_type.ibd to /data/backup/imdb/comp_cast_type.ibd.qp +[01] ...done +... +130801 11:50:24 xtrabackup: completed OK +``` + +## Preparing the backup + +Before you can prepare the backup you’ll need to uncompress all the files +with +[qpress](http://www.quicklz.com/) (which is available +from [Percona Software +repositories](http://www.percona.com/doc/percona-xtrabackup/8.0/installation.html#using-percona-software-repositories)) +. +You can use the following one-liner to uncompress all the files: + +``` +$ for bf in `find . -iname "*\.qp"`; do qpress -d $bf $(dirname $bf) && rm $bf; done +``` + +If you used the `lz4` compression algorithm change this script to search +for `\*.lz4` files: + +``` +$ for bf in `find . -iname "*\.lz4"`; do lz4 -d $bf $(dirname $bf) && rm $bf; done +``` + +You can decompress the backup by using the `--decompress` option: + +``` +$ xtrabackup --decompress --target-dir=/data/backup/ +``` + +When the files are uncompressed you can prepare the backup with the +`--apply-log-only` option: + +``` +$ xtrabackup --apply-log-only --target-dir=/data/backup/ +``` + +You should check for a confirmation message: + +``` +130802 02:51:02 xtrabackup: completed OK! +``` + +Now the files in `/data/backup/` is ready to be used by the server. + +**NOTE**: *Percona XtraBackup* does not automatically remove the compressed +files. In +order to clean up the backup directory users should remove the `\*.qp` +files. + +## Restoring the backup + +Once the backup has been prepared you can use the `--copy-back` to +restore the backup. + +``` +$ xtrabackup --copy-back --target-dir=/data/backup/ +``` + +This will copy the prepared data back to its original location as defined +by the +`datadir` variable in the `my.cnf` file. + +After the confirmation message, you should check the file permissions after +copying the data back. + +``` +130802 02:58:44 xtrabackup: completed OK! +``` + +You may need to adjust the file permissions. The following example +demonstrates +how to do it recursively by using **chown**: + +``` +$ chown -R mysql:mysql /var/lib/mysql +``` + +Now, your data directory contains the restored data. You are +ready to start the server. diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_full.md b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_full.md new file mode 100644 index 000000000000..91bed4ce5edb --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_full.md @@ -0,0 +1,35 @@ +# Making a Full Backup + +Backup the InnoDB data and log files located in `/var/lib/mysql/` to +`/data/backups/mysql/` (destination). Then, prepare the backup files to be +ready to restore or use (make the data files consistent). + +### Making a backup + +``` +$ xtrabackup --backup --target-dir=/data/backup/mysql/ +``` + +### Preparing the backup twice + +``` +$ xtrabackup --prepare --target-dir=/data/backup/mysql/ +$ xtrabackup --prepare --target-dir=/data/backup/mysql/ +``` + +### Success Criteria + +* The exit status of xtrabackup is 0. + + +* In the second `--prepare` step, you should see InnoDB print messages + similar to `Log file ./ib_logfile0 did not exist: new to be created`, + followed by a line indicating the log file was created (creating new logs + is + the purpose of the second preparation). + +**NOTE**: You might want to set the `--use-memory` option to a value close +to the size of your buffer pool, if you are on a dedicated server that has +enough free memory. The [xtrabackup Option reference](https://docs.percona.com/percona-xtrabackup/latest/xtrabackup_bin/xbk_option_reference.html#xbk-option-reference) contains more details. + +Review [Full Backups](https://docs.percona.com/percona-xtrabackup/latest/backup_scenarios/full_backup.html#creating-a-backup) for a more detailed explanation. diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_inc.md b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_inc.md new file mode 100644 index 000000000000..0515ae9a1e1d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_inc.md @@ -0,0 +1,75 @@ +# Making an Incremental Backup + +Backup all InnoDB data and log files - located in `/var/lib/mysql/` - +**once**, then make two daily incremental backups in `/data/backups/mysql/` +(destination). Finally, prepare the backup files to be ready to restore or +use. + +## Create one full backup + +Making an incremental backup requires a full backup as a base: + +``` +xtrabackup --backup --target-dir=/data/backups/mysql/ +``` + +It is important that you **do not run** the `--prepare` command yet. + +## Create two incremental backups + +Suppose the full backup is on Monday, and you will create an incremental +one on Tuesday: + +``` +xtrabackup --backup --target-dir=/data/backups/inc/tue/ \ + --incremental-basedir=/data/backups/mysql/ +``` + +and the same policy is applied on Wednesday: + +``` +xtrabackup --backup --target-dir=/data/backups/inc/wed/ \ + --incremental-basedir=/data/backups/inc/tue/ +``` + +## Prepare the base backup + +Prepare the base backup (Monday’s backup): + +``` +xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/ +``` + +## Roll forward the base data to the first increment + +Roll Monday’s data forward to the state on Tuesday: + +``` +xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/ \ + --incremental-dir=/data/backups/inc/tue/ +``` + +## Roll forward again to the second increment + +Roll forward again to the state on Wednesday: + +``` +xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/ \ + --incremental-dir=/data/backups/inc/wed/ +``` + +## Prepare the whole backup to be ready to use + +Create the new logs by preparing it: + +``` +xtrabackup --prepare --target-dir=/data/backups/mysql/ +``` + +## Notes + +* You might want to set the `--use-memory` to speed up the process if you + are on a dedicated server that has enough free memory. See + [xtrabackup Option Reference](https://docs.percona.com/percona-xtrabackup/latest/xtrabackup_bin/xbk_option_reference.html) + +* See [Incremental Backups](https://docs.percona.com/percona-xtrabackup/latest/xtrabackup_bin/incremental_backups.html) diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_partition.md b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_partition.md new file mode 100644 index 000000000000..28ddf6d70b03 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_partition.md @@ -0,0 +1,100 @@ +# Backing Up and Restoring Individual Partitions + +Percona XtraBackup lets you back up +individual partitions because partitions are regular tables with specially formatted names. The only +requirement for this feature is having the innodb_file_per_table option +enabled in the server. + +There is one caveat about using this kind of backup: you can not copy back +the prepared backup. Restoring partial backups should be done by importing the +tables. + +## Creating the backup + +There are three ways of specifying which part of the whole data will be backed +up: regular expressions ( –tables), enumerating the +tables in a file (–tables) or providing a list of +databases (–databases). + +The regular expression provided to this option will be matched against the fully +qualified database name and table name, in the form of +`database-name.table-name`. + +If the partition 0 is not backed up, Percona XtraBackup cannot generate a .cfg file. MySQL 8.0 stores the table metadata in partition 0. + +For example, this operation takes a back-up of the partition `p4` from +the table `name` located in the database `imdb`: + +``` +xtrabackup --tables=^imdb[.]name#p#p4 --backup +``` + +If partition 0 is not backed up, the following errors may occur: + +``` +xtrabackup: export option not specified +xtrabackup: error: cannot find dictionary record of table imdb/name#p#p4 +``` + +Note that this option is passed to `xtrabackup --tables` and is matched +against each table of each database, the directories of each database will be +created even if they are empty. + +## Preparing the backup + +For preparing partial backups, the procedure is analogous to restoring +individual tables apply the logs and use xtrabackup –export: + +``` +xtrabackup --apply-log --export /mnt/backup/2012-08-28_10-29-09 +``` + +You may see warnings in the output about tables that do not exist. This is +because *InnoDB*-based engines stores its data dictionary inside the tablespace +files. *xtrabackup* removes the missing tables (those that haven’t been selected in the partial +backup) from the data dictionary in order to avoid future warnings or errors. + +## Restoring from the backups + +Restoring should be done by importing the tables in the partial backup to the +server. + +First step is to create new table in which data will be restored. + +``` +CREATE TABLE `name_p4` ( +`id` int(11) NOT NULL AUTO_INCREMENT, +`name` text NOT NULL, +`imdb_index` varchar(12) DEFAULT NULL, +`imdb_id` int(11) DEFAULT NULL, +`name_pcode_cf` varchar(5) DEFAULT NULL, +`name_pcode_nf` varchar(5) DEFAULT NULL, +`surname_pcode` varchar(5) DEFAULT NULL, +PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2812744 DEFAULT CHARSET=utf8 +``` + +**NOTE**: Generate a [.cfg metadata file](https://dev.mysql.com/doc/refman/8.0/en/innodb-table-import.html) by running `FLUSH TABLES ... FOR EXPORT`. The command can only be run on a table, not on the individual table partitions. +The file is located in the table schema directory and is used for schema verification when importing the tablespace. + +To restore the partition from the backup, the tablespace must be discarded for +that table: + +``` +ALTER TABLE name_p4 DISCARD TABLESPACE; +``` + +The next step is to copy the .exp and ibd files from the backup to the MySQL data directory: + +``` +cp /mnt/backup/2012-08-28_10-29-09/imdb/name#p#p4.exp /var/lib/mysql/imdb/name_p4.exp +cp /mnt/backup/2012-08-28_10-29-09/imdb/name#P#p4.ibd /var/lib/mysql/imdb/name_p4.ibd +``` + +**NOTE**: Make sure that the copied files can be accessed by the user running MySQL. + +The last step is to import the tablespace: + +``` +ALTER TABLE name_p4 IMPORT TABLESPACE; +``` diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_stream.md b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_stream.md new file mode 100644 index 000000000000..12e3360150ef --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/recipes_xbk_stream.md @@ -0,0 +1,27 @@ +# Make a Streaming Backup + +Stream mode sends the backup to `STDOUT` in the `xbstream` format instead +of +copying it to the directory named by the first argument. You can pipe the +output +to a local file, or, across the network, to another server. + +To extract the resulting `xbstream` file, you **must** use the `xbstream` +utility: `xbstream -x < backup.xbstream`. + +### Examples of Using `xbstream` + +| Action | Command | +|---------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Stream the backup into an archived named `backup.xbstream` | `$ xtrabackup --backup --stream=xbstream ./ > backup.xbstream` | +| Stream the backup into a compressed archive named `backup.xbstream` | `$ xtrabackup --backup --stream=xbstream --compress ./ > backup.xbstream` | +| Encrypt the backup | `$ xtrabackup --backup --stream=xbstream ./ > backup.xbstream gzip -`` | openssl des3 -salt -k “password” backup.xbstream.gz.des3` | +| Send the backup to another server and unpack it | `$ xtrabackup --backup --compress --stream=xbstream ./| ssh user@otherhost “xbstream -x”` | +| Send the backup to another server using `netcat` | On the destination host:
    `$ nc -l 9999 | cat - > /data/backups/backup.xbstream`

    On the source host:
    `$ xtrabackup --backup --stream=xbstream ./ | nc desthost 9999` | +| Send the backup to another server using a one-liner | `$ ssh user@desthost “( nc -l 9999 > /data/backups/backup.xbstream & )” && xtrabackup --backup --stream=xbstream ./| nc desthost 9999` | +| Throttle the throughput to 10MB/sec using the [pipe viewer](https://www.ivarch.com/programs/quickref/pv.shtml) tool | `$ xtrabackup --backup --stream=xbstream ./ | pv -q -L10m ssh user@desthost “cat - > /data/backups/backup.xbstream”` | +| Checksum the backup during the streaming | On the destination host:
    `$ nc -l 9999 | tee >(sha1sum > destination_checksum) > /data/backups/backup.xbstream`

    On the source host:
    `$ xtrabackup --backup --stream=xbstream ./ | tee >(sha1sum > source_checksum) | nc desthost 9999`

    Compare the checksums on the source host:
    `$ cat source_checksum 65e4f916a49c1f216e0887ce54cf59bf3934dbad`

    Compare the checksums on the destination host:
    `$ cat destination_checksum 65e4f916a49c1f216e0887ce54cf59bf3934dbad` | +| Parallel compression with parallel copying backup | `$ xtrabackup --backup --compress --compress-threads=8 --stream=xbstream --parallel=4 ./ > backup.xbstream` | + + + diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/setting_up_replication.md b/storage/innobase/xtrabackup/doc/docs/howtos/setting_up_replication.md new file mode 100644 index 000000000000..ba579c8b367c --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/setting_up_replication.md @@ -0,0 +1,347 @@ +# How to set up a replica for replication in 6 simple steps with Percona XtraBackup + +Data is, by far, the most valuable part of a system. Having a backup done +systematically and available for a rapid recovery in case of failure is +admittedly essential to a system. However, it is not common practice +because of +its costs, infrastructure needed or even the boredom associated to the +task. Percona XtraBackup is designed to solve this problem. + +You can have almost real-time backups in 6 simple steps by setting up a +replication environment with Percona XtraBackup. + +## All the things you will need + +Setting up a replica for replication with *Percona XtraBackup* is a +straightforward procedure. In order to keep it simple, here is a list of +the +things you need to follow the steps without hassles: + +`Source` + + A system with a *MySQL*-based server installed, configured and running. This + system will be called `Source`, as it is where your data is stored and + the one to be replicated. We will assume the following about this system: + + + * the *MySQL* server is able to communicate with others by the standard TCP/IP port; + + + * the *SSH* server is installed and configured; + + + * you have a user account in the system with the appropriate permissions; + + + * you have a MySQL’s user account with appropriate privileges. + + + * server has binlogs enabled and server-id set up to 1. + +`Replica` + + Another system, with a *MySQL*-based server installed on it. We + will refer to this machine as `Replica` and we will assume the same things + we did about `Source`, except that the server-id on `Replica` is 2. + +`Percona XtraBackup` + + The backup tool we will use. It should be installed in both computers for convenience. + +**NOTE**: It is not recommended to mix MySQL variants (Percona Server, +MySQL) in your +replication setup. This may produce incorrect `xtrabackup_slave_info` +file when adding a new replica. + +## Version updates + +The 8.0.23 version deprecates the `CHANGE_MASTER_TO` command. In that +version and later, use +the [CHANGE_REPLICATION_SOURCE_TO and the appropriate options](https://dev.mysql.com/doc/refman/8.0/en/change-replication-source-to.html) instead. + +The 8.0.22 version deprecates the`START SLAVE` command. In that version or +later, use `START REPLICA` instead. + + +## STEP 1: Make a backup on the `Source` and prepare it + +At the `Source`, issue the following to a shell: + +``` +$ xtrabackup --backup --user=yourDBuser --password=MaGiCdB1 --target-dir=/path/to/backupdir +``` + +After this is finished you should get: + +``` +xtrabackup: completed OK! +``` + +This will make a copy of your *MySQL* data dir +to the `/path/to/backupdir` directory. +You have told *Percona XtraBackup* to connect to the database server +using your database user and password, +and do a hot backup of all your data in it +(all *MyISAM*, *InnoDB* tables and indexes in them). + +In order for snapshot to be consistent you need to prepare the data on the +source: + +``` +$ xtrabackup --user=yourDBuser --password=MaGiCdB1 \ + --prepare --target-dir=/path/to/backupdir +``` + +You need to select path where your snapshot has been taken. +If everything is ok you should get the same OK message. +Now the transaction logs are applied to the data files, +and new ones are created: +your data files are ready to be used by the MySQL server. + +*Percona XtraBackup* knows where your data is by reading your my.cnf file. +If you have your configuration file in a non-standard place, +you should use the flag `--defaults-file` `=/location/of/my.cnf`. + +If you want to skip writing the username and password +every time you want to access *MySQL*, +you can set it up in `.mylogin.cnf` as follows: + +``` +mysql_config_editor set --login-path=client --host=localhost --user=root --password +``` + +For more information, see MySQL Configuration +Utility . + +This statement provides root access to MySQL. + +## STEP 2: Copy backed up data to the Replica + +On the Source, use rsync or scp to copy the data from the Source to the +Replica. If you are syncing the data directly to replica’s data directory, +we recommend that you stop the `mysqld` there. + +``` +$ rsync -avpP -e ssh /path/to/backupdir Replica:/path/to/mysql/ +``` + +After data has been copied, you can back up the original or previously +installed *MySQL* datadir (**NOTE**: Make sure mysqld is shut down before +you move the contents of its datadir, or move the snapshot into its +datadir.). Run the following commands on the Replica: + +``` +$ mv /path/to/mysql/datadir /path/to/mysql/datadir_bak +``` + +and move the snapshot from the `Source` in its place: + +``` +$ xtrabackup --move-back --target-dir=/path/to/mysql/backupdir +``` + +After you copy data over, make sure the Replica *MySQL* has the proper +permissions to access them. + +``` +$ chown mysql:mysql /path/to/mysql/datadir +``` + +If the ibdata and iblog files are located in directories outside the +datadir, you must put these files in their proper place after the logs have +been applied. + +## STEP 3: Configure the Source’s MySQL server + +On the source, run the following command to add the appropriate grant. This +grant allows the replica to be able to connect to source: + +``` +> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'$replicaip' +IDENTIFIED BY '$replicapass'; +``` + +Also make sure that firewall rules are correct and that the `Replica` can +connect to the `Source`. Run the following command on the Replica to test +that you can run the mysql client on `Replica`, connect to the `Source`, +and authenticate. + +``` +$ mysql --host=Source --user=repl --password=$replicapass +``` + +Verify the privileges. + +``` +mysql> SHOW GRANTS; +``` + +## STEP 4: Configure the Replica’s MySQL server + +Copy the `my.cnf` file from the `Source` to the `Replica`: + +``` +$ scp user@Source:/etc/mysql/my.cnf /etc/mysql/my.cnf +``` + +and change the following options in /etc/mysql/my.cnf: + +``` +server-id=2 +``` + +and start/restart mysqld on the `Replica`. + +In case you’re using init script on Debian-based system to start mysqld, be +sure that the password for `debian-sys-maint` user has been updated, and +it’s the same as that user’s password on the `Source`. Password can be seen +and updated in `/etc/mysql/debian.cnf`. + +## STEP 5: Start the replication + +On the `Replica`, review the content of the file `xtrabackup_binlog_info`, +it will be something like: + +``` + $ cat /var/lib/mysql/xtrabackup_binlog_info +Source-bin.000001 481 +``` + +[The term `master` is deprecated](#version-updates). Do the following on a +MySQL console and use the username and +password you’ve set up in STEP 3 : + +* Version 8.0.23 or later, use the `CHANGE_REPLICATION_SOURCE_TO` statement + +* Before 8.0.23, use the `CHANGE MASTER` statement + + +``` +CHANGE REPLICATION SOURCE TO + SOURCE_HOST='$sourceip', + SOURCE_USER='repl', + SOURCE_PASSWORD='$replicapass', + SOURCE_LOG_FILE='Source-bin.000001', + SOURCE_LOG_POS=481; +``` + +Start the replica: + +``` +START REPLICA; +``` + +The [term `slave` is deprecated](#version-updates). Do the following: + +* Version 8.0.22 or later, use `START REPLICA` +* Before version 8.0.22, use `START SLAVE` + +## STEP 6: Check + +On the `Replica`, check that everything went OK with: + +``` +SHOW REPLICA STATUS\G +``` + +The result shows the status: + +``` +Slave_IO_Running: Yes +Slave_SQL_Running: Yes +Seconds_Behind_Master: 13 +``` + +Both `IO` and `SQL` threads need to be running. The `Seconds_Behind_Master` +means the `SQL` currently being executed has a `current_timestamp` of 13 +seconds ago. It is an estimation of the lag between the `Source` and +the `Replica`. Note that at the beginning, a high value could be shown +because the `Replica` has to “catch up” with the `Source`. + +## Adding more replicas to the Source + +You can use this procedure with slight variation to add new replicas to a +source. We will use *Percona XtraBackup* to clone an already configured +replica. We will continue using the previous scenario for convenience, but +we will add a `NewReplica` to the plot. + +At the `Replica`, do a full backup: + +``` +$ xtrabackup --user=yourDBuser --password=MaGiCiGaM \ + --backup --slave-info --target-dir=/path/to/backupdir +``` + +By using the `--slave-info` *Percona XtraBackup* creates additional file +called `xtrabackup_slave_info`. + +Apply the logs: + +``` +$ xtrabackup --prepare --use-memory=2G --target-dir=/path/to/backupdir/ +``` + +Copy the directory from the `Replica` to the `NewReplica` (**NOTE**: Make +sure mysqld is shut down on the `NewReplica` before you copy the contents +the snapshot into its datadir.): + +``` +rsync -avprP -e ssh /path/to/backupdir NewReplica:/path/to/mysql/datadir +``` + +For example, to set up a new user, `user2`, you add another grant on +the Source: + +``` +> GRANT REPLICATION SLAVE ON *.* TO 'user2'@'$newreplicaip' + IDENTIFIED BY '$replicapass'; +``` + +On the `NewReplica`, copy the configuration file from the `Replica`: + +``` +$ scp user@Replica:/etc/mysql/my.cnf /etc/mysql/my.cnf +``` + +Make sure you change the server-id variable in `/etc/mysql/my.cnf` to 3 and +disable the replication on start: + +``` +skip-slave-start +server-id=3 +``` + +After setting `server_id`, start **mysqld**. + +Fetch the master_log_file and master_log_pos from the +file `xtrabackup_slave_info`, execute the statement for setting up the +source and the log file for the NewReplica: + +``` +> CHANGE MASTER TO + MASTER_HOST='$Sourceip', + MASTER_USER='repl', + MASTER_PASSWORD='$replicapass', + MASTER_LOG_FILE='Source-bin.000001', + MASTER_LOG_POS=481; +``` + +[The term `master` is deprecated](#version-updates). Do the following +and then start the replica: + +* Version 8.0.23 or later, use the `CHANGE_REPLICATION_SOURCE_TO` statement + +* Before 8.0.23, use the `CHANGE MASTER` statement + +[The term `slave` is deprecated](#version-updates). Do the following: + +* Version 8.0.22 or later, use `START REPLICA`. +* Before version 8.0.22, use `START SLAVE` + +``` +> START REPLICA; +``` + + +If both IO and SQL threads are running when you check the `NewReplica`, +server is replicating the `Source`. diff --git a/storage/innobase/xtrabackup/doc/docs/howtos/ssh_server.md b/storage/innobase/xtrabackup/doc/docs/howtos/ssh_server.md new file mode 100644 index 000000000000..0d8753e1cbab --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/howtos/ssh_server.md @@ -0,0 +1,19 @@ +# Installing and configuring an SSH server + +Many Linux distributions only install the ssh client by default. If you +don’t have the ssh server installed already, the easiest way of doing it is +by using your distribution’s packaging system: + +Using apt, run the following: + +``` bash + $ sudo apt install openssh-server +``` + +Using Red Hat Linux or a derivative, use the following: + +```bash + $ sudo yum install openssh-server +``` + +Review your distribution’s documentation on how to configure the server. diff --git a/storage/innobase/xtrabackup/doc/docs/index.md b/storage/innobase/xtrabackup/doc/docs/index.md new file mode 100644 index 000000000000..b532e767be36 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/index.md @@ -0,0 +1,174 @@ + +# Percona XtraBackup - Documentation + +*Percona XtraBackup* is an open-source hot backup utility, for +*MySQL* - based servers, that does not lock your database during the +backup. + +Whether it is a 24x7 highly loaded server or a low-transaction-volume +environment, *Percona XtraBackup* is designed to make backups a seamless +procedure without disrupting the performance of the server in a production +environment. [Commercial support contracts are available](http://www.percona.com/mysql-support/). + +*Percona XtraBackup* can back up data from *InnoDB*, *XtraDB*, +*MyISAM*, and MyRocks tables on *MySQL* 8.0 servers as well as *Percona Server for MySQL* +with *XtraDB*, *Percona Server for MySQL* 8.0, and *Percona XtraDB Cluster* 8.0. + +**_Version Updates_** + +Version 8.0.6 and later supports the MyRocks storage engine. +An incremental backup on the MyRocks storage engine does not +determine if an earlier full or incremental backup +contains the same files. **Percona XtraBackup** copies all +MyRocks files each time it takes a backup. +**Percona +XtraBackup** does not support the TokuDB storage engine. + +_See Also_ [Percona TokuBackup](https://docs.percona.com/percona-server/latest/tokudb/toku_backup.html) + +*Percona XtraBackup* 8.0 does not support making backups of databases +created in versions prior to 8.0 of *MySQL*, *Percona Server for MySQL* or +*Percona XtraDB Cluster*. As the changes that *MySQL* 8.0 introduced +in *data dictionaries*, *redo log* and *undo log* are incompatible +with previous versions, it is currently impossible for *Percona XtraBackup* 8.0 to also support versions prior to 8.0. + +Due to changes in MySQL 8.0.20 released by Oracle at the end of April 2020, +*Percona XtraBackup* 8.0, up to version 8.0.11, is not compatible with MySQL version 8.0.20 or +higher, or Percona products that are based on it: Percona Server for MySQL and +Percona XtraDB Cluster. + +For more information, see [Percona XtraBackup 8.x and MySQL 8.0.20](https://www.percona.com/blog/2020/04/28/percona-xtrabackup-8-x-and-mysql-8-0-20/) + +For a high-level overview of many of its advanced features, including +a feature comparison, please see [About Percona XtraBackup](intro.md). + +## Introduction + +* [About Percona XtraBackup](intro.md) + +* [How *Percona XtraBackup* Works](how_xtrabackup_works.md) + +## Installation + +* [Installing *Percona XtraBackup* on *Debian* and *Ubuntu*](installation/apt_repo.md) + +* [Installing *Percona XtraBackup* on *Red Hat Enterprise Linux* and *CentOS*](installation/yum_repo.md) + +* [Installing *Percona XtraBackup* from a Binary Tarball](installation/binary-tarball.md) + +* [Compiling and Installing from Source Code](installation/compiling_xtrabackup.md) + +## Run in Docker + +* [Running Percona XtraBackup in a Docker container](installation/docker.md) + +## How Percona XtraBackup works + +* [Implementation Details](xtrabackup_bin/implementation_details.md) + +* [Connection and Privileges Needed](using_xtrabackup/privileges.md) + +* [Configuring xtrabackup](using_xtrabackup/configuring.md) + +* [Server Version and Backup Version Comparison](using_xtrabackup/comparison.md) + +* [*xtrabackup* Exit Codes](xtrabackup_bin/xtrabackup_exit_codes.md) + +## Backup Scenarios + +* [The Backup Cycle - Full Backups](backup_scenarios/full_backup.md) + +* [Incremental Backup](backup_scenarios/incremental_backup.md) + +* [Compressed Backup](backup_scenarios/compressed_backup.md) + +* [Partial Backups](xtrabackup_bin/partial_backups.md) + +## User’s Manual + +* [*Percona XtraBackup* User Manual](manual.md) + +## Advanced Features + +* [Throttling Backups](advanced/throttling_backups.md) + +* [Encrypted InnoDB tablespace backups](advanced/encrypted_innodb_tablespace_backups.md) + +* [Encrypting Backups](xtrabackup_bin/backup.encrypting.md) + +* [LRU dump backup](xtrabackup_bin/lru_dump.md) + +* [Point-In-Time recovery](xtrabackup_bin/point-in-time-recovery.md) + +* [Working with Binary Logs](xtrabackup_bin/working_with_binary_logs.md) + +* [Improved Log statements](advanced/log_enhancements.md) + +## Security + +* [Working with SELinux](security/pxb-selinux.md) + +* [Working with AppArmor](security/pxb-apparmor.md) + +## Auxiliary guides + +* [Enabling the server to communicate via TCP/IP](howtos/enabling_tcp.md) + +* [Installing and configuring an SSH server](howtos/ssh_server.md) + +* [Analyzing table statistics](xtrabackup_bin/analyzing_table_statistics.md) + +* [`FLUSH TABLES WITH READ LOCK` option](xtrabackup_bin/flush-tables-with-read-lock.md) + +* [`lock-ddl-per-table` option improvements](advanced/locks.md) + +* [Incremental backup using page tracking](advanced/page_tracking.md) + +## xbcloud Binary + +* [The xbcloud Binary](xbcloud/xbcloud.md) + +* [Using the xbcloud Binary with Swift](xbcloud/xbcloud_swift.md) + +* [Using xbcloud Binary with Amazon S3](xbcloud/xbcloud_s3.md) + +* [Using the xbcloud Binary with MinIO](xbcloud/xbcloud_minio.md) + +* [Using the xbcloud with Google Cloud Storage](xbcloud/xbcloud_gcs.md) + +* [Exponential Backoff](xbcloud/xbcloud_exbackoff.md) + +* [Using the xbcloud binary with Microsoft Azure Cloud Storage](xbcloud/xbcloud_azure.md) + +## Tutorials, Recipes, How-tos + +* [Recipes for xtrabackup](how-tos.md#recipes-xbk) + +* [How-Tos](how-tos.md#howtos) + +## Release notes + +* [*Percona XtraBackup* 8.0 Release Notes](release-notes.md) + +## Error message descriptions + +* [Error Message: Found tables with row version due to INSTANT ADD/DROP columns](em/instant.md) + +## References + +* [The **xtrabackup** Option Reference](xtrabackup_bin/xbk_option_reference.md) + +* [The xbcrypt binary](xbcrypt/xbcrypt.md) + +* [The xbstream binary](xbstream/xbstream.md) + +* [Frequently Asked Questions](faq.md) + +* [Glossary](glossary.md) + +* [Index of files created by Percona XtraBackup](xtrabackup-files.md) + +* [Trademark Policy](trademark-policy.md) + +* [Version checking](version-check.md) + diff --git a/storage/innobase/xtrabackup/doc/docs/installation/apt_repo.md b/storage/innobase/xtrabackup/doc/docs/installation/apt_repo.md new file mode 100644 index 000000000000..ca3b60c09f67 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/installation/apt_repo.md @@ -0,0 +1,153 @@ +# Installing Percona XtraBackup on Debian and Ubuntu + +Ready-to-use packages are available from the *Percona XtraBackup* software +repositories and +the [download page](https://www.percona.com/downloads/XtraBackup/). + +Specific information on the supported platforms, products, and versions is +described +in [Percona Release Lifecycle Overview](https://www.percona.com/services/policies/percona-software-platform-lifecycle#mysql) +. + +## What’s in each DEB package? + +The `percona-xtrabackup-80` package contains the latest *Percona +XtraBackup* +GA binaries and associated files. + +The `percona-xtrabackup-dbg-80` package contains the debug symbols for +binaries in `percona-xtrabackup-80`. + +The `percona-xtrabackup-test-80` package contains the test suite for +*Percona XtraBackup*. + +The `percona-xtrabackup` package contains the older version of the +*Percona XtraBackup*. + +## Installing *Percona XtraBackup* via *percona-release* + +*Percona XtraBackup*, like many other *Percona* products, is installed +with the *percona-release* package configuration tool. + +1. Download a deb package for *percona-release* the repository packages + from Percona web: + +``` +$ wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb +``` + +2. Install the downloaded package with **dpkg**. To do that, run the + following commands as root or with ** + sudo**: `dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb` + +Once you install this package the Percona repositories should be added. You +can check the repository setup in the +`/etc/apt/sources.list.d/percona-release.list` file. + +3. Enable the repository: `percona-release enable-only tools release` + +If *Percona XtraBackup* is intended to be used in combination with +the upstream MySQL Server, you only need to enable the `tools` +repository: `percona-release enable-only tools`. + +4. Remember to update the local cache: `apt update` + + +5. After that you can install the `percona-xtrabackup-80` package: + +``` +$ sudo apt install percona-xtrabackup-80 +``` + +6. In order to make compressed backups, install the `qpress` package: + +``` +$ sudo apt install qpress +``` + +**NOTE**: For AppArmor profile information, see [Working with AppArmor](https://docs.percona.com/percona-xtrabackup/8.0/security/pxb-apparmor.html). + +## Apt-Pinning the packages + +In some cases you might need to “pin” the selected packages to avoid the +upgrades from the distribution repositories. Make a new file +`/etc/apt/preferences.d/00percona.pref` and add the following lines in +it: + +``` +Package: * +Pin: release o=Percona Development Team +Pin-Priority: 1001 +``` + +For more information about the pinning, check the official +[debian wiki](http://wiki.debian.org/AptPreferences). + +## Installing *Percona XtraBackup* using downloaded deb packages + +Download the packages of the desired series for your architecture +from [Download Percona XtraBackup 8.0](https://www.percona.com/downloads/XtraBackup/) +. The following +example downloads *Percona XtraBackup* 8.0.26-18 release package for Ubuntu +20.04: + +``` +$ wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.26-18/binary/debian/focal/x86_64/percona-xtrabackup-80_8.0.26-18-1.focal_amd64.deb +``` + +Install *Percona XtraBackup* by running: + +``` +$ sudo dpkg -i percona-xtrabackup-80_8.0.26-18-1.focal_amd64.deb +``` + +**NOTE**: When installing packages manually like this, resolve all the +dependencies and install missing packages yourself. + +## Update the Curl utility in Debian 10 + +The default curl version, 7.64.0, in Debian 10 has known issues when +attempting to reuse an already closed connection. This issue directly +affects `xbcloud` and users may see intermittent backup failures. + +For more details, +see [curl #3750](https://github.com/curl/curl/issues/3750) +or [curl #3763](https://github.com/curl/curl/pull/3763). + +Follow these steps to upgrade curl to version 7.74.0: + +1. Edit the `/etc/apt/sources.list` to add the following: + +``` +deb http://ftp.de.debian.org/debian buster-backports main +``` + +2. Refresh the `apt` sources: + +``` +sudo apt update +``` + +3. Install the version from `buster-backports`: + +``` +$ sudo apt install curl/buster-backports +``` + +4. Verify the version number: + +``` +$ curl --version +curl 7.74.0 (x86_64-pc-linux-gnu) libcurl/7.74.0 +``` + +## Uninstalling *Percona XtraBackup* + +To uninstall *Percona XtraBackup*, remove all the installed +packages. + +1. Remove the packages + +``` +$ sudo apt remove percona-xtrabackup-80 +``` diff --git a/storage/innobase/xtrabackup/doc/docs/installation/binary-tarball.md b/storage/innobase/xtrabackup/doc/docs/installation/binary-tarball.md new file mode 100644 index 000000000000..d8d74ba5ae9d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/installation/binary-tarball.md @@ -0,0 +1,28 @@ +# Installing Percona XtraBackup from a Binary Tarball + +**Percona** provides binary tarballs of **Percona XtraBackup**. Binary tarballs +contain precompiled executable files, libraries, and other dependencies and are +compressed `tar` archives. Extract the binary tarballs to any path. + +Binary tarballs are available for [download](https://www.percona.com/downloads/Percona-XtraBackup-LATEST/) and installation. + +The following table lists the tarball types available in `Linux - Generic`. Select the *Percona XtraBackup* 8.0 version, the software or the operating system, and the type of tarball for your installation. Binary tarballs support all distributions. + +After you have downloaded the binary tarballs, extract the tarball in the file location of your choice. + +| Type | Name | Operating systems | Description | +|--------------|---------------------------------------------------------------------------|----------------------------------------------------------|----------------------------------------------------------------------------------------| +| Full | percona-xtrabackup--Linux.x86_64.glibc2.12.tar.gz | Built for CentOS 6 | Contains binary files, libraries, test files, and debug symbols | +| Minimal | percona-xtrabackup--Linux.x86_64.glibc2.12-minimal.tar.gz | Built for CentOS 6 | Contains binary files, and libraries but does not include test files, or debug symbols | | | | +| Full | percona-xtrabackup--Linux.x86_64.glibc2.17.tar.gz | Compatible with any operating system except for CentOS 6 | Contains binary files, libraries, test files, and debug symbols | +| Minimal | percona-xtrabackup--Linux.x86_64.glibc2.17-minimal.tar.gz | Compatible with any operating system except for CentOS 6 | Contains binary files, and libraries but does not include test files, or debug symbols | | | | + +Select a different software, such as Ubuntu 20.04 (Focal Fossa), for a +tarball for that operating system. You can download the packages together or separately. + +The following command is an example of downloading the full tarball for +Linux/Generic: + +``` bash +$ wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.23-16/binary/tarball/percona-xtrabackup-8.0.23-16-Linux-x86_64.glibc2.17.tar.gz +``` diff --git a/storage/innobase/xtrabackup/doc/docs/installation/compiling_xtrabackup.md b/storage/innobase/xtrabackup/doc/docs/installation/compiling_xtrabackup.md new file mode 100644 index 000000000000..2f71d8700071 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/installation/compiling_xtrabackup.md @@ -0,0 +1,188 @@ +# Compiling and Installing from Source Code + +The source code is available from the [*Percona XtraBackup GitHub* project](https://github.com/percona/percona-xtrabackup). The easiest way to get the +code is by using the **git clone** command. Then, switch to the release +branch that you want to install, such as **8.0**. + +``` bash +$ git clone https://github.com/percona/percona-xtrabackup.git +$ cd percona-xtrabackup +$ git checkout 8.0 +$ git submodule update --init --recursive +``` + +## Step 1: Installing prerequisites + +The following packages and tools must be installed to compile *Percona XtraBackup* from source. +These might vary from system to system. + +**Important** + + To build **Percona XtraBackup 8.0 from source, you must use `cmake` + version 3. To check which version is + currently installed, run `cmake --version` at a command prompt. If the + version is not `3`, install `cmake3`. + +This `cmake` version may be available +in your distribution as a separate package `cmake3`. For more information, see [cmake.org](https://cmake.org/) + +### Debian or Ubuntu using `apt` + +``` +sudo apt install bison pkg-config cmake devscripts debconf \ +debhelper automake bison ca-certificates \ +libcurl4-openssl-dev cmake debhelper libaio-dev \ +libncurses-devlibssl-dev libtool libz-dev libgcrypt-dev libev-dev \ +lsb-release python-docutils build-essential rsync \ +libdbd-mysql-perl libnuma1 socat librtmp-dev libtinfo5 \ +qpress liblz4-tool liblz4-1 liblz4-dev vim-common +``` + +To install the man pages, install the python3-sphinx package first: + +``` +$ sudo apt install python3-sphinx +``` + +### CentOS or Red Hat using `yum` + +*Percona Xtrabackup* requires GCC version 5.3 or higher. If the +version of GCC installed on your system is lower then you may need to +install and enable [the Developer Toolset](https://developers.redhat.com/products/developertoolset/overview) on +`RPM`-based distributions to make sure that you use the latest GCC +compiler and development tools. Then, install `cmake` and other +dependencies: + +``` +$ sudo yum install cmake openssl-devel libaio libaio-devel automake autoconf \ +bison libtool ncurses-devel libgcrypt-devel libev-devel libcurl-devel zlib-devel \ +vim-common +``` + +To install the man pages, install the python3-sphinx package first: + +``` +$ sudo yum install python3-sphinx +``` + +## Step 2: Generating the build pipeline + +At this step, you have `cmake` run the commands in the `CMakeList.txt` +file to generate the build pipeline, i.e. a native build environment that will +be used to compile the source code). + + +1. Change to the directory where you cloned the Percona XtraBackup repository + +``` +$ cd percona-xtrabackup +``` + + +2. Create a directory to store the compiled files and then change to that +directory: + +``` +$ mkdir build +$ cd build +``` + + +3. Run cmake or cmake3. In either case, the options you need to use are the +same. + +**NOTE**: You can build *Percona XtraBackup* with man pages but this requires +`python-sphinx` package which isn’t available from that main repositories +for every distribution. If you installed the `python-sphinx` package you +need to remove the `-DWITH_MAN_PAGES=OFF` from previous command. + +``` +$ cmake -DWITH_BOOST=PATH-TO-BOOST-LIBRARY -DDOWNLOAD_BOOST=ON \ +-DBUILD_CONFIG=xtrabackup_release -DWITH_MAN_PAGES=OFF -B .. +``` + +### Parameter Information + +| **Parameter** | **Description** | +|--------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `DWITH_BOOST` | For the `-DWITH_BOOST` parameter, specify the name of a directory to download the boost library to. This directory is created automatically in your current directory. | +| `-B` (build | **Percona XtraBackup** is configured to forbid generating the build pipeline for make in the same directory where you store your sources. The `-B` parameter refers to the directory that contains the source code. In this example, we use the relative path to the parent directory (..) | +| `-DWITH_MAN_PAGES` | To build Percona XtraBackup man pages, use ON or remove this parameter from the command line (it is ON by default). To install the man pages, install the python3-sphinx package first. | +| + + **Important** CMake Error at CMakeLists.txt:367 (MESSAGE): Please do not build in-source. Out-of source builds are highly recommended: you can have multiple builds for the same source, and there is an easy way to do cleanup, simply remove the build directory (note that ‘make clean’ or ‘make distclean’ does not work) + +You can force in-source build by invoking cmake with -DFORCE_INSOURCE_BUILD=1 + + +## Step 2: Compiling the source code + +To compile the source code in your `build` directory, use the `make` command. + + +1. Change to the `build` directory (created at +Step 2: Generating the build pipeline). + + +2. Run the `make` command. This command may take a long time to complete. + +``` +$ make +``` + +## Step 3: Installing on the target system + +The following command installs all *Percona XtraBackup* binaries *xtrabackup* +and tests to default location on the target system: `/usr/local/xtrabackup`. + +Run `make install` to install *Percona XtraBackup* to the default location. + +``` +$ sudo make install +``` + +### Installing to a non-default location + +You may use the `DESTDIR` parameter with `make install` to install *Percona +XtraBackup* to another location. Make sure that the effective user is able to +write to the destination you choose. + +``` +$ sudo make DESTDIR= install +``` + +In fact, the destination directory is determined by the installation layout +(`-DINSTALL_LAYOUT`) that `cmake` applies (see +Step 2: Generating the build pipeline). In addition to +the installation directory, this parameter controls a number of other +destinations that you can adjust for your system. + +By default, this parameter is set to `STANDALONE`, which implies the +installation directory to be `/usr/local/xtrabackup`. + +**See also** [MySQL Documentation: -DINSTALL_LAYOUT](https://dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html#option_cmake_install_layout) + +## Step 4: Running + +After *Percona XtraBackup* is installed on your system, you may run it by using +the full path to the `xtrabackup` command: + +``` +$ /usr/local/xtrabackup/bin/xtrabackup +``` + +Update your PATH environment variable if you would like to use the command on +the command line directly. + +``` +$# Setting $PATH on the command line +$ PATH=$PATH:/usr/local/xtrabackup/bin/xtrabackup + +$# Run xtrabackup directly +$ xtrabackup +``` + +Alternatively, you may consider placing a soft link (using `ln -s`) to one of +the locations listed in your `PATH` environment variable. + +To view the documentation with `man`, update the `MANPATH` variable. diff --git a/storage/innobase/xtrabackup/doc/docs/installation/docker.md b/storage/innobase/xtrabackup/doc/docs/installation/docker.md new file mode 100644 index 000000000000..325f6f52addc --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/installation/docker.md @@ -0,0 +1,120 @@ +# Running Percona XtraBackup in a Docker container + +Docker allows you to run applications in a lightweight unit called a +container. + +You can run *Percona XtraBackup* in a Docker container without installing +the product. All required libraries are available in +the container. Being a lightweight execution environment, Docker containers +enable creating +configurations where each program runs in a separate container. You may run +*Percona Server for MySQL* in one container and *Percona XtraBackup* in +another. Docker images offer a range of options. + +Create a Docker container based on a Docker image. Docker images for +Percona XtraBackup +are hosted publicly on [Docker Hub](https://hub.docker.com/r/percona/percona-xtrabackup). + +``` +$ sudo docker create ... percona/percona-xtrabackup --name xtrabackup ... +``` + +### Scope of this section + +This section demonstrates how to back up data +on a Percona Server for MySQL running in another Dockers container. + +## Installing Docker + +Your operating system may already provide a package for *docker*. However, +the versions of Docker provided by your operating system are likely to be +outdated. + +Use the installation instructions for your operating system available from +the +Docker site to set up the latest version of *docker*. + +## Connecting to a Percona Server for MySQL container + +Percona XtraBackup works in combination with a database server. When +running a Docker container for Percona XtraBackup, you can make +backups for a database server either installed on the host machine or +running +in a separate Docker container. + +To set up a database server on a host machine or in Docker +container, follow the documentation of the supported product that you +intend to use with *Percona XtraBackup*. + + + + +**See also:** + +> Docker volumes as +> container persistent data storage + +> More +> information about containers + +``` sh +$ sudo docker run -d --name percona-server-mysql \ +-e MYSQL_ROOT_PASSWORD=root percona/percona-server:8.0 +``` + +As soon as Percona Server for MySQL runs, add some data to it. Now, you are +ready to make backups with Percona XtraBackup. + +**Important** + +> When running Percona XtraBackup from a container and connecting to a +> MySQLserver container, we recommend using the –user root option in the +> Docker command. + +## Creating a Docker container from Percona XtraBackup image + +You can create a Docker container based on Percona XtraBackup image with +either `docker create` or the `docker run` command. `docker create` +creates a Docker container and makes it available for starting later. + +Docker downloads the Percona XtraBackup image from the Docker Hub. If it +is not the first time you use the selected image, Docker uses the image +available locally. + +``` +$ sudo docker create --name percona-xtrabackup --volumes-from percona-server-mysql \ +percona/percona-xtrabackup \ +xtrabackup --backup --datadir=/var/lib/mysql/ --target-dir=/backup \ +--user=root --password=mysql +``` + +With parameter name you give a meaningful name to your new Docker container +so +that you could easily locate it among your other containers. + +The `volumes-from` flag refers to Percona Server for MySQL and indicates +that you +intend to use the same data as the Percona Server for MySQL container. + +Run the container with exactly the same parameters that were used when the +container was created: + +``` +$ sudo docker start -ai percona-xtrabackup +``` + +This command starts the *percona-xtrabackup* container, attaches to its +input/output streams, and opens an interactive shell. + +The `docker run` is a shortcut command that creates a Docker container and +then immediately runs it. + +``` +$ sudo docker run --name percona-xtrabackup --volumes-from percona-server-mysql \ +percona/percona-xtrabackup +xtrabackup --backup --data-dir=/var/lib/mysql --target-dir=/backup --user=root --password=mysql +``` + + + + diff --git a/storage/innobase/xtrabackup/doc/docs/installation/yum_repo.md b/storage/innobase/xtrabackup/doc/docs/installation/yum_repo.md new file mode 100644 index 000000000000..62f42b14f956 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/installation/yum_repo.md @@ -0,0 +1,86 @@ +# Installing Percona XtraBackup on Red Hat Enterprise Linux and CentOS + +Ready-to-use packages are available from the *Percona XtraBackup* software +repositories and the [download page](https://www.percona.com/downloads/XtraBackup/). The Percona yum repository supports popular *RPM*-based operating systems, including the *Amazon +Linux AMI*. + +The easiest way to install the *Percona Yum* repository is to install an *RPM* +that configures yum and installs the [Percona GPG key](https://www.percona.com/downloads/RPM-GPG-KEY-percona). + +Specific information on the supported platforms, products, and versions is described in [Percona Software and Platform Lifecycle](https://www.percona.com/services/policies/percona-software-platform-lifecycle#mysql). + +## What’s in each RPM package? + +The `percona-xtrabackup-80` package contains the latest *Percona XtraBackup* +GA binaries and associated files. + +| Package + + | Contains + + | +| ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------------------------------------- | | | | | +| `percona-xtrabackup-80-debuginfo` + + | The debug symbols for binaries in `percona-xtrabackup-80` + + | +| `percona-xtrabackup-test-80` + + | The test suite for *Percona XtraBackup* + + | +| `percona-xtrabackup` + + | The older version of the *Percona XtraBackup* + + | +## Installing *Percona XtraBackup* from Percona `yum` repository + + +1. Install the Percona yum repository by running the following command as the +`root` user or with **sudo**: `yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm` + + +2. Enable the repository: `percona-release enable-only tools release` + +If *Percona XtraBackup* is intented to be used in combination with +the upstream MySQL Server, you only need to enable the `tools` +repository: `percona-release enable-only tools`. + + +3. Install *Percona XtraBackup* by running: `yum install percona-xtrabackup-80` + +**WARNING**: Make sure that you have the `libev` package installed before +installing *Percona XtraBackup* on CentOS 6. For this operating system, the +`libev` package is available from the [EPEL](https://fedoraproject.org/wiki/EPEL) repositories. + + +1. To be able to make compressed backups, install the `qpress` package: + +$ yum install qpress + +## Installing *Percona XtraBackup* using downloaded rpm packages + +Download the packages of the desired series for your architecture from the +[download page](https://www.percona.com/downloads/XtraBackup/). The following +example downloads *Percona XtraBackup* 8.0.4 release package for *CentOS* +7: + +``` +$ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm +``` + +Now you can install *Percona XtraBackup* by running `yum localinstall`: + +``` +$ yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm +``` + +**NOTE**: When installing packages manually like this, you’ll need to make sure to +resolve all the dependencies and install missing packages yourself. + +## Uninstalling *Percona XtraBackup* + +To completely uninstall *Percona XtraBackup* you’ll need to remove all the +installed packages: `yum remove percona-xtrabackup` diff --git a/storage/innobase/xtrabackup/doc/docs/intro.md b/storage/innobase/xtrabackup/doc/docs/intro.md new file mode 100644 index 000000000000..944962182fd5 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/intro.md @@ -0,0 +1,100 @@ +# About Percona XtraBackup + +*Percona XtraBackup* is the world’s only open-source, free *MySQL* hot backup +software that performs non-blocking backups for *InnoDB* and *XtraDB* +databases. With *Percona XtraBackup*, you can achieve the following benefits: + + +* Backups that complete quickly and reliably + + +* Uninterrupted transaction processing during backups + + +* Savings on disk space and network bandwidth + + +* Automatic backup verification + + +* Higher uptime due to faster restore time + +*Percona XtraBackup* makes *MySQL* hot backups for all versions of Percona +Server for MySQL, and *MySQL*. It performs streaming, compressed, and incremental *MySQL* +backups. + +**_Important_** + +> **Percona XtraBackup** 2.4 supports *MySQL* and *Percona Server for +> MySQL* +5.6 and 5.7 databases. Due to changes in the MySQL redo log and data +dictionary formats, the **Percona XtraBackup** 8.0.x versions are only +compatible with *MySQL* 8.0.x, *Percona Server for MySQL* 8.0.x, and +compatible versions. + +Percona’s enterprise-grade commercial [MySQL Support](http://www.percona.com/mysql-support/) contracts include support for *Percona +XtraBackup*. We recommend support for critical production deployments. Percona XtraDB Backup supports encryption. + +### Supported storage engines + +Percona XtraBackup works with MySQL and Percona Server. It supports +completely non-blocking backups of InnoDB, XtraDB, and MyRocks storage +engines. Fast incremental backups are supported for Percona Server with the XtraDB changed page tracking enabled. + +In addition, it can back up the following storage engines by briefly +pausing writes at the end of the backup: MyISAM and Merge, including partitioned tables, triggers, and database +options. The InnoDB tables are still locked while copying non-InnoDB data. + +**_Version Updates_** + +Version 8.0.6 and later supports the MyRocks storage engine. +An incremental backup on the MyRocks storage engine does not +determine if an earlier full or incremental backup +contains the same files. **Percona XtraBackup** copies all +MyRocks files each time it takes a backup. +**Percona +XtraBackup** does not support the TokuDB storage engine. + +_See Also_ [Percona TokuBackup](https://docs.percona.com/percona-server/latest/tokudb/toku_backup.html) + +## What are the features of Percona XtraBackup? + +Here is a short list of the Percona XtraBackup features. See the documentation +for more. + + +* Create hot InnoDB backups without pausing your database + + +* Make incremental backups of MySQL + + +* Stream compressed MySQL backups to another server + + +* Move tables between MySQL servers on-line + + +* Create new MySQL replication replicas easily + + +* Backup MySQL without adding load to the server + + +* Percona XtraBackup performs throttling based on the number of IO operations per second + + +* Percona XtraBackup skips secondary index pages and recreates them when a compact backup is prepared + + +* Percona XtraBackup can export individual tables even from a full backup, regardless of the InnoDB version + + +* Backup locks is a lightweight alternative to `FLUSH TABLES WITH READ LOCK` available in Percona Server. Percona XtraBackup uses them automatically to copy non-InnoDB data to avoid blocking DML queries that modify InnoDB tables. + +**_See also_** +[How Percona XtraBackup works](https://docs.percona.com/percona-xtrabackup/8.0/how_xtrabackup_works.html#how-xtrabackup-works) + +### Additional information + +The *InnoDB* tables are locked while copying non-*InnoDB* data. diff --git a/storage/innobase/xtrabackup/doc/docs/manual.md b/storage/innobase/xtrabackup/doc/docs/manual.md new file mode 100644 index 000000000000..e94e0746f570 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/manual.md @@ -0,0 +1,26 @@ +# Percona XtraBackup User Manual + +*Percona XtraBackup* is a set of the following tools: + +[xtrabackup](https://docs.percona.com/percona-xtrabackup/8.0/xtrabackup_bin/xtrabackup_binary.html) + + a compiled *C* binary that provides functionality to backup a whole *MySQL* + database instance with *MyISAM*, *InnoDB*, and *XtraDB* tables. + +[xbcrypt](https://docs.percona.com/percona-xtrabackup/8.0/xbcrypt/xbcrypt.html) + + utility used for encrypting and decrypting backup files. + +[xbstream](https://docs.percona.com/percona-xtrabackup/8.0/xbstream/xbstream.html) + + utility that allows streaming and extracting files to/from the + xbstream format. + +[xbcloud](https://docs.percona.com/percona-xtrabackup/8.0/xbcloud/xbcloud.html) + + utility used for downloading and uploading full or part of *xbstream* + archive from/to cloud. + +The recommended way to take the backup is +by using the *xtrabackup* script. For more information on script +options, see [xtrabackup](https://docs.percona.com/percona-xtrabackup/8.0/xtrabackup_bin/xtrabackup_binary.html). diff --git a/storage/innobase/xtrabackup/doc/docs/release-notes.md b/storage/innobase/xtrabackup/doc/docs/release-notes.md new file mode 100644 index 000000000000..44777e3b7c07 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/release-notes.md @@ -0,0 +1,58 @@ +# Percona XtraBackup 8.0 Release Notes + +* [*Percona XtraBackup* 8.0.29-22 (2022-07-19)](release-notes/8.0/8.0.29-22.0.md) + +* [*Percona XtraBackup* 8.0.28-21 (2022-05-25)](release-notes/8.0/8.0.28-21.0.md) + +* [Percona XtraBackup 8.0.28-20.0 (2022-04-26)](release-notes/8.0/8.0.28-20.0.md) + + +* [Percona Xtrabackup 8.0.27-19.0 (2022-02-02)](release-notes/8.0/8.0.27-19.0.md) + + +* [Percona XtraBackup 8.0.26-18.0 (2021-09-02)](release-notes/8.0/8.0.26-18.0.md) + + +* [Percona Xtrabackup 8.0.25-17.0 (2021-06-03)](release-notes/8.0/8.0.25-17.0.md) + + +* [Percona XtraBackup 8.0.23-16.0 (2021-03-22)](release-notes/8.0/8.0.23-16.0.md) + + +* [Percona Xtrabackup 8.0.22-15.0 (2020-12-14)](release-notes/8.0/8.0.22-15.0.md) + + +* [Percona XtraBackup 8.0.14 (2020-08-31)](release-notes/8.0/8.0.14.md) + + +* [Percona Xtrabackup 8.0.13 (2020-06-17)](release-notes/8.0/8.0.13.md) + + +* [Percona XtraBackup 8.0.12 (2020-05-27)](release-notes/8.0/8.0.12.md) + + +* [Percona Xtrabackup 8.0.11 (2020-04-13)](release-notes/8.0/8.0.11.md) + + +* [Percona XtraBackup 8.0.10 (2020-03-16)](release-notes/8.0/8.0.10.md) + + +* [Percona Xtrabackup 8.0.9 (2019-12-16)](release-notes/8.0/8.0.9.md) + + +* [Percona XtraBackup 8.0.8 (2019-11-21)](release-notes/8.0/8.0.8.md) + + +* [Percona Xtrabackup 8.0.7 (2019-08-07)](release-notes/8.0/8.0.7.md) + + +* [Percona Xtrabackup 8.0.6 (2019-05-09)](release-notes/8.0/8.0.6.md) + + +* [Percona XtraBackup 8.0.5 (2019-03-04)](release-notes/8.0/8.0.5.md) + + +* [Percona Xtrabackup 8.0.4 (2018-12-10)](release-notes/8.0/8.0.4.md) + + +* [Percona XtraBackup 8.0-3-rc1 (2018-10-31)](release-notes/8.0/8.0-3-rc1.md) diff --git a/storage/innobase/xtrabackup/doc/docs/release-notes/.DS_Store b/storage/innobase/xtrabackup/doc/docs/release-notes/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7218fc287191e490145e0a62b412ed8cf50c3664 GIT binary patch literal 8196 zcmeHMU2GIp6u#fIzzh>$s09i#c58)VS*4V=iYP4GHuBT*w=MnQXWiWy=!EIavNOA- zHr4th0X6YO}}an20g)i5HFFgNgCnxwAkEO?=US&Q0$9=A3)Z zojqs2Gk5PSV+_fnv6`_O#+XcY)O5M?0BK$L--Ap^8$^CnNT?~B=Jj4}{q;D4C`{(Oj0=a>j_LSXRdpdmN{5LS{p zXmqXd3&L24i4Z3Q(hM~SS3=>6@Q4B7PWo7Amk4n}pm1jh4<88cjPQhl;O?}3EHGzC z2#m%k15pO9&j3HWSFmPwFKfw;Tzh`EEzfUiItQtua>mSAvMj6ezSNLAlJYZt(Mx6u zd$`o&x^}jFoyqRD%#pNK-R?Sm#&XO;;9wahne6Se9K#(+x<$wE0^gLFkQGHqYc*qI zEiJ9_SZiDBcsw??wz(-DYgyAaKCZ|M>Q}AXl|Ez-JMJ+N0K$g=n=>V#<5#0Gyquk- zPsc670Bx_-E?!Vnq_TMt;Q4ZZ%4}7gqxba>4DQ*R*0iE$?lSF+ZLv3`rz7gkmL9^3QW+1qUvJVHe|Id@U*T`TTszVE?A=jQI6XXk12tJG?B zVPDDetgLPJj#!32G?4Lfrej#n!9hx~<68$Tv!KjJTwKG}M7OJ)CI$7JQ^p!-!LRqbDkd^+NJ3LImctV%d zJ7nz(c|X5#SH|lk&^l*SswI;G6i${2(hs2(Iv~l*GPKq(rH+}TL`kTtxnem z_);4U!!#)9B{hqy^pxH!YiGzuvz(Geyr=I#&|j`kI2SmxSbd@~Kvpk+u^`9wi6$Xe zm(?NieNJahEXlU8{VdN$*>Uz9dyT!vPO8NynUHr~;M1w>3^8LSgL#s;X5|EsDAII*BY4lI^q%uPphW;`o>B z4EvT{U>Awwf1(0179ob^h!dyRBSF0GKqv8f2X-Na9_&LJ8Dxp&HXP(}7zK=B9FJoH zPY}nS!qa#L&*KH+`OC!g6L=kO;7z=XQ}_U<@nOLDuka1d backup when a multi valued index was being added or dropped for JSON +> data. Bug fixed [PXB-1913](https://jira.percona.com/browse/PXB-1913). + +**Other bugs fixed:** +[PXB-1928](https://jira.percona.com/browse/PXB-1928), +[PXB-1938](https://jira.percona.com/browse/PXB-1938), +[PXB-1951](https://jira.percona.com/browse/PXB-1951), +[PXB-1953](https://jira.percona.com/browse/PXB-1953), +[PXB-1954](https://jira.percona.com/browse/PXB-1954). diff --git a/storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.9.md b/storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.9.md new file mode 100644 index 000000000000..97ad5f2bb7aa --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/release-notes/8.0/8.0.9.md @@ -0,0 +1,19 @@ +# *Percona XtraBackup* 8.0.9 + +*Percona* is glad to announce the release of *Percona XtraBackup* 8.0.9 on December 16, 2019. +Downloads are available from our [download site](https://www.percona.com/downloads/Percona-XtraBackup-LATEST/) and from +apt and yum repositories. + +*Percona XtraBackup* enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot +tolerate long periods of downtime. Offered free as an open source solution, it +drives down backup costs while providing unique features for *MySQL* backups. + +All *Percona* software is open-source and free. + +## Bugs Fixed + + +* Sometime between December 3rd and December 10th, a change was introduced in + that caused an incompatibility with our +*Percona XtraBackup* `xbcloud` utility. Bug fixed [PXB-1978](https://jira.percona.com/browse/PXB-1978). diff --git a/storage/innobase/xtrabackup/doc/docs/security/pxb-apparmor.md b/storage/innobase/xtrabackup/doc/docs/security/pxb-apparmor.md new file mode 100644 index 000000000000..33fe47061142 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/security/pxb-apparmor.md @@ -0,0 +1,54 @@ +# Working with AppArmor + +The Linux Security Module implements mandatory access controls (MAC) with AppArmor. Debian and Ubuntu systems install AppArmor by default. AppArmor uses profiles which define which files and permissions are needed for application. + +*Percona XtraBackup* does not have a profile and is not confined by AppArmor. + +For a list of common AppArmor commands, see [Percona Server for MySQL - AppArmor](https://www.percona.com/doc/percona-server/LATEST/security/apparmor.html) + +## Develop a profile + +Download the profile from: + +[https://github.com/percona/percona-xtrabackup/tree/8.0/packaging/percona/apparmor/apparmor.d](https://github.com/percona/percona-xtrabackup/tree/8.0/packaging/percona/apparmor/apparmor.d) + +The following profile sections should be updated with your system information, such as location of the backup destination directory. + +``` +# enable storing backups only in /backups directory +# /backups/** rwk, + +# enable storing backups anywhere in caller user home directory +/@{HOME}/** rwk, + + +# enable storing backups only in /backups directory +# /backups/** rwk, + +# enable storing backups anywhere in caller user home directory +/@{HOME}/** rwk, +} + +# enable storing backups only in /backups directory +# /backups/** rwk, + +# enable storing backups anywhere in caller user home directory +/@{HOME}/** rwk, +} +``` + +Move the updated file: + +``` +$ sudo mv usr.sbin.xtrabackup /etc/apparmor.d/ +``` + +Install the profile with the following command: + + ``` +$ sudo apparmor_parser -r -T -W /etc/apparmor.d/usr.sbin.xtrabackup + ``` + +Run the backup as usual. + +No additional AppArmor-related actions are required to restore a backup. diff --git a/storage/innobase/xtrabackup/doc/docs/security/pxb-selinux.md b/storage/innobase/xtrabackup/doc/docs/security/pxb-selinux.md new file mode 100644 index 000000000000..2ae87b01adc7 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/security/pxb-selinux.md @@ -0,0 +1,116 @@ +# Working with SELinux + +*Percona XtraBackup* is installed as an unconfined process running in an undefined domain. SELinux allows unconfined processes almost all access and the processes only use Discretionary Access Control (DAC) rules. + +You find the current state of the *Percona XtraBackup* file with the following command: + +``` +$ ls -Z /usr/bin | grep xtrabackup +-rwxr-xr-x. root root system_u:object_r:bin_t:s0 xtrabackup +``` + +The SELinux context is the following: + + +* user (root) + + +* role (object_r) + + +* type (bin_t) + + +* level (s0) + +The unconfined domain supports the network-facing services, which are protected by SELinux. These domains are not exposed. In this configuration, SELinux protects against remote intrusions but local intrusions, which require local access, are not confined. + +*Percona XtraBackup* works locally. The service is not network-facing and cannot be exploited externally. The service interacts only with the local user, who provides the parameters. *Percona XtraBackup* requires access to the `target-dir` location. + +## Confine XtraBackup + +You can modify your security configuration to confine *Percona XtraBackup*. The first question is where to store the backup files. The service requires read and write access to the selected location. + +You can use either of the following methods: + + +* Allow *Percona XtraBackup* to write to any location. The user provides any path to the `target-dir` parameter. + + +* Allow *Percona XtraBackup* to write to a specific location, such as /backups or the user’s home directory. + +The first option opens the entire system to read and write. Select the second option to harden your security. + +## Install SELinux tools + +To work with policies, you must install the SELinux tools. To find which package provides the `semanage` command and install the package. The following is an example on CentOS 7. + +> ``` +> $ yum provides *bin/semanage +> ... +> policycoreutils-python-2.5-34.el7.x86_64 : SELinux policy core python utilities +> ... +> $ sudo yum install -y policycoreutils-python +> ``` + +The following is an example on CentOS 8: + +> ``` +> $ yum provides *bin/semanage +> ... +> policycoreutils-python-utils-2.8-16.1.el8.noarch : SELinux policy core python utilities +> ... +> $ sudo yum install -y policycoreutils-python-utils +> ``` + +## Create a policy + +Use a modular approach to create an SELinux policy. Create a policy module to manage XtraBackup. You must create a `.te` file for type enforcement, and an optional `.fc` file for the file contexts. + +Use ps -efZ | grep xtrabackup to verify the service is not confined by SELinux. + +Create the `xtrabackup.fc` file and add content. This file defines the security contexts. + +> ``` +> /usr/bin/xtrabackup -- gen_context(system_u:object_r:xtrabackup_exec_t,s0) +> /usr/bin/xbcrypt -- gen_context(system_u:object_r:xtrabackup_exec_t,s0) +> /usr/bin/xbstream -- gen_context(system_u:object_r:xtrabackup_exec_t,s0) +> /usr/bin/xbcloud -- gen_context(system_u:object_r:xtrabackup_exec_t,s0) +> /backups(/.*)? system_u:object_r:xtrabackup_data_t:s0 +> ``` + +**NOTE**: If you are using the `/backups` directory you must have the last line. If you are storing the backups in the user’s home directory, you can omit this line. + +Download the `xtrabackup.te` file from the following location: + +[https://github.com/percona/percona-xtrabackup/tree/8.0/packaging/percona/selinx](https://github.com/percona/percona-xtrabackup/tree/8.0/packaging/percona/selinx) + +**NOTE**: In the file, the sections in bold should be modified for your system. The fc file can also be downloaded from the same location. + +Complile the policy module: + +> ``` +> $ make -f /usr/share/selinux/devel/Makefile xtrabackup.pp +> ``` + +Install the module: + +> ``` +> $ semodule -i xtrabackup.pp +> ``` + +Tag the PXB binaries with the proper SELinux tags, such as `xtrabackup_exec_t`. + +> ``` +> $ restorecon -v /usr/bin/* +> ``` + +If you store your backups at `/backups`, restore the tag in that location: + +> ``` +> $ restorecon -v /backups +> ``` + +**NOTE**: Remember to add the standard Linux DAC permissions for this directory. + +Perform the backup in the standard way. diff --git a/storage/innobase/xtrabackup/doc/docs/trademark-policy.md b/storage/innobase/xtrabackup/doc/docs/trademark-policy.md new file mode 100644 index 000000000000..243de52903c1 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/trademark-policy.md @@ -0,0 +1,65 @@ +# Trademark Policy + +This Trademark Policy is to ensure that users of Percona-branded products or +services know that what they receive has really been developed, approved, +tested and maintained by Percona. Trademarks help to prevent confusion in the +marketplace, by distinguishing one company’s or person’s products and +services from another’s. + +Percona owns a number of marks, including but not limited to Percona, XtraDB, +Percona XtraDB, XtraBackup, Percona XtraBackup, Percona Server, and Percona +Live, plus the distinctive visual icons and logos associated with these marks. +Both the unregistered and registered marks of Percona are protected. + +Use of any Percona trademark in the name, URL, or other identifying +characteristic of any product, service, website, or other use is not permitted +without Percona’s written permission with the following three limited +exceptions. + +*First*, you may use the appropriate Percona mark when making a nominative fair +use reference to a bona fide Percona product. + +*Second*, when Percona has released a product under a version of the GNU +General Public License (“GPL”), you may use the appropriate Percona mark when +distributing a verbatim copy of that product in accordance with the terms and +conditions of the GPL. + +*Third*, you may use the appropriate Percona mark to refer to a distribution of +GPL-released Percona software that has been modified with minor changes for +the sole purpose of allowing the software to operate on an operating system or +hardware platform for which Percona has not yet released the software, provided +that those third party changes do not affect the behavior, functionality, +features, design or performance of the software. Users who acquire this +Percona-branded software receive substantially exact implementations of the +Percona software. + +Percona reserves the right to revoke this authorization at any time in its sole +discretion. For example, if Percona believes that your modification is beyond +the scope of the limited license granted in this Policy or that your use of the +Percona mark is detrimental to Percona, Percona will revoke this authorization. +Upon revocation, you must immediately cease using the applicable Percona mark. +If you do not immediately cease using the Percona mark upon revocation, Percona +may take action to protect its rights and interests in the Percona mark. +Percona does not grant any license to use any Percona mark for any other +modified versions of Percona software; such use will require our prior written +permission. + +Neither trademark law nor any of the exceptions set forth in this Trademark +Policy permit you to truncate, modify or otherwise use any Percona mark as part +of your own brand. For example, if XYZ creates a modified version of the +Percona Server, XYZ may not brand that modification as “XYZ Percona Server” or +“Percona XYZ Server”, even if that modification otherwise complies with the +third exception noted above. + +In all cases, you must comply with applicable law, the underlying license, and +this Trademark Policy, as amended from time to time. For instance, any mention +of Percona trademarks should include the full trademarked name, with proper +spelling and capitalization, along with attribution of ownership to Percona LLC +and/or its affiliates. For example, the full proper name for XtraBackup is +Percona XtraBackup. However, it is acceptable to omit the word “Percona” for +brevity on the second and subsequent uses, where such omission does not cause +confusion. + +In the event of doubt as to any of the conditions or exceptions outlined in +this Trademark Policy, please contact [trademarks@percona.com](mailto:trademarks@percona.com) for assistance and +we will do our very best to be helpful. diff --git a/storage/innobase/xtrabackup/doc/docs/using_xtrabackup/comparison.md b/storage/innobase/xtrabackup/doc/docs/using_xtrabackup/comparison.md new file mode 100644 index 000000000000..37977d61ac83 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/using_xtrabackup/comparison.md @@ -0,0 +1,50 @@ +# Server Version and Backup Version Comparison + +A *MySQL* change to a feature, such as the structure of a redo log +record, can cause older versions of **Percona XtraBackup** to fail. To +ensure that you can back up and restore your data, use a **Percona +XtraBackup** version that is equal to or above your source server version. + +**See also** + +[How XtraBackup works](https://docs.percona.com/percona-xtrabackup/8.0/how_xtrabackup_works.html) + +*Percona XtraBackup* 8.0.21 adds the `--no-server-version-check` option. +Before the backup starts, XtraBackup compares the source system version to +the *Percona XtraBackup* version. If the source system version is greater +than the XtraBackup version, XtraBackup stops the backup and returns an +error message. This comparison prevents a failed backup or a corrupted +backup due to source system changes. + +The parameter checks for the following scenarios: + + +* The source system and the PXB version are the same, the backup proceeds + + +* The source system is less than the PXB version, the backup proceeds + + +* The source system is greater than the PXB version, and the parameter is + not overridden, the backup is stopped and returns an error message + + +* The source system is greater than the PXB version, and the parameter is + overridden, the backup proceeds + +Explicitly adding the `--no-server-version-check` parameter, like the +example, overrides the parameter and the backup proceeds. + +``` +$ xtrabackup --backup --no-server-version-check --target-dir=$mysql/backup1 +``` + +When you override the parameter, the following events can happen: + +* Backup fails + + +* Creates a corrupted backup + + +* Backup successful diff --git a/storage/innobase/xtrabackup/doc/docs/using_xtrabackup/configuring.md b/storage/innobase/xtrabackup/doc/docs/using_xtrabackup/configuring.md new file mode 100644 index 000000000000..07f15e14285b --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/using_xtrabackup/configuring.md @@ -0,0 +1,46 @@ +# Configuring xtrabackup + +All the *xtrabackup* configuration is done through options, which behave +exactly like standard *MySQL* program options: they can be specified either at +the command-line, or through a file such as `/etc/my.cnf`. + +The *xtrabackup* binary reads the `[mysqld]` and `[xtrabackup]` sections +from any configuration files, in that order. That is so that it can read its +options from your existing *MySQL* installation, such as the datadir or +some of the *InnoDB* options. If you want to override these, just specify them +in the `[xtrabackup]` section, and because it is read later, it will take +precedence. + +You don’t need to put any configuration in your `my.cnf` if you don’t +want to. You can simply specify the options on the command-line. Normally, the +only thing you might find convenient to place in the `[xtrabackup]` section +of your `my.cnf` file is the `target_dir` option to default the +directory in which the backups will be placed, for example: + +``` text +[xtrabackup] +target_dir = /data/backups/mysql/ +``` + +This manual will assume that you do not have any file-based configuration for +*xtrabackup*, so it will always show command-line options being used +explicitly. Please see the option and variable reference for details on all the configuration options. + +The *xtrabackup* binary does not accept exactly the same syntax in the +`my.cnf` file as the **mysqld** server binary does. For historical +reasons, the **mysqld** server binary accepts parameters with a +`--set-variable==` syntax, which *xtrabackup* does not +understand. If your `my.cnf` file has such configuration directives, you +should rewrite them in the `--variable=value` syntax. + +## System Configuration and NFS Volumes + +The *xtrabackup* tool requires no special configuration on most systems. +However, the storage where the `--target-dir` is located +must behave properly when `fsync()` is called. In particular, we have noticed +that if you mount the NFS volume without the `sync` option the NFS +volume does not sync the data. As a result, if you back up to an NFS +volume mounted with the async +option, and then try to prepare the backup from a different server that also +mounts that volume, the data might appear to be corrupt. You can use the +`sync` mount option to avoid this problem. diff --git a/storage/innobase/xtrabackup/doc/docs/using_xtrabackup/privileges.md b/storage/innobase/xtrabackup/doc/docs/using_xtrabackup/privileges.md new file mode 100644 index 000000000000..11de889f830b --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/using_xtrabackup/privileges.md @@ -0,0 +1,132 @@ +# Connection and Privileges Needed + +*Percona XtraBackup* needs to be able to connect to the database server and +perform operations on the server and the datadir when creating a +backup, when preparing in some scenarios and when restoring it. In order to do +so, there are privileges and permission requirements on its execution that +must be fulfilled. + +Privilege refers to the operations that a system user is permitted to do in +the database server. **They are set at the database server and only apply to +users in the database server**. + +Permissions are those which permits a user to perform operations on the system, +like reading, writing or executing on a certain directory or start/stop a +system service. **They are set at a system level and only apply to system +users**. + +When *xtrabackup* is used, there are two actors involved: the user invoking the +program - *a system user* - and the user performing action in the database +server - *a database user*. Note that these are different users in different +places, even though they may have the same username. + +All the invocations of *xtrabackup* in this documentation assume that the system +user has the appropriate permissions, and you are providing the relevant options +for connecting the database server - besides the options for the action to be +performed - and the database user has adequate privileges. + +## Connecting to the server + +The database user used to connect to the server and its password are specified +by the `--user` and `--password` option: + +``` +$ xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup \ +--target-dir=/data/bkps/ +``` + +If you don’t use the `--user` option, *Percona XtraBackup* will assume +the database user whose name is the system user executing it. + +### Other Connection Options + +According to your system, you may need to specify one or more of the following +options to connect to the server: + +| **Option** | **Description** | +|------------|------------------------------------------------------------------| +| -port | Use this port when connecting to the database with TCP/IP | +| -socket | Use this socket when connecting to the local database. | +| -host | Use this host when connecting to the database server with TCP/IP | + +These options are passed to the **mysql** child process without +alteration, see `mysql --help` for details. + + +**NOTE**: In case of multiple server instances, the correct connection parameters +(port, socket, host) must be specified in order for *xtrabackup* to talk to +the correct server. + +## Permissions and Privileges Needed + +Once connected to the server, in order to perform a backup you will need +`READ` and `EXECUTE` permissions at a filesystem level in the +server’s datadir. + +The database user needs the following privileges on the tables or databases to be backed up: + + +* `RELOAD` and `LOCK TABLES` (unless the `--no-lock` +option is specified) in order to run `FLUSH TABLES WITH READ LOCK` and +`FLUSH ENGINE LOGS` prior to start copying the files, and requires this +privilege when [Backup Locks](http://www.percona.com/doc/percona-server/8.0/management/backup_locks.html) +are used + + +* `BACKUP_ADMIN` privilege is needed to query the +performance_schema.log_status table, and run `LOCK INSTANCE FOR BACKUP`, +`LOCK BINLOG FOR BACKUP`, or `LOCK TABLES FOR BACKUP`. + + +* `REPLICATION CLIENT` in order to obtain the binary log position, + + +* `CREATE TABLESPACE` in order to import tables (see Restoring Individual Tables), + + +* `PROCESS` in order to run `SHOW ENGINE INNODB STATUS` (which is +mandatory), and optionally to see all threads which are running on the +server (see FLUSH TABLES WITH READ LOCK option), + + +* `SUPER` in order to start/stop the replication threads in a replication +environment, use [XtraDB Changed Page Tracking](https://www.percona.com/doc/percona-server/8.0/management/changed_page_tracking.html) +for Incremental Backups and for handling FLUSH TABLES WITH READ LOCK, + + +* `CREATE` privilege in order to create the +PERCONA_SCHEMA.xtrabackup_history database and +table, + + +* `ALTER` privilege in order to upgrade the +PERCONA_SCHEMA.xtrabackup_history database and +table, + + +* `INSERT` privilege in order to add history records to the +PERCONA_SCHEMA.xtrabackup_history table, + + +* `SELECT` privilege in order to use +`--incremental-history-name` or +`--incremental-history-uuid` in order for the feature +to look up the `innodb_to_lsn` values in the +PERCONA_SCHEMA.xtrabackup_history table. + + +* `SELECT` privilege on the [keyring_component_status table](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-keyring-component-status-table.html) to view the attributes and status of the installed keyring component when in use. + +The explanation of when these are used can be found in +How Percona XtraBackup Works. + +An SQL example of creating a database user with the minimum privileges required +to full backups would be: + +``` sql +mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cr%T'; +mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost'; +mysql> GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'localhost'; +mysql> GRANT SELECT ON performance_schema.keyring_component_status TO bkpuser@'localhost' +mysql> FLUSH PRIVILEGES; +``` diff --git a/storage/innobase/xtrabackup/doc/docs/version-check.md b/storage/innobase/xtrabackup/doc/docs/version-check.md new file mode 100644 index 000000000000..071a48c5ec26 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/version-check.md @@ -0,0 +1,118 @@ +# Version Checking + +Some Percona software contains “version checking” functionality which is a +feature that enables Percona software users to be notified of available software +updates to improve your environment security and performance. Alongside this, +the version check functionality also provides Percona with information relating +to which software versions you are running, coupled with the environment +confirmation which the software is running within. This helps enable Percona to +focus our development effort accordingly based on trends within our customer +community. + +The purpose of this document is to articulate the information that is collected, +as well as to provide guidance on how to disable this functionality if desired. + +## Usage + +*Version Check* was implemented in *Percona Toolkit* 2.1.4, and was enabled by default in +version 2.2.1. Currently, it is supported as a `--[no]version-check` option +by a number of tools in Percona Toolkit, *Percona XtraBackup*, and *Percona Monitoring and Management* (PMM). + +When launched with Version Check enabled, the tool that supports this feature +connects to a Percona’s *version check service* via a secure HTTPS channel. It +compares the locally installed version for possible updates, and also checks +versions of the following software: + + +* Operating System + + +* Percona Monitoring and Management (PMM) + + +* MySQL + + +* Perl + + +* MySQL driver for Perl (DBD::mysql) + + +* Percona Toolkit + +Then it checks for and warns about versions with known problems if they are +identified as running in the environment. + +Each version check request is logged by the server. Stored information consists +of the checked system unique ID followed by the software name and version. The +ID is generated either at installation or when the *version checking* query is +submitted for the first time. + +**NOTE**: Prior to version 3.0.7 of *Percona Toolkit*, the system ID was calculated as an MD5 hash +of a hostname, and starting from *Percona Toolkit* 3.0.7 it is generated as an MD5 hash of +a random number. *Percona XtraBackup* continues to use hostname-based MD5 hash. + +As a result, the content of the sent query is as follows: + +```text +85624f3fb5d2af8816178ea1493ed41a;DBD::mysql;4.044 +c2b6d625ef3409164cbf8af4985c48d3;MySQL;MySQL Community Server (GPL) 5.7.22-log +85624f3fb5d2af8816178ea1493ed41a;OS;Manjaro Linux +85624f3fb5d2af8816178ea1493ed41a;Percona::Toolkit;3.0.11-dev +85624f3fb5d2af8816178ea1493ed41a;Perl;5.26.2 +``` + +## Disabling Version Check + +Although the *version checking* feature does not collect any personal information, +you might prefer to disable this feature, either one time or permanently. To +disable it one time, use `--no-version-check` option when invoking the tool +from a Percona product which supports it. Here is a simple example which shows +running [pt-diskstats](https://www.percona.com/doc/percona-toolkit/LATEST/pt-diskstats.html) tool +from the *Percona Toolkit* with *version checking* turned off: + +```shell +pt-diskstats --no-version-check +``` + +Disabling *version checking* permanently can be done by placing +`no-version-check` option into the configuration file of a Percona product +(see correspondent documentation for exact file name and syntax). For example, +in case of *Percona Toolkit* [this can be done](https://www.percona.com/doc/percona-toolkit/LATEST/configuration_files.html) +in a global configuration file `/etc/percona-toolkit/percona-toolkit.conf`: + +```text +# Disable Version Check for all tools: +no-version-check +``` + +In case of *Percona XtraBackup* this can be done [in its configuration file](https://www.percona.com/doc/percona-xtrabackup/2.4/using_xtrabackup/configuring.htm) +in a similar way: + +```text +[xtrabackup] +no-version-check +``` + +## Frequently Asked Questions + +### Why is this functionality enabled by default? + +We believe having this functionality enabled improves security and performance +of environments running Percona Software and it is good choice for majority of +the users. + +### Why not rely on Operating System’s built in functionality for software updates? + +In many environments the Operating Systems repositories may not carry the latest +version of software and newer versions of software often installed manually, so +not being covered by operating system wide check for updates. + +### Why do you send more information than just the version of software being run as a part of version check service? + +Compatibility problems can be caused by versions of various components in the +environment, for example problematic versions of Perl, DBD or MySQL could cause +operational problems with Percona Toolkit. + + diff --git a/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud.md b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud.md new file mode 100644 index 000000000000..1aec3428d401 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud.md @@ -0,0 +1,298 @@ +# The xbcloud Binary + +The purpose of *xbcloud* is to download from the cloud and upload to +the cloud the full or part of an *xbstream* archive. *xbcloud* will not +overwrite the backup with the same name. *xbcloud* accepts input via a pipe from *xbstream* so that it can be +invoked as a pipeline with *xtrabackup* to stream directly to the cloud without +needing a local storage. + + **NOTE**: + + In a Bash shell, the `$?` parameter returns the exit code + from the last binary. If you use pipes, the + ${PIPESTATUS[x]} array parameter returns the exit code for each + binary in the pipe string. + + ``` + $ xtrabackup --backup --stream=xbstream --target-dir=/storage/backups/ | xbcloud put [options] full_backup + ... + $ ${PIPESTATUS[x]} + 0 0 + $ true | false + $ echo $? + 1 + + # with PIPESTATUS + $ true | false + $ echo ${PIPESTATUS[0]} ${PIPESTATUS[1]} + 0 1 + ``` + +The *xbcloud* binary stores each chunk as a separate object with a name +`backup_name/database/table.ibd.NNNNNNNNNNNNNNNNNNNN`, where `NNN...` is a +0-padded serial number of chunk within a file. Size of chunk produced by +*xtrabackup* and *xbstream* changed to 10M. + +*xbcloud* has three essential operations: *put*, *get*, and *delete*. With these +operations, backups are created, stored, retrieved, restored, and +deleted. *xbcloud* operations clearly map to similar operations within +the AWS Amazon S3 API. + +The [Exponential Backoff](https://docs.percona.com/percona-xtrabackup/8.0/xbcloud/xbcloud_exbackoff.html#xbcloud-exbackoff) feature was implemented in Percona XtraBackup 8.0.26-18. Suppose a chunk fails to upload or download. In that case, this feature adds an exponential backoff, or sleep, time and then retries the upload or download, which increases the chances of completing a backup or a restore operation. + +## Supported Cloud Storage Types + +The following cloud storage types are supported: + + +* OpenStack Object Storage (Swift) - see [Using the xbcloud Binary with Swift](https://docs.percona.com/percona-xtrabackup/8.0/xbcloud/xbcloud_swift.html#xbcloud-swift) + + +* Amazon Simple Storage (S3) - see [Using xbcloud Binary with Amazon S3](https://docs.percona.com/percona-xtrabackup/8.0/xbcloud/xbcloud_s3.html#xbcloud-s3) + + +* Azure Cloud Storage - see [Using the xbcloud binary with Microsoft Azure Cloud Storage](https://docs.percona.com/percona-xtrabackup/8.0/xbcloud/xbcloud_azure.html#xbcloud-azure) + + +* Google Cloud Storage (gcs) - see [Using the xbcloud with Google Cloud Storage](https://docs.percona.com/percona-xtrabackup/8.0/xbcloud/xbcloud_gcs.html#xbcloud-gcs) + + +* MinIO - see [Using the xbcloud Binary with MinIO](https://docs.percona.com/percona-xtrabackup/8.0/xbcloud/xbcloud_minio.html#xbcloud-minio) + +In addition to OpenStack Object Storage (Swift), which has been the only option for storing backups in a cloud storage until Percona XtraBackup 2.4.14, *xbcloud* supports Amazon S3, MinIO, and Google Cloud Storage. Other Amazon S3-compatible storages, such as Wasabi or Digital Ocean Spaces, are also supported. + +**See also** + +[OpenStack Object Storage("Swift")](https://wiki.openstack.org/wiki/Swift) + +[Amazon Simple Storage Service](https://aws.amazon.com/s3/) + +[MinIO](https://min.io/) + +[Google Cloud Storage](https://cloud.google.com/storage/) + +[Wasabi](https://wasabi.com/) + +[Digital Ocean Spaces](https://www.digitalocean.com/products/spaces) + +## Usage + +The following sample command creates a full backup: + +``` +xtrabackup --backup --stream=xbstream --target-dir=/storage/backups/ --extra-lsndirk=/storage/backups/| xbcloud \ +put [options] full_backup +``` + +An incremental backup only includes the changes since the last backup. The last backup can be either a full or incremental backup. + +The following sample command creates an incremental backup: + +``` +xtrabackup --backup --stream=xbstream --incremental-basedir=/storage/backups \ +--target-dir=/storage/inc-backup | xbcloud put [options] inc_backup +``` + +To prepare an incremental backup, you must first download the full backup with the following command: + +``` +xtrabackup get [options] full_backup | xbstream -xv -C /tmp/full-backup +``` + +You must prepare the full backup: + +``` +xtrabackup --prepare --apply-log-only --target-dir=/tmp/full-backup +``` + +After the full backup has been prepared, download the incremental backup: + +``` +xbcloud get [options] inc_backup | xbstream -xv -C /tmp/inc-backup +``` + +The downloaded backup is prepared by running the following command: + +``` +xtrabackup --prepare --target-dir=/tmp/full-backup --incremental-dir=/tmp/inc-backup +``` + +You do not need the full backup to restore only a specific database. You can specify only the tables to be restored: + +``` +xbcloud get [options] ibdata1 sakila/payment.ibd /tmp/partial/partial.xbs + +xbstream -xv -C /tmp/partial < /tmp/partial/partial.xbs +``` + +## Supplying parameters + +Each storage type has mandatory parameters that you can supply on the command +line, in a configuration file, and via environment variables. + +### Configuration files + +The parameters the values of which do not change frequently can be stored in +`my.cnf` or in a custom configuration file. The following example is a +template of configuration options under the `[xbcloud]` group: + +``` +[xbcloud] +storage=s3 +s3-endpoint=http://localhost:9000/ +s3-access-key=minio +s3-secret-key=minio123 +s3-bucket=backupsx +s3-bucket-lookup=path +s3-api-version=4 +``` + +**NOTE**: If you explicitly use a parameter on the command line and in a configuration +file, *xbcloud* uses the value provided on the command line. + +### Environment variables + +If you explicitly use a parameter on the command line, in a configuration +file, and the corresponding environment variable contains a value, *xbcloud* +uses the value provided on the command line or in the configuration file. + +### Shortcuts + +For all operations (put, get, and delete), you can use a shortcut to specify the +storage type, bucket name, and backup name as one parameter instead of using +three distinct parameters (–storage, –s3-bucket, and backup name per se). + +**Note** + +Use the following format: ``storage-type://bucket-name/backup-name`` + +In this example **s3** refers to a storage type, **operator-testing** +is a bucket name, and **bak22** is the backup name. + +``` bash + +$ xbcloud get s3://operator-testing/bak22 ... + +``` +This shortcut expands as follows: + +```shell +$ xbcloud get --storage=s3 --s3-bucket=operator-testing bak22 ... +``` +You can supply the mandatory parameters on the command line, +configuration files, and in environment variables. + +### Additional parameters + +*xbcloud* accepts additional parameters that you can use with any storage +type. The `--md5` parameter computes the MD5 hash value of the backup +chunks. The result is stored in files that following the `backup_name.md5` +pattern. + +``` +$ xtrabackup --backup --stream=xbstream \ +--parallel=8 2>backup.log | xbcloud put s3://operator-testing/bak22 \ +--parallel=8 --md5 2>upload.log +``` + +You may use the `--header` parameter to pass an additional HTTP +header with the server side encryption while specifying a customer key. + + +**Note** + +An example of using the ``--header`` for AES256 encryption. + +```shell + +$ xtrabackup --backup --stream=xbstream --parallel=4 | \ +xbcloud put s3://operator-testing/bak-enc/ \ +--header="X-Amz-Server-Side-Encryption-Customer-Algorithm: AES256" \ +--header="X-Amz-Server-Side-Encryption-Customer-Key: CuStoMerKey=" \ +--header="X-Amz-Server-Side-Encryption-Customer-Key-MD5: CuStoMerKeyMd5==" \ +--parallel=8 +``` +The `--header` parameter is also useful to set the access control list (ACL) +permissions: `--header="x-amz-acl: bucket-owner-full-control` + +## Incremental backups + +First, you need to make the full backup on which the incremental one is going to +be based: + +``` +xtrabackup --backup --stream=xbstream --extra-lsndir=/storage/backups/ \ +--target-dir=/storage/backups/ | xbcloud put \ +--storage=swift --swift-container=test_backup \ +--swift-auth-version=2.0 --swift-user=admin \ +--swift-tenant=admin --swift-password=xoxoxoxo \ +--swift-auth-url=http://127.0.0.1:35357/ --parallel=10 \ +full_backup +``` + +Then you can make the incremental backup: + +``` +$ xtrabackup --backup --incremental-basedir=/storage/backups \ +--stream=xbstream --target-dir=/storage/inc_backup | xbcloud put \ +--storage=swift --swift-container=test_backup \ +--swift-auth-version=2.0 --swift-user=admin \ +--swift-tenant=admin --swift-password=xoxoxoxo \ +--swift-auth-url=http://127.0.0.1:35357/ --parallel=10 \ +inc_backup +``` + +### Preparing incremental backups + +To prepare a backup you first need to download the full backup: + +``` +$ xbcloud get --swift-container=test_backup \ +--swift-auth-version=2.0 --swift-user=admin \ +--swift-tenant=admin --swift-password=xoxoxoxo \ +--swift-auth-url=http://127.0.0.1:35357/ --parallel=10 \ +full_backup | xbstream -xv -C /storage/downloaded_full +``` + +Once you download the full backup it should be prepared: + +``` +$ xtrabackup --prepare --apply-log-only --target-dir=/storage/downloaded_full +``` + +After the full backup has been prepared you can download the incremental +backup: + +``` +$ xbcloud get --swift-container=test_backup \ +--swift-auth-version=2.0 --swift-user=admin \ +--swift-tenant=admin --swift-password=xoxoxoxo \ +--swift-auth-url=http://127.0.0.1:35357/ --parallel=10 \ +inc_backup | xbstream -xv -C /storage/downloaded_inc +``` + +Once the incremental backup has been downloaded you can prepare it by running: + +``` +$ xtrabackup --prepare --apply-log-only \ +--target-dir=/storage/downloaded_full \ +--incremental-dir=/storage/downloaded_inc + +$ xtrabackup --prepare --target-dir=/storage/downloaded_full +``` + +### Partial download of the cloud backup + +If you do not want to download the entire backup to restore the specific +database you can specify only the tables you want to restore: + +``` +$ xbcloud get --swift-container=test_backup +--swift-auth-version=2.0 --swift-user=admin \ +--swift-tenant=admin --swift-password=xoxoxoxo \ +--swift-auth-url=http://127.0.0.1:35357/ full_backup \ +ibdata1 sakila/payment.ibd \ +> /storage/partial/partial.xbs + +$ xbstream -xv -C /storage/partial < /storage/partial/partial.xbs +``` diff --git a/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_azure.md b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_azure.md new file mode 100644 index 000000000000..5a75b01c556f --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_azure.md @@ -0,0 +1,54 @@ +# Using the xbcloud binary with Microsoft Azure Cloud Storage + +This feature is *technical preview* quality. + +Implemented in Percona XtraBackup 8.0.27-19, the **xbcloud** binary adds support for the Microsoft Azure Cloud Storage using the REST API. + +## Options + +The following are the options, environment variables, and descriptions for uploading a backup to Azure using the REST API. The environment variables are recognized by **xbcloud**, which maps them automatically to the corresponding parameters: + +| Option name | Environment variables | Description | +|------------------------------|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| --azure-storage-account=name | AZURE_STORAGE_ACCOUNT | An Azure storage account is a unique namespace to access and store your Azure data objects. | +| --azure-container-name=name | AZURE_CONTAINER_NAME | A container name is a valid DNS name that conforms to the Azure naming rules | +| --azure-access-key=name | AZURE_ACCESS_KEY | A generated key that can be used to authorize access to data in your account using the Shared Key authorization. | +| --azure-endpoint=name | AZURE_ENDPOINT | The endpoint allows clients to securely access data | +| --azure-tier-class=name | AZURE_STORAGE_CLASS | Cloud tier can decrease the local storage required while maintaining the performance. When enabled, this feature has the following categories:

    Hot - Frequently accessed or modified data

    Cool - Infrequently accessed or modified data

    Archive - Rarely accessed or modified data | + +Test your Azure applications with the [Azurite open-source emulator](https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azurite?tabs=visual-studio). For testing purposes, the **xbcloud** binary adds the `--azure-development-storage` option that uses the default `access_key` and `storage account` of azurite and `testcontainer` for the container. You can overwrite these options, if needed. + +## Usage + +All the available options for **xbcloud**, such as parallel, +max-retries, and others, can be used. For more information, see the +[xbcloud Binary](https://docs.percona.com/percona-xtrabackup/latest/xbcloud/xbcloud.html#xbcloud-binary). + +## Examples + +An example of an **xbcloud** backup. + +```shell +$ xtrabackup --backup --stream=xbstream --target-dir= $TARGET_DIR | +xbcloud put backup_name --azure-storage-account=pxbtesting --azure-access-key=$AZURE_KEY --azure-container-name=test --storage=azure +``` + +An example of restoring a backup from **xbcloud**. + +```shell +$ xbcloud get backup_name --azure-storage-account=pxbtesting +--azure-access-key=$AZURE_KEY --azure-container-name=test --storage=azure --parallel=10 2>download.log | xbstream -x -C restore +``` + +An example of deleting a backup from **xbcloud**. + +```shell +$ xbcloud delete backup_name --azure-storage-account=pxbtesting +--azure-access-key=$AZURE_KEY --azure-container-name=test --storage=azure +``` + +An example of using a shortcut restore. + +```shell +$ xbcloud get azure://operator-testing/bak22 ... +``` diff --git a/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_exbackoff.md b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_exbackoff.md new file mode 100644 index 000000000000..73c2cc62162c --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_exbackoff.md @@ -0,0 +1,141 @@ +# Exponential Backoff + +This feature was implemented in [Percona XtraBackup 8.0.26-18.0](https://docs.percona.com/percona-xtrabackup/latest/release-notes/8.0/8.0.26-18.0.html#pxb-8-0-26-18-0) in the +xbcloud binary. + +Exponential backoff increases the chances for the completion of a backup or +a restore operation. For example, a chunk upload or download may fail if +you have an unstable network connection or other network issues. This +feature adds an exponential backoff, or sleep, time and then retries the +upload or download. + +When a chunk upload or download operation fails, xbcloud checks the reason +for the failure. This failure can be a CURL error or an HTTP error, or a +client-specific error. If the error is listed in the [Retriable errors](https://docs.percona.com/percona-xtrabackup/latest/xbcloud/xbcloud_exbackoff.html#retriable) list, +xbcloud pauses for a calculated time before retrying the operation until +that time reaches the `--max-backoff` value. + +The operation is retried until the `--max-retries` value is reached. If the +chunk operation fails on the last retry, xbcloud aborts the process. + +The default values are the following: + +* –max-backoff = 300000 (5 minutes) + + +* –max-retries = 10 + +You can adjust the number of retries by adding the `--max-retries` +parameter and adjust the maximum length of time between retries by adding +the `--max-backoff` parameter to an xbcloud command. + +Since xbcloud does multiple asynchronous requests in parallel, a calculated +value, measured in milliseconds, is used for `max-backoff`. This algorithm +calculates how many milliseconds to sleep before the next retry. A number +generated is based on the combining the power of two (2), the number of +retries already attempted and adds a random number between 1 and 1000. This +number avoids network congestion if multiple chunks have the same backoff +value. If the default values are used, the final retry attempt to be +approximately 17 minutes after the first try. The number is no longer +calculated when the milliseconds reach the `--max-backoff` setting. At that +point, the retries continue by using the `--max-backoff` setting until +the `max-retries` parameter is reached. + +## Retriable errors + +We retry for the following CURL operations: + +* CURLE_GOT_NOTHING + + +* CURLE_OPERATION_TIMEOUT + + +* CURLE_RECV_ERROR + + +* CURLE_SEND_ERROR + + +* CURLE_SEND_FAIL_REWIND + + +* CURLE_PARTIAL_FILE + + +* CURLE_SSL_CONNECT_ERROR + +We retry for the following HTTP operation status codes: + +* 503 + + +* 500 + + +* 504 + + +* 408 + +Each cloud provider may return a different CURL error or an HTTP error, +depending on the issue. Add new errors by setting the following +variables `--curl-retriable-errors` or `--http-retriable-errors` on the +command line or in `my.cnf` or in a custom configuration file under +the [xbcloud] section. + +The error handling is enhanced when using the `--verbose` output. This +output specifies which error caused xbcloud to fail and what parameter a +user must add to retry on this error. + +The following is an example of a verbose output: + +``` +210701 14:34:23 /work/pxb/ins/8.0/bin/xbcloud: Operation failed. Error: Server returned nothing (no headers, no data) +210701 14:34:23 /work/pxb/ins/8.0/bin/xbcloud: Curl error (52) Server returned nothing (no headers, no data) is not configured as retriable. You can allow it by adding --curl-retriable-errors=52 parameter +``` + +## Example + +The following example adjusts the maximum number of retries and the maximum +time between retries. + +``` +xbcloud [options] --max-retries=5 --max-backoff=10000 +``` + +The following text is an example of the exponential backoff used with the +command: + +``` +210702 10:07:05 /work/pxb/ins/8.0/bin/xbcloud: Operation failed. Error: Server returned nothing (no headers, no data) +210702 10:07:05 /work/pxb/ins/8.0/bin/xbcloud: Sleeping for 2384 ms before retrying backup3/xtrabackup_logfile.00000000000000000006 [1] +. . . +210702 10:07:23 /work/pxb/ins/8.0/bin/xbcloud: Operation failed. Error: Server returned nothing (no headers, no data) +210702 10:07:23 /work/pxb/ins/8.0/bin/xbcloud: Sleeping for 4387 ms before retrying backup3/xtrabackup_logfile.00000000000000000006 [2] +. . . +210702 10:07:52 /work/pxb/ins/8.0/bin/xbcloud: Operation failed. Error: Failed sending data to the peer +210702 10:07:52 /work/pxb/ins/8.0/bin/xbcloud: Sleeping for 8691 ms before retrying backup3/xtrabackup_logfile.00000000000000000006 [3] +. . . +210702 10:08:47 /work/pxb/ins/8.0/bin/xbcloud: Operation failed. Error: Failed sending data to the peer +210702 10:08:47 /work/pxb/ins/8.0/bin/xbcloud: Sleeping for 10000 ms before retrying backup3/xtrabackup_logfile.00000000000000000006 [4] +. . . +210702 10:10:12 /work/pxb/ins/8.0/bin/xbcloud: successfully uploaded chunk: backup3/xtrabackup_logfile.00000000000000000006, size: 8388660 +``` + +The following list details the example output: + +> [1.] Chunk `xtrabackup_logfile.00000000000000000006` fails to upload _ +> the first time and slept for 2384 milliseconds. + +> [2.] The same chunk fails for the second time and the time is increased +> to 4387 milliseconds. + +> [3.] The same chunk fails for the third time and the time is increased to +> 8691 milliseconds. + +> [4.] The same chunk fails for the fourth time. The `max-backoff` +> parameter has been reached. All retries sleep the same amount of time after +> reaching the parameter. + +> [5.] The same chunk is successfully uploaded. diff --git a/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_gcs.md b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_gcs.md new file mode 100644 index 000000000000..40a45034f564 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_gcs.md @@ -0,0 +1,53 @@ +# Using the xbcloud with Google Cloud Storage + +## Creating a full backup with Google Cloud Storage + +The support for Google Cloud Storage is implemented using the +interoperability +mode. This mode was especially designed to interact with cloud services +compatible with Amazon S3. + +**See also** + +[Cloud Storage Interoperability](https://cloud.google.com/storage/docs/interoperability) +``` +$ xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \ +xbcloud put --storage=google \ +--google-endpoint=`storage.googleapis.com` \ +--google-access-key='YOUR-ACCESSKEYID' \ +--google-secret-key='YOUR-SECRETACCESSKEY' \ +--google-bucket='mysql_backups' +--parallel=10 \ +$(date -I)-full_backup +``` + +The following options are available when using Google Cloud Storage: + +* –google-access-key = + + +* –google-secret-key = + + +* –google-bucket = + + +* –google-storage-class=name + +**NOTE**: The Google storage class name options are the following: + +* STANDARD + + +* NEARLINE + + +* COLDLINE + + +* ARCHIVE + +**See also** + +[Google storage classes - the default Google storage class depends on +the storage class of the bucket](https://cloud.google.com/storage/docs/changing-default-storage-class) \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_minio.md b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_minio.md new file mode 100644 index 000000000000..72ab776b6cba --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_minio.md @@ -0,0 +1,14 @@ +# Using the xbcloud binary with MinIO + +## Creating a full backup with MinIO + +``` +$ xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \ +xbcloud put --storage=s3 \ +--s3-endpoint='play.minio.io:9000' \ +--s3-access-key='YOUR-ACCESSKEYID' \ +--s3-secret-key='YOUR-SECRETACCESSKEY' \ +--s3-bucket='mysql_backups' +--parallel=10 \ +$(date -I)-full_backup +``` diff --git a/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_s3.md b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_s3.md new file mode 100644 index 000000000000..19171efac865 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_s3.md @@ -0,0 +1,54 @@ +# Using xbcloud Binary with Amazon S3 + +## Creating a full backup with Amazon S3 + +``` +$ xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \ +xbcloud put --storage=s3 \ +--s3-endpoint='s3.amazonaws.com' \ +--s3-access-key='YOUR-ACCESSKEYID' \ +--s3-secret-key='YOUR-SECRETACCESSKEY' \ +--s3-bucket='mysql_backups' +--parallel=10 \ +$(date -I)-full_backup +``` + +The following options are available when using Amazon S3: + +| Option | Details | +|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| –s3-access-key | Use to supply the AWS access key ID | +| –s3-secret-key | Use to supply the AWS secret access key | +| –s3-bucket | Use supply the AWS bucket name | +| –s3-region | Use to specify the AWS region. The default value is **us-east-1** | +| –s3-api-version = | Select the signing algorithm. The default value is AUTO. In this case, xbcloud will probe. | +| –s3-bucket-lookup = | Specify whether to use bucket.endpoint.com or endpoint.com/bucket*style requests. The default value is AUTO. In this case, xbcloud will probe. | | +| –s3-storage-class= | Specify the [S3 storage class](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html). The default storage class depends on the provider. The name options are the following:
    • STANDARD
    • STANDARD_IA
    • GLACIER
    **NOTE** If you use the GLACIER storage class, the object must be [restored to S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/restoring-objects.html) before restoring the backup. Also supports using custom S3 implementations such as MinIO or CephRadosGW. | | + +## Environment variables + +The following environment variables are recognized. xbcloud maps them +automatically to corresponding parameters applicable to the selected storage. + + +* AWS_ACCESS_KEY_ID (or ACCESS_KEY_ID) + + +* AWS_SECRET_ACCESS_KEY (or SECRET_ACCESS_KEY) + + +* AWS_DEFAULT_REGION (or DEFAULT_REGION) + + +* AWS_ENDPOINT (or ENDPOINT) + + +* AWS_CA_BUNDLE + +## Restoring with S3 + +```shell +$ xbcloud get s3://operator-testing/bak22 \ +--s3-endpoint=https://storage.googleapis.com/ \ +--parallel=10 2>download.log | xbstream -x -C restore --parallel=8 +``` diff --git a/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_swift.md b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_swift.md new file mode 100644 index 000000000000..36de48746f6c --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xbcloud/xbcloud_swift.md @@ -0,0 +1,170 @@ +# Using the xbcloud Binary with Swift + +## Creating a full backup with Swift + +The following example shows how to make a full backup and upload it to Swift. + +``` +$ xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \ +xbcloud put --storage=swift \ +--swift-container=test \ +--swift-user=test:tester \ +--swift-auth-url=http://192.168.8.80:8080/ \ +--swift-key=testing \ +--parallel=10 \ +full_backup +``` + +The following OpenStack environment variables are also recognized and mapped automatically to the corresponding **swift** parameters (`--storage=swift`): + +> +> * OS_AUTH_URL + + +> * OS_TENANT_NAME + + +> * OS_TENANT_ID + + +> * OS_USERNAME + + +> * OS_PASSWORD + + +> * OS_USER_DOMAIN + + +> * OS_USER_DOMAIN_ID + + +> * OS_PROJECT_DOMAIN + + +> * OS_PROJECT_DOMAIN_ID + + +> * OS_REGION_NAME + + +> * OS_STORAGE_URL + + +> * OS_CACERT + +## Restoring with Swift + +```shell +$ xbcloud get [options] [] | xbstream -x +``` + +The following example shows how to fetch and restore the backup from Swift: + +```shell +$ xbcloud get --storage=swift \ +--swift-container=test \ +--swift-user=test:tester \ +--swift-auth-url=http://192.168.8.80:8080/ \ +--swift-key=testing \ +full_backup | xbstream -xv -C /tmp/downloaded_full + +$ xbcloud delete --storage=swift --swift-user=xtrabackup \ +--swift-password=xtrabackup123! --swift-auth-version=3 \ +--swift-auth-url=http://openstack.ci.percona.com:5000/ \ +--swift-container=mybackup1 --swift-domain=Default +``` + +## Command-line options + +*xbcloud* has the following command line options: + + +### --storage(=[swift|s3|google]) +Cloud storage option. *xbcloud* supports Swift, MinIO, and AWS S3. +The default value is `swift`. + + +### --swift-auth-url() +URL of Swift cluster. + + +### --swift-storage-url() +xbcloud will try to get object-store URL for given region (if any specified) +from the keystone response. One can override that URL by passing +–swift-storage-url=URL argument. + + +### --swift-user() +Swift username (X-Auth-User, specific to Swift) + + +### --swift-key() +Swift key/password (X-Auth-Key, specific to Swift) + + +### --swift-container() +Container to backup into (specific to Swift) + + +### --parallel(=N) +Maximum number of concurrent upload/download requests. Default is `1`. + + +### --cacert() +Path to the file with CA certificates + + +### --insecure() +Do not verify servers certificate + +### Swift authentication options + +Swift specification describes several [authentication options](http://docs.openstack.org/developer/swift/overview_auth.html). *xbcloud* can +authenticate against keystone with API version 2 and 3. + + +### --swift-auth-version() +Specifies the swift authentication version. Possible values are: `1.0` - +TempAuth, `2.0` - Keystone v2.0, and `3` - Keystone v3. Default value is +`1.0`. + +For v2 additional options are: + + +### --swift-tenant() +Swift tenant name. + + +### --swift-tenant-id() +Swift tenant ID. + + +### --swift-region() +Swift endpoint region. + + +### --swift-password() +Swift password for the user. + +For v3 additional options are: + + +### --swift-user-id() +Swift user ID. + + +### --swift-project() +Swift project name. + + +### --swift-project-id() +Swift project ID. + + +### --swift-domain() +Swift domain name. + + +### --swift-domain-id() +Swift domain ID. diff --git a/storage/innobase/xtrabackup/doc/docs/xbcrypt/xbcrypt.md b/storage/innobase/xtrabackup/doc/docs/xbcrypt/xbcrypt.md new file mode 100644 index 000000000000..92fb9d9c23bc --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xbcrypt/xbcrypt.md @@ -0,0 +1,49 @@ +# The xbcrypt binary + +To support encryption and decryption of the backups, a new tool `xbcrypt` was +introduced to *Percona XtraBackup*. + +**Percona XtraBackup** 8.0.28-20 implements the XBCRYPT_ENCRYPTION_KEY environment variable. The variable is only used in place of the `--encrypt_key=name` option. You can use the environment variable or command line option. If you use both, the command line option takes precedence over the value specified in the environment variable. + +This utility has been modeled after The [xbstream binary](https://docs.percona.com/percona-xtrabackup/8.0/xbstream/xbstream.html#xbstream-binary) to perform +encryption and decryption outside of *Percona XtraBackup*. `xbcrypt` has +following command line options: + + +### -d(, --decrypt() +Decrypt data input to output. + + +### -i(, --input(=name) +Optional input file. If not specified, input will be read from standard +input. + + +### -o(, --output(=name) +Optional output file. If not specified, output will be written to standard +output. + + +### -a(, --encrypt-algo(=name) +Encryption algorithm. + + +### -k(, --encrypt-key(=name) +Encryption key. + + +### -f(, --encrypt-key-file(=name) +File which contains encryption key. + + +### -s(, --encrypt-chunk-size(=#) +Size of working buffer for encryption in bytes. The default value is 64K. + + +### --encrypt-threads(=#) +This option specifies the number of worker threads that will be used for +parallel encryption/decryption. + + +### -v(, --verbose() +Display verbose status output. diff --git a/storage/innobase/xtrabackup/doc/docs/xbstream/xbstream.md b/storage/innobase/xtrabackup/doc/docs/xbstream/xbstream.md new file mode 100644 index 000000000000..6d14b5f94ddf --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xbstream/xbstream.md @@ -0,0 +1,69 @@ +# The xbstream binary + +To support simultaneous compression and streaming, a new custom streaming +format called xbstream was introduced to *Percona XtraBackup* in addition to +the TAR format. That was required to overcome some limitations of traditional +archive formats such as tar, cpio and others which did not allow streaming +dynamically generated files, for example dynamically compressed files. Other +advantages of xbstream over traditional streaming/archive format include +ability to stream multiple files concurrently (so it is possible to use +streaming in the xbstream format together with the –parallel option) and more +compact data storage. + +This utility has a tar-like interface: + +> +> * with the `-x` option it extracts files from the stream read from its +> standard input to the current directory unless specified otherwise with the +> `-c` option. Support for parallel extraction with the `--parallel` +> option has been implemented in *Percona XtraBackup* 2.4.7. + + +> * with the `-c` option it streams files specified on the command line to its +> standard output. + + +> * with the `--decrypt=ALGO` option specified xbstream will automatically +> decrypt encrypted files when extracting input stream. Supported values for +> this option are: `AES128`, `AES192`, and `AES256`. Either +> `--encrypt-key` or `--encrypt-key-file` options must be specified to +> provide encryption key, but not both. This option has been implemented in +> *Percona XtraBackup* 2.4.7. + + +> * with the `--encrypt-threads` option you can specify the number of threads +> for parallel data encryption. The default value is `1`. This option has +> been implemented in *Percona XtraBackup* 2.4.7. + + +> * the `--encrypt-key` option is used to specify the encryption key that will +> be used. It can’t be used with `--encrypt-key-file` option because they +> are mutually exclusive. This option has been implemented in *Percona +> XtraBackup* 2.4.7. + + +> * the `--encrypt-key-file` option is used to specify the file that contains +> the encryption key. It can’t be used with `--encrypt-key` option. +> because they are mutually exclusive. This option has been implemented in +> *Percona XtraBackup* 2.4.7. + +The utility also tries to minimize its impact on the OS page cache by using the +appropriate `posix_fadvise()` calls when available. + +When compression is enabled with *xtrabackup* all data is being compressed, +including the transaction log file and meta data files, using the specified +compression algorithm. The only currently supported algorithm is `quicklz`. + +The resulting files have the qpress archive format, i.e., every `\*.qp` file +produced by *xtrabackup* is essentially a one-file qpress archive and can be +extracted and uncompressed by the [qpress file archiver](http://www.quicklz.com/). This means that there is no need to decompress +entire backup to restore a single table as with `tar.gz`. + +To decompress individual files, run *xbstream* with the +`--decompress` option. You may control the number of threads +used for decompressing by passing the `--decompress-threads` +option. + +Also, files can be decompressed using the **qpress** tool that can be downloaded from +[quicklz.com](http://www.quicklz.com/). Qpress supports multi-threaded +decompression. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup-files.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup-files.md new file mode 100644 index 000000000000..bee46001d21f --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup-files.md @@ -0,0 +1,100 @@ +# Index of files created by Percona XtraBackup + + +* Information related to the backup and the server + + + + + + + + + + + + + + + + + + + + +
    File NameDescription
    backup-my.cnf This file contains information to start the mini instance +of InnoDB during the --prepare. +This +**not** a +backup of the original my.cnf. The +InnoDB configuration is +read from +the file backup-my.cnf created by +xtrabackup when the backup was made. The --prepare uses InnoDB +configuration from backup-my.cnf +by default, or from --defaults-file, if specified. The InnoDB's configuration in this context means server variables that affect dataformat, i.e. innodb_page_size option, innodb_log_block_size, etc. Location-related variables, like innodb_log_group_home_dir or innodb_data_file_path are always ignored by --prepare, so preparing a backup always works with data files from the back directory, rather than any external ones.
    xtrabackup_checkpoints

    The type of the backup (for example, full or incremental), +its state (for example, prepared) and the LSN range contained in it. +This information is used for incremental backups. Example of the +xtrabackup_checkpoints after +taking a full backup:

    backup_type = full-backuped
    +from lsn= 0
    +to_lsn = 15188961605
    +last_lsn = 15188961605
    +
    +
    +Example of the xtrabackup_checkpoints after taking an +incremental backup:

    +
    backup_type = incremental
    +from_lsn = 15188961605
    +to_lsn = 15189350111
    +last_lsn = 15189350111
    +
    +
    xtrabackup_binlog_info

    The binary log file used by the server and its position at the moment of the backup. A result of the following query:

    +
    SELECT server_uuid, local, replication, storage_engines FROM performance_schema.log_status;
    +
    +
    + +
    xtrabackup_binlogThe xtrabackup binary used in the process. +
    xtrabackup_logfileContains data needed for running the: --prepare. +> The bigger this file is the --prepare process +> will take longer to finish. +
    <table_name>.delta.meta

    This file is going to be created when performing the incremental +backup. +> It contains the per-table delta metadata: page size, size of compressed +> page (if the value is 0 it means the tablespace isn’t compressed) and +> space id. Example of this file:

    +
    page_size = 16384
    +zip_size = 0
    +space_id = 0
    +
    +
    +
    + +* Information related to the replication environment (if using the +`--slave-info` option):

    + + `xtrabackup_slave_info`
    + The `CHANGE MASTER` statement needed for setting up a replica. + + +* Information related to the *Galera* and *Percona XtraDB Cluster* (if + using the `--galera-info` option):

    + + `xtrabackup_galera_info`
    +Contains the values of `wsrep_local_state_uuid` and`wsrep_last_committed` status variables diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/analyzing_table_statistics.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/analyzing_table_statistics.md new file mode 100644 index 000000000000..6fb997ac67f5 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/analyzing_table_statistics.md @@ -0,0 +1,156 @@ +# Analyzing Table Statistics + +The *xtrabackup* binary can analyze InnoDB data files in read-only mode to give +statistics about them. To do this, you should use the `--stats` +option. You can combine this with the `--tables` option to limit the +files to examine. It also uses the `--use-memory` option. + +You can perform the analysis on a running server, with some chance of errors due +to the data being changed during analysis. Or, you can analyze a backup copy of +the database. Either way, to use the statistics feature, you need a clean copy +of the database including correctly sized log files, so you need to execute with +`--prepare` twice to use this functionality on a backup. + +The result of running on a backup might look like the following: + +``` + + table: test/table1, index: PRIMARY, space id: 12, root page 3 + estimated statistics in dictionary: + key vals: 25265338, leaf pages 497839, size pages 498304 + real statistics: + level 2 pages: pages=1, data=5395 bytes, data/pages=32% + level 1 pages: pages=415, data=6471907 bytes, data/pages=95% + leaf pages: recs=25958413, pages=497839, data=7492026403 bytes, data/pages=91% +``` + +This can be interpreted as follows: + + +* The first line simply shows the table and index name and its internal +identifiers. If you see an index named `GEN_CLUST_INDEX`, that is the +table’s clustered index, automatically created because you did not explicitly +create a `PRIMARY KEY`. + + +* The estimated statistics in dictionary information is similar to the data +that’s gathered through `ANALYZE TABLE` inside of *InnoDB* to be stored as +estimated cardinality statistics and passed to the query optimizer. + + +* The real statistics information is the result of scanning the data pages and +computing exact information about the index. + + +* `The level pages`: output means that the line shows information about +pages at that level in the index tree. The larger `` is, the farther it +is from the leaf pages, which are level 0. The first line is the root page. + + +* The `leaf pages` output shows the leaf pages, of course. This is where the +table’s data is stored. + + +* The `external pages`: output (not shown) shows large external pages that +hold values too long to fit in the row itself, such as long `BLOB` and +`TEXT` values. + + +* The `recs` is the real number of records (rows) in leaf pages. + + +* The `pages` is the page count. + + +* The `data` is the total size of the data in the pages, in bytes. + + +* The `data/pages` is calculated as (`data` / (`pages` \* `PAGE_SIZE`)) \* +100%. It will never reach 100% because of space reserved for page headers and +footers. + +A more detailed example is posted as a MySQL Performance Blog [post](http://www.mysqlperformanceblog.com/2009/09/14/statistics-of-innodb-tables-and-indexes-available-in-xtrabackup/). + +## Script to Format Output + +The following script can be used to summarize and tabulate the output of the +statistics information: + +``` +tabulate-xtrabackup-stats.pl + +#!/usr/bin/env perl +use strict; +use warnings FATAL => 'all'; +my $script_version = "0.1"; + +my $PG_SIZE = 16_384; # InnoDB defaults to 16k pages, change if needed. +my ($cur_idx, $cur_tbl); +my (%idx_stats, %tbl_stats); +my ($max_tbl_len, $max_idx_len) = (0, 0); +while ( my $line = <> ) { + if ( my ($t, $i) = $line =~ m/table: (.*), index: (.*), space id:/ ) { + $t =~ s!/!.!; + $cur_tbl = $t; + $cur_idx = $i; + if ( length($i) > $max_idx_len ) { + $max_idx_len = length($i); + } + if ( length($t) > $max_tbl_len ) { + $max_tbl_len = length($t); + } + } + elsif ( my ($kv, $lp, $sp) = $line =~ m/key vals: (\d+), \D*(\d+), \D*(\d+)/ ) { + @{$idx_stats{$cur_tbl}->{$cur_idx}}{qw(est_kv est_lp est_sp)} = ($kv, $lp, $sp); + $tbl_stats{$cur_tbl}->{est_kv} += $kv; + $tbl_stats{$cur_tbl}->{est_lp} += $lp; + $tbl_stats{$cur_tbl}->{est_sp} += $sp; + } + elsif ( my ($l, $pages, $bytes) = $line =~ m/(?:level (\d+)|leaf) pages:.*pages=(\d+), data=(\d+) bytes/ ) { + $l ||= 0; + $idx_stats{$cur_tbl}->{$cur_idx}->{real_pages} += $pages; + $idx_stats{$cur_tbl}->{$cur_idx}->{real_bytes} += $bytes; + $tbl_stats{$cur_tbl}->{real_pages} += $pages; + $tbl_stats{$cur_tbl}->{real_bytes} += $bytes; + } +} + +my $hdr_fmt = "%${max_tbl_len}s %${max_idx_len}s %9s %10s %10s\n"; +my @headers = qw(TABLE INDEX TOT_PAGES FREE_PAGES PCT_FULL); +printf $hdr_fmt, @headers; + +my $row_fmt = "%${max_tbl_len}s %${max_idx_len}s %9d %10d %9.1f%%\n"; +foreach my $t ( sort keys %tbl_stats ) { + my $tbl = $tbl_stats{$t}; + printf $row_fmt, $t, "", $tbl->{est_sp}, $tbl->{est_sp} - $tbl->{real_pages}, + $tbl->{real_bytes} / ($tbl->{real_pages} * $PG_SIZE) * 100; + foreach my $i ( sort keys %{$idx_stats{$t}} ) { + my $idx = $idx_stats{$t}->{$i}; + printf $row_fmt, $t, $i, $idx->{est_sp}, $idx->{est_sp} - $idx->{real_pages}, + $idx->{real_bytes} / ($idx->{real_pages} * $PG_SIZE) * 100; + } +} +``` + +### Sample Script Output + +The output of the above Perl script, when run against the sample shown in the +previously mentioned blog post, will appear as follows: + +``` + TABLE INDEX TOT_PAGES FREE_PAGES PCT_FULL +art.link_out104 832383 38561 86.8% +art.link_out104 PRIMARY 498304 49 91.9% +art.link_out104 domain_id 49600 6230 76.9% +art.link_out104 domain_id_2 26495 3339 89.1% +art.link_out104 from_message_id 28160 142 96.3% +art.link_out104 from_site_id 38848 4874 79.4% +art.link_out104 revert_domain 153984 19276 71.4% +art.link_out104 site_message 36992 4651 83.4% +``` + +The columns are the table and index, followed by the total number of pages in +that index, the number of pages not actually occupied by data, and the number of +bytes of real data as a percentage of the total size of the pages of real +data. The first line in the above output, in which the `INDEX` column is +empty, is a summary of the entire table. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.accelerating.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.accelerating.md new file mode 100644 index 000000000000..97f1d094d59f --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.accelerating.md @@ -0,0 +1,61 @@ +# Accelerating the backup process + +### Copying with the `--parallel` and –compress-threads Options + +When making a local or streaming backup with *xbstream* option, multiple files +can be copied at the same time when using the `--parallel` option. This +option specifies the number of threads created by *xtrabackup* to copy data +files. + +To take advantage of this option either the multiple tablespaces option must be +enabled (innodb_file_per_table) or the shared tablespace must be stored +in multiple ibdata files with the innodb_data_file_path option. +Having multiple files for the database (or splitting one into many) doesn’t have +a measurable impact on performance. + +As this feature is implemented **at the file level**, concurrent file transfer +can sometimes increase I/O throughput when doing a backup on highly fragmented +data files, due to the overlap of a greater number of random read requests. You +should consider tuning the filesystem also to obtain the maximum performance +(e.g. checking fragmentation). + +If the data is stored on a single file, this option will have no effect. + +To use this feature, simply add the option to a local backup, for example: + +``` +$ xtrabackup --backup --parallel=4 --target-dir=/path/to/backup +``` + +By using the *xbstream* in streaming backups, you can additionally speed up the +compression process with the `--compress-threads` option. This option +specifies the number of threads created by *xtrabackup* for for parallel data +compression. The default value for this option is 1. + +To use this feature, simply add the option to a local backup, for example: + +``` +$ xtrabackup --backup --stream=xbstream --compress --compress-threads=4 --target-dir=./ > backup.xbstream +``` + +Before applying logs, compressed files will need to be uncompressed. + +### The `--rsync` Option + +In order to speed up the backup process and to minimize the time `FLUSH TABLES +WITH READ LOCK` is blocking the writes, the option `--rsync` should be +used. When this option is specified, *xtrabackup* uses `rsync` to copy all +non-InnoDB files instead of spawning a separate `cp` for each file, which can +be much faster for servers with a large number of databases or +tables. *xtrabackup* will call the `rsync` twice, once before the `FLUSH +TABLES WITH READ LOCK` and once during to minimize the time the read lock is +being held. During the second `rsync` call, it will only synchronize the +changes to non-transactional data (if any) since the first call performed before +the `FLUSH TABLES WITH READ LOCK`. Note that *Percona XtraBackup* will use +[Backup locks](https://www.percona.com/doc/percona-server/5.6/management/backup_locks.html#backup-locks) +where available as a lightweight alternative to `FLUSH TABLES WITH READ +LOCK`. This feature is available in *Percona Server for MySQL* 5.6+. *Percona XtraBackup* +uses this automatically to copy non-InnoDB data to avoid blocking DML queries +that modify InnoDB tables. + +**NOTE**: This option cannot be used together with the `--stream` option. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.encrypting.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.encrypting.md new file mode 100644 index 000000000000..cda3369b926a --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.encrypting.md @@ -0,0 +1,116 @@ +# Encrypting Backups + +*Percona XtraBackup* supports encrypting and decrypting local and streaming +backups with *xbstream* option adding another layer of protection. The +encryption is implemented using the `libgcrypt` library from GnuPG. + +## Creating Encrypted Backups + +To make an encrypted backup the following options need to be specified (options +`--encrypt-key` and `--encrypt-key-file` are mutually exclusive, +i.e. just one of them needs to be provided): + + +* `--encrypt` + + +* :option:\` –encrypt-key\` + + +* :option:\` –encrypt-key-file\` + +Both the `--encrypt-key` option and +`--encrypt-key-file` option can be used to specify the +encryption key. An encryption key can be generated with a command like +`openssl rand -base64 32` + +Example output of that command should look like this: + +``` +U2FsdGVkX19VPN7VM+lwNI0fePhjgnhgqmDBqbF3Bvs= +``` + +This value then can be used as the encryption key + +### The `--encrypt-key` Option + +Example of the *xtrabackup* command using the `--encrypt-key` should +look like this: + +``` +$ xtrabackup --backup --encrypt=AES256 --encrypt-key="U2FsdGVkX19VPN7VM+lwNI0fePhjgnhgqmDBqbF3Bvs=" --target-dir=/data/backup +``` + +### The `--encrypt-key-file` Option + +Use the `--encrypt-key-file` option as follows: + +``` +$ xtrabackup --backup --encrypt=AES256 --encrypt-key-file=/data/backups/keyfile --target-dir=/data/backup +``` + +**NOTE**: Depending on the text editor that you use to make the `KEYFILE`, +the editor can automatically insert the CRLF (end of line) +character. This will cause the key size to grow and thus making it +invalid. The suggested way to create the file is by using the +command line: `echo -n “U2FsdGVkX19VPN7VM+lwNI0fePhjgnhgqmDBqbF3Bvs=” > /data/backups/keyfile`. + +## Optimizing the encryption process + +Two new options are available for encrypted backups that can be used to speed up +the encryption process. These are `--encrypt-threads` and +`--encrypt-chunk-size`. By using the `--encrypt-threads` option +multiple threads can be specified to be used for encryption in parallel. Option +`--encrypt-chunk-size` can be used to specify the size (in bytes) of the +working encryption buffer for each encryption thread (default is 64K). + +## Decrypting Encrypted Backups + +Backups can be decrypted with The xbcrypt binary. The following one-liner can be +used to encrypt the whole folder: + +``` +$ for i in `find . -iname "*\.xbcrypt"`; do xbcrypt -d --encrypt-key-file=/root/secret_key --encrypt-algo=AES256 < $i > $(dirname $i)/$(basename $i .xbcrypt) && rm $i; done +``` + +*Percona XtraBackup* `--decrypt` option has been implemented that can be +used to decrypt the backups: + +``` +$ xtrabackup --decrypt=AES256 --encrypt-key="U2FsdGVkX19VPN7VM+lwNI0fePhjgnhgqmDBqbF3Bvs=" --target-dir=/data/backup/ +``` + +*Percona XtraBackup* doesn’t automatically remove the encrypted files. In order +to clean up the backup directory users should remove the `\*.xbcrypt` +files. + +**NOTE**: `--parallel` can be used with `--decrypt` option to decrypt +multiple files simultaneously. + +When the files are decrypted, the backup can be prepared. + +## Preparing Encrypted Backups + +After the backups have been decrypted, they can be prepared in the same way as +the standard full backups with the `--prepare` option: + +``` +$ xtrabackup --prepare --target-dir=/data/backup/ +``` + +## Restoring Encrypted Backups + +*xtrabackup* offers the `--copy-back` option to restore a backup to the +server’s datadir: + +``` +$ xtrabackup --copy-back --target-dir=/data/backup/ +``` + +It will copy all the data-related files back to the server’s datadir, +determined by the server’s `my.cnf` configuration file. You should check +the last line of the output for a success message: + +``` +150318 11:08:13 xtrabackup: completed OK! +``` diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.history.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.history.md new file mode 100644 index 000000000000..60a26a844b43 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.history.md @@ -0,0 +1,163 @@ +# Store backup history on the server + +*Percona XtraBackup* supports storing the backups history on the server. This +feature was implemented in *Percona XtraBackup* 2.2. Storing backup history on +the server was implemented to provide users with additional information about +backups that are being taken. Backup history information will be stored in the +PERCONA_SCHEMA.XTRABACKUP_HISTORY table. + +To use this feature the following options are available: + + +* `--history` = : This option enables the history +feature and allows the user to specify a backup series name that will be +placed within the history record. + + +* `--incremental-history-name` = : This option allows an +incremental backup to be made based on a specific history series by +name. *xtrabackup* will search the history table looking for the most recent +(highest `to_lsn`) backup in the series and take the `to_lsn` value to use +as it’s starting lsn. This is mutually exclusive with +`--incremental-history-uuid`, `--incremental-basedir` and +`--incremental-lsn` options. If no valid LSN can be found +(no series by that name) *xtrabackup* will return with an error. + + +* `--incremental-history-uuid` = : Allows an incremental backup to +be made based on a specific history record identified by UUID. *xtrabackup* +will search the history table looking for the record matching UUID and take +the `to_lsn` value to use as it’s starting LSN. This options is mutually +exclusive with `--incremental-basedir`, `--incremental-lsn` +and `--incremental-history-name` options. If no valid LSN can be found +(no record by that UUID or missing `to_lsn`), *xtrabackup* will return +with an error. + +**NOTE**: Backup that’s currently being performed will **NOT** exist in the +xtrabackup_history table within the resulting backup set as the record will +not be added to that table until after the backup has been taken. + +If you want access to backup history outside of your backup set in the case of +some catastrophic event, you will need to either perform a `mysqldump`, +partial backup or `SELECT` \* on the history table after *xtrabackup* +completes and store the results with you backup set. + +For the necessary privileges, see Permissions and Privileges Needed. + +### PERCONA_SCHEMA.XTRABACKUP_HISTORY table + +This table contains the information about the previous server +backups. Information about the backups will only be written if the backup was +taken with `--history` option. + +| Column Name + + | Description + + | +| ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | | | | | | | | | | | | | | +| uuid + + | Unique backup id + + | +| name + + | User provided name of backup series. There may be multiple entries with the same name used to identify related backups in a series. + + | +| tool_name + + | Name of tool used to take backup + + | +| tool_command + + | Exact command line given to the tool with –password and –encryption_key obfuscated + + | +| tool_version + + | Version of tool used to take backup + + | +| ibbackup_version + + | Version of the xtrabackup binary used to take backup + + | +| server_version + + | Server version on which backup was taken + + | +| start_time + + | Time at the start of the backup + + | +| end_time + + | Time at the end of the backup + + | +| lock_time + + | Amount of time, in seconds, spent calling and holding locks for `FLUSH TABLES WITH READ LOCK` + + | +| binlog_pos + + | Binlog file and position at end of `FLUSH TABLES WITH READ LOCK` + + | +| innodb_from_lsn + + | LSN at beginning of backup which can be used to determine prior backups + + | +| innodb_to_lsn + + | LSN at end of backup which can be used as the starting lsn for the next incremental + + | +| partial + + | Is this a partial backup, if `N` that means that it’s the full backup + + | +| incremental + + | Is this an incremental backup + + | +| format + + | Description of result format (`xbstream`) + + | +| compact + + | Is this a compact backup + + | +| compressed + + | Is this a compressed backup + + | +| encrypted + + | Is this an encrypted backup + + | +### Limitations + + +* `--history` option must be specified only on the command +line and not within a configuration file in order to be effective. + + +* `--incremental-history-name` and `--incremental-history-uuid` +options must be specified only on the command line and not within +a configuration file in order to be effective. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.streaming.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.streaming.md new file mode 100644 index 000000000000..216de70bf871 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/backup.streaming.md @@ -0,0 +1,127 @@ +# Streaming Backups + +**Percona XtraBackup** supports streaming mode. Streaming mode sends a backup to `STDOUT` in the *xbstream* format instead of copying the files to the backup directory. + +This method allows you to use other programs to filter the output of the backup, +providing greater flexibility for storage of the backup. For example, +compression is achieved by piping the output to a compression utility. One of +the benefits of streaming backups and using Unix pipes is that the backups can +be automatically encrypted. + +To use the streaming feature, you must use the `--stream`, +providing the format of the stream (`xbstream` ) and where to store +the temporary files: + +``` +$ xtrabackup --stream=xbstream --target-dir=/tmp +``` + +*xtrabackup* uses *xbstream* to stream all of the data files to `STDOUT`, in a +special `xbstream` format. After it finishes streaming all of the data files +to `STDOUT`, it stops xtrabackup and streams the saved log file too. + +When compression is enabled, *xtrabackup* compresses the output data, except for the meta and non-InnoDB files which are not compressed, using the specified +compression algorithm. The only currently supported algorithm is +`quicklz`. The resulting files have the `qpress` archive format, i.e. every +\*.qp file produced by xtrabackup is essentially a one-file qpress archive and +can be extracted and uncompressed by the [qpress file archiver](http://www.quicklz.com/) which is available from Percona Software +repositories. + +Using *xbstream* as a stream option, backups can be copied and compressed in +parallel. This option can significantly improve the speed of the backup process. In case backups +were both compressed and encrypted, they must be decrypted before they are uncompressed. + +| Task + + | Command + + | +| ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | | | | | | | | | | | | | | | | +| Stream the backup into an archive named `backup.xbstream` + + | `xtrabackup --backup --stream=xbstream --target-dir=./ > backup.xbstream` + + | +| Stream the backup into a compressed archive named `backup.xbstream` + + | `xtrabackup --backup --stream=xbstream --compress --target-dir=./ > backup.xbstream` + + | +| Encrypt the backup + + | $ xtrabackup –backup –stream=xbstream ./ > backup.xbstream gzip - | openssl des3 -salt -k “password” > backup.xbstream.gz.des3 + + | +| Unpack the backup to the current directory + + | `xbstream -x < backup.xbstream` + + | +| Send the backup compressed directly to another host and unpack it + + | `xtrabackup --backup --compress --stream=xbstream --target-dir=./ | ssh user@otherhost “xbstream -x”` + + | +| Send the backup to another server using `netcat`. + + | On the destination host: + +``` +$ nc -l 9999 | cat - > /data/backups/backup.xbstream +``` + +On the source host: + +``` +$ xtrabackup --backup --stream=xbstream ./ | nc desthost 9999 +``` + + | +| Send the backup to another server using a one-liner: + + | $ ssh [user@desthost](mailto:user@desthost) “( nc -l 9999 > /data/backups/backup.xbstream & )” && xtrabackup –backup –stream=xbstream ./ | nc desthost 9999 + + | +| Throttle the throughput to 10MB/sec using the `pipe viewer` tool + + | $ xtrabackup –backup –stream=xbstream ./ | pv -q -L10m ssh [user@desthost](mailto:user@desthost) “cat - > /data/backups/backup.xbstream” + + | +| Checksumming the backup during the streaming: + + | On the destination host: + +``` +$ nc -l 9999 | tee >(sha1sum > destination_checksum) > /data/backups/backup.xbstream +``` + +On the source host: + +``` +$ xtrabackup --backup --stream=xbstream ./ | tee >(sha1sum > source_checksum) | nc desthost 9999 +``` + +Compare the checksums on the source host: + +``` +$ cat source_checksum +65e4f916a49c1f216e0887ce54cf59bf3934dbad - +``` + +Compare the checksums on the destination host: + +``` +$ cat destination_checksum +65e4f916a49c1f216e0887ce54cf59bf3934dbad - +``` + + | +| Parallel compression with parallel copying backup + + | `xtrabackup --backup --compress --compress-threads=8 --stream=xbstream --parallel=4 --target-dir=./ > backup.xbstream` + + | +### Footnotes + +Note that the streamed backup will need to be prepared before +restoration. Streaming mode does not prepare the backup. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/flush-tables-with-read-lock.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/flush-tables-with-read-lock.md new file mode 100644 index 000000000000..67fdf317ae3d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/flush-tables-with-read-lock.md @@ -0,0 +1,115 @@ +# `FLUSH TABLES WITH READ LOCK` option + +The `FLUSH TABLES WITH READ LOCK` option does the following with a global read lock: + + +* Closes all open tables + + +* Locks all tables for all databases + +Release the lock with `UNLOCK TABLES`. + +**NOTE**: `FLUSH TABLES WITH READ LOCK` does not prevent inserting rows into the log tables. + +To ensure consistent backups, use the `FLUSH TABLES WITH READ LOCK` option before taking a non-InnoDB file backup. The option does not affect long-running queries. + +Long-running queries with `FLUSH TABLES WITH READ LOCK` enabled can leave the server in a read-only mode until the queries finish. Killing the `FLUSH TABLES WITH READ LOCK` does not help if the database is in either the `Waiting for table flush` or `Waiting for master to send event` state. To return to normal operation, you must kill any long-running queries. + +**NOTE**: All described in this section has no effect when backup locks are +used. *Percona XtraBackup* will use [Backup locks](https://www.percona.com/doc/percona-server/5.6/management/backup_locks.html#backup-locks) +where available as a lightweight alternative to `FLUSH TABLES WITH READ +LOCK`. This feature is available in *Percona Server for MySQL* 5.6+. +*Percona XtraBackup* uses this automatically to copy non-InnoDB data to avoid blocking +DML queries that modify InnoDB tables. + +In order to prevent this from happening two things have been implemented: + + +* *xtrabackup* waits for a good moment to issue the global lock + + +* *xtrabackup* kills all queries or only the SELECT queries which prevent the +global lock from being acquired + +## Waiting for queries to finish + +You should issue a global lock when no long queries are running. Waiting to issue the global lock for extended period of time is not a good method. The wait can extend the time needed for +backup to take place. The –ftwrl-wait-timeout option can limit the +waiting time. If it cannot issue the lock during this +time, *xtrabackup* stops the option, exits with an error message, and backup is +not be taken. + +The default value for this option is zero (0) value which turns off the option. + +Another possibility is to specify the type of query to wait on. In this case +`--ftwrl-wait-query-type`. Possible values are `all` and +`update`. When `all` is used *xtrabackup* will wait for all long running +queries (execution time longer than allowed by `--ftwrl-wait-threshold`) +to finish before running the `FLUSH TABLES WITH READ LOCK`. When `update` is +used *xtrabackup* will wait on `UPDATE/ALTER/REPLACE/INSERT` queries to +finish. + +The time needed for a specific query to complete is hard to predict. We assume that the long-running queries will not finish in a timely manner. Other queries which run for a short time finish quickly. *xtrabackup* uses the value of +–ftwrl-wait-threshold option to specify the long-running queries +and will block a global lock. In order to use this option +xtrabackup user should have `PROCESS` and `SUPER` privileges. + +## Killing the blocking queries + +The second option is to kill all the queries which prevent from acquiring the +global lock. In this case, all queries which run longer than `FLUSH TABLES WITH +READ LOCK` are potential blockers. Although all queries can be killed, +additional time can be specified for the short running queries to finish using +the `--kill-long-queries-timeout` option. This option +specifies the time for queries to complete, after the value is reached, all the +running queries will be killed. The default value is zero, which turns this +feature off. + +The `--kill-long-query-type` option can be used to specify all or only +`SELECT` queries that are preventing global lock from being acquired. In order +to use this option xtrabackup user should have `PROCESS` and `SUPER` +privileges. + +## Options summary + + +* `--ftwrl-wait-timeout` (seconds) - how long to wait for a +good moment. Default is 0, not to wait. + + +* `--ftwrl-wait-query-type` - which long queries +should be finished before `FLUSH TABLES WITH READ LOCK` is run. Default is +all. + + +* `--ftwrl-wait-threshold` (seconds) - how long query +should be running before we consider it long running and potential blocker of +global lock. + + +* `--kill-long-queries-timeout` (seconds) - how many time +we give for queries to complete after `FLUSH TABLES WITH READ LOCK` is +issued before start to kill. Default if `0`, not to kill. + + +* `--kill-long-query-type` - which queries should be killed once +`kill-long-queries-timeout` has expired. + +### Example + +Running the *xtrabackup* with the following options will cause *xtrabackup* +to spend no longer than 3 minutes waiting for all queries older than 40 seconds +to complete. + +``` +$ xtrabackup --backup --ftwrl-wait-threshold=40 \ +--ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 \ +--kill-long-queries-timeout=20 --kill-long-query-type=all \ +--target-dir=/data/backups/ +``` + +After `FLUSH TABLES WITH READ LOCK` is issued, *xtrabackup* will wait for 20 +seconds for lock to be acquired. If lock is still not acquired after 20 seconds, +it will kill all queries which are running longer that the `FLUSH TABLES WITH +READ LOCK`. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/implementation_details.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/implementation_details.md new file mode 100644 index 000000000000..7d337a564693 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/implementation_details.md @@ -0,0 +1,50 @@ +# Implementation Details + +This page contains notes on various internal aspects of the *xtrabackup* tool's +operation. + +## File Permissions + +*xtrabackup* opens the source data files in read-write mode, although it does +not modify the files. This means that you must run *xtrabackup* as a user who +has permission to write the data files. The reason for opening the files in +read-write mode is that *xtrabackup* uses the embedded *InnoDB* libraries to +open and read the files, and *InnoDB* opens them in read-write mode because it +normally assumes it is going to write to them. + +## Tuning the OS Buffers + +Because *xtrabackup* reads large amounts of data from the filesystem, it uses +`posix_fadvise()` where possible, to instruct the operating system not to try +to cache the blocks it reads from disk. Without this hint, the operating system +would prefer to cache the blocks, assuming that `xtrabackup` is likely to need +them again, which is not the case. Caching such large files can place pressure +on the operating system’s virtual memory and cause other processes, such as the +database server, to be swapped out. The `xtrabackup` tool avoids this with the +following hint on both the source and destination files: + +``` +posix_fadvise(file, 0, 0, POSIX_FADV_DONTNEED) +``` + +In addition, xtrabackup asks the operating system to perform more aggressive +read-ahead optimizations on the source files: + +``` +posix_fadvise(file, 0, 0, POSIX_FADV_SEQUENTIAL) +``` + +## Copying Data Files + +When copying the data files to the target directory, *xtrabackup* reads and +writes 1 MB of data at a time. This is not configurable. When copying the log +file, *xtrabackup* reads and writes 512 bytes at a time. This is also not +possible to configure, and matches InnoDB’s behavior (workaround exists in +*Percona Server for MySQL* because it has an option to tune +`innodb_log_block_size` for *XtraDB*, and in that case *Percona XtraBackup* will match the tuning). + +After reading from the files, `xtrabackup` iterates over the 1MB buffer a page +at a time, and checks for page corruption on each page with InnoDB’s +`buf_page_is_corrupted()` function. If the page is corrupt, it re-reads and +retries up to 10 times for each page. It skips this check on the doublewrite +buffer. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/incremental_backups.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/incremental_backups.md new file mode 100644 index 000000000000..9fe4352a449c --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/incremental_backups.md @@ -0,0 +1,220 @@ +# Incremental Backups + +*xtrabackup* supports incremental backups. It copies only the data that has +changed since the last full backup. You can perform many incremental backups +between each full backup, so you can set up a backup process such as a full +backup once a week and an incremental backup every day, or full backups every +day and incremental backups every hour. + +**NOTE**: Incremental backups on the MyRocks storage engine do not determine if an earlier full backup or incremental backup contains the same files. **Percona XtraBackup** copies all of the MyRocks files each time it takes a backup. + +Incremental backups work because each InnoDB page (usually 16kb in size) +contains a log sequence number, or LSN. The LSN is the system +version number for the entire database. Each page’s LSN shows how +recently it was changed. An incremental backup copies each page whose +LSN is newer than the previous incremental or full backup’s +LSN. There are two algorithms in use to find the set of such pages to be +copied. The first one, available with all the server types and versions, is to +check the page LSN directly by reading all the data pages. The second +one, available with *Percona Server for MySQL*, is to enable the [changed page tracking](http://www.percona.com/doc/percona-server/5.5/management/changed_page_tracking.html) +feature on the server, which will note the pages as they are being changed. This +information will be then written out in a compact separate so-called bitmap +file. The *xtrabackup* binary will use that file to read only the data pages it +needs for the incremental backup, potentially saving many read requests. The +latter algorithm is enabled by default if the *xtrabackup* binary finds the +bitmap file. It is possible to specify `--incremental-force-scan` to +read all the pages even if the bitmap data is available. + +Incremental backups do not actually compare the data files to the previous +backup’s data files. In fact, you can use `--incremental-lsn` to perform +an incremental backup without even having the previous backup, if you know its +LSN. Incremental backups simply read the pages and compare their +LSN to the last backup’s LSN. You still need a full backup to +recover the incremental changes, however; without a full backup to act as a +base, the incremental backups are useless. + +## Creating an Incremental Backup + +To make an incremental backup, begin with a full backup as usual. The +*xtrabackup* binary writes a file called `xtrabackup_checkpoints` into the +backup’s target directory. This file contains a line showing the `to_lsn`, +which is the database’s LSN at the end of the backup. Create the +full backup with a command such as the following: + +``` +$ xtrabackup --backup --target-dir=/data/backups/base --datadir=/var/lib/mysql/ +``` + +If you look at the `xtrabackup_checkpoints` file, you should see contents +similar to the following: + +``` +backup_type = full-backuped +from_lsn = 0 +to_lsn = 1291135 +``` + +Now that you have a full backup, you can make an incremental backup based on +it. Use a command such as the following: + +``` +$ xtrabackup --backup --target-dir=/data/backups/inc1 \ +--incremental-basedir=/data/backups/base --datadir=/var/lib/mysql/ +``` + +The `/data/backups/inc1/` directory should now contain delta files, such +as `ibdata1.delta` and `test/table1.ibd.delta`. These represent the +changes since the `LSN 1291135`. If you examine the +`xtrabackup_checkpoints` file in this directory, you should see something +similar to the following: + +``` +backup_type = incremental +from_lsn = 1291135 +to_lsn = 1291340 +``` + +The meaning should be self-evident. It’s now possible to use this directory as +the base for yet another incremental backup: + +``` +$ xtrabackup --backup --target-dir=/data/backups/inc2 \ +--incremental-basedir=/data/backups/inc1 --datadir=/var/lib/mysql/ +``` + +## Preparing the Incremental Backups + +The `--prepare` step for incremental backups is not the same as for +normal backups. In normal backups, two types of operations are performed to make +the database consistent: committed transactions are replayed from the log file +against the data files, and uncommitted transactions are rolled back. You must +skip the rollback of uncommitted transactions when preparing a backup, because +transactions that were uncommitted at the time of your backup may be in +progress, and it is likely that they will be committed in the next incremental +backup. You should use the `--apply-log-only` option to prevent the +rollback phase. + +**NOTE**: If you do not use the `--apply-log-only` option to prevent the +rollback phase, then your incremental backups will be useless. After +transactions have been rolled back, further incremental backups cannot be +applied. + +Beginning with the full backup you created, you can prepare it, and then apply +the incremental differences to it. Recall that you have the following backups: + +``` +/data/backups/base +/data/backups/inc1 +/data/backups/inc2 +``` + +To prepare the base backup, you need to run `--prepare` as usual, but +prevent the rollback phase: + +``` +xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base +``` + +The output should end with some text such as the following: + +``` +101107 20:49:43 InnoDB: Shutdown completed; log sequence number 1291135 +``` + +The log sequence number should match the `to_lsn` of the base backup, which +you saw previously. + +This backup is actually safe to restore as-is now, +even though the rollback phase has been skipped. If you restore it and start +*MySQL*, *InnoDB* will detect that the rollback phase was not performed, and it +will do that in the background, as it usually does for a crash recovery upon +start. It will notify you that the database was not shut down normally. + +To apply the first incremental backup to the full backup, you should use the +following command: + +``` +xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \ +--incremental-dir=/data/backups/inc1 +``` + +This applies the delta files to the files in `/data/backups/base`, which +rolls them forward in time to the time of the incremental backup. It then +applies the redo log as usual to the result. The final data is in +`/data/backups/base`, not in the incremental directory. You should see +some output such as the following: + +``` +incremental backup from 1291135 is enabled. +xtrabackup: cd to /data/backups/base/ +xtrabackup: This target seems to be already prepared. +xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(1291340) +Applying /data/backups/inc1/ibdata1.delta ... +Applying /data/backups/inc1/test/table1.ibd.delta ... +.... snip +101107 20:56:30 InnoDB: Shutdown completed; log sequence number 1291340 +``` + +Again, the LSN should match what you saw from your earlier inspection of the +first incremental backup. If you restore the files from +`/data/backups/base`, you should see the state of the database as of the +first incremental backup. + +Preparing the second incremental backup is a similar process: apply the deltas +to the (modified) base backup, and you will roll its data forward in time to the +point of the second incremental backup: + +``` +xtrabackup --prepare --target-dir=/data/backups/base \ +--incremental-dir=/data/backups/inc2 +``` + +**NOTE**: `--apply-log-only` should be used when merging all incrementals +except the last one. That’s why the previous line doesn’t contain the +`--apply-log-only` option. Even if the `--apply-log-only` was +used on the last step, backup would still be consistent but in that case +server would perform the rollback phase. + +If you wish to avoid the notice that *InnoDB* was not shut down normally, when +you applied the desired deltas to the base backup, you can run +`--prepare` again without disabling the rollback phase. + +## Restoring Incremental Backups + +After preparing the incremental backups, the base directory contains the same +data as the full backup. To restoring this backup, you can use this command: +`xtrabackup --copy-back --target-dir=BASE-DIR` + +You may have to change the ownership as detailed on +Restoring a Backup. + +## Incremental Streaming Backups Using xbstream + +Incremental streaming backups can be performed with the *xbstream* streaming +option. Currently backups are packed in custom **xbstream** format. With this +feature, you need to take a BASE backup as well. + +### Making a base backup + +``` +$ xtrabackup --backup --target-dir=/data/backups +``` + +### Taking a local backup + +``` +$ xtrabackup --backup --incremental-lsn=LSN-number --stream=xbstream --target-dir=./ > incremental.xbstream +``` + +### Unpacking the backup + +``` +$ xbstream -x < incremental.xbstream +``` + +### Taking a local backup and streaming it to the remote server and unpacking it + +``` +$ xtrabackup --backup --incremental-lsn=LSN-number --stream=xbstream --target-dir=./ +$ ssh user@hostname " cat - | xbstream -x -C > /backup-dir/" +``` diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/lru_dump.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/lru_dump.md new file mode 100644 index 000000000000..c686ba82f213 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/lru_dump.md @@ -0,0 +1,20 @@ +# LRU dump backup + + +*Percona XtraBackup* includes a saved buffer pool dump into a backup to enable +reducing the warm up time. It restores the buffer pool state from +`ib_buffer_pool` file after restart. *Percona XtraBackup* discovers +`ib_buffer_pool` and backs it up automatically. + + + +![image](../_static/lru_dump.png) + +If the buffer restore option is enabled in `my.cnf` buffer pool will be in +the warm state after backup is restored. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/partial_backups.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/partial_backups.md new file mode 100644 index 000000000000..64a3c54ef43e --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/partial_backups.md @@ -0,0 +1,162 @@ +# Partial Backups + +*xtrabackup* supports taking partial backups when the +innodb_file_per_table option is enabled. There are three ways to create +partial backups: + + +1. matching the tables names with a regular expression + + +2. providing a list of table names in a file + + +3. providing a list of databases + +**WARNING**: Do not copy back the prepared backup. + +Restoring partial backups should be done by importing the tables, +not by using the –copy-back option. It is not +recommended to run incremental backups after running a partial +backup. + +Although there are some scenarios where restoring can be done by +copying back the files, this may lead to database +inconsistencies in many cases and it is not a recommended way to +do it. + +For the purposes of this manual page, we will assume that there is a database +named `test` which contains tables named `t1` and `t2`. + +**WARNING**: If any of the matched or listed tables is deleted during the backup, +*xtrabackup* will fail. + +## Creating Partial Backups + +There are multiple ways of specifying which part of the whole data is backed up: + + +* Use the `--tables` option to list the table names + + +* Use the `--tables-file` option to list the tables in a file + + +* Use the `--databases` option to list the databases + + +* Use the `--databases-file` option to list the databases + +## The –tables Option + +The first method involves the xtrabackup –tables option. The option’s +value is a regular expression that is matched against the fully-qualified database name and table name using the `databasename.tablename` format. + +To back up only tables in the `test` database, use the following +command: + +``` +$ xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ \ +--tables="^test[.].*" +``` + +To back up only the `test.t1` table, use the following command: + +``` +$ xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ \ +--tables="^test[.]t1" +``` + +## The –tables-file Option + +The `--tables-file` option specifies a file that can contain multiple table +names, one table name per line in the file. Only the tables named in the file +will be backed up. Names are matched exactly, case-sensitive, with no pattern or +regular expression matching. The table names must be fully-qualified in +`databasename.tablename` format. + +``` +$ echo "mydatabase.mytable" > /tmp/tables.txt +$ xtrabackup --backup --tables-file=/tmp/tables.txt +``` + +## The –databases and –databases-file options + +The \` –databases\` option accepts a space-separated list of the databases +and tables to backup in the `databasename[.tablename]` format. In addition to +this list, make sure to specify the `mysql`, `sys`, and + +`performance_schema` databases. These databases are required when restoring +the databases using xtrabackup –copy-back. + +**NOTE**: Tables processed during the –prepare step may also be added to the backup +even if they are not explicitly listed by the parameter if they were created +after the backup started. + +``` +$ xtrabackup --databases='mysql sys performance_schema test ...' +``` + +## The `--databases-file` Option + +The –databases-file option specifies a file that can contain multiple +databases and tables in the `databasename[.tablename]` format, one element name per line in the file. Names are matched exactly, case-sensitive, with no pattern or regular expression matching. + +**NOTE**: Tables processed during the –prepare step may also be added to the backup +even if they are not explicitly listed by the parameter if they were created +after the backup started. + +## Preparing Partial Backups + +The procedure is analogous to restoring individual tables : apply the logs and use the +–export option: + +``` +$ xtrabackup --prepare --export --target-dir=/path/to/partial/backup +``` + +When you use the –prepare option on a partial backup, you +will see warnings about tables that don’t exist. This is because these tables +exist in the data dictionary inside InnoDB, but the corresponding .ibd +files don’t exist. They were not copied into the backup directory. These tables +will be removed from the data dictionary, and when you restore the backup and +start InnoDB, they will no longer exist and will not cause any errors or +warnings to be printed to the log file. + +> Could not find any file associated with the tablespace ID: 5 + +> Use –innodb-directories to find the tablespace files. If that fails then use –innodb-force-recovery=1 to ignore this and to permanently lose all changes to the missing tablespace(s). + +## Restoring Partial Backups + +Restoring should be done by restoring individual tables in the partial backup to the server. + +It can also be done by copying back the prepared backup to a “clean” +datadir (in that case, make sure to include the `mysql` +database) to the datadir you are moving the backup to. A system database can be created with the following: + +``` +$ sudo mysql --initialize --user=mysql +``` + +Once you start the server, you may see mysql complaining about missing tablespaces: + +``` +2021-07-19T12:42:11.077200Z 1 [Warning] [MY-012351] [InnoDB] Tablespace 4, name 'test1/t1', file './d2/test1.ibd' is missing! +2021-07-19T12:42:11.077300Z 1 [Warning] [MY-012351] [InnoDB] Tablespace 4, name 'test1/t1', file './d2/test1.ibd' is missing! +``` + +In order to clean the orphan database from the data dictionary, you must manually create the missing database directory and then `DROP` this database from the server. + +Example of creating the missing database: + +``` +$ mkdir /var/lib/mysql/test1/d2 +``` + +Example of dropping the database from the server: + +``` +mysql> DROP DATABASE d2; +Query OK, 2 rows affected (0.5 sec) +``` diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/point-in-time-recovery.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/point-in-time-recovery.md new file mode 100644 index 000000000000..2dc6faf5f2f2 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/point-in-time-recovery.md @@ -0,0 +1,92 @@ +# Point-In-Time recovery + +Recovering up to particular moment in database’s history can be done with +*xtrabackup* and the binary logs of the server. + +Note that the binary log contains the operations that modified the database from +a point in the past. You need a full datadir as a base, and then you can +apply a series of operations from the binary log to make the data match what it +was at the point in time you want. + +``` +$ xtrabackup --backup --target-dir=/path/to/backup +$ xtrabackup --prepare --target-dir=/path/to/backup +``` + +For more details on these procedures, see Creating a backup and Preparing a backup. + +Now, suppose that some time has passed, and you want to restore the database to a +certain point in the past, having in mind that there is the constraint of the +point where the snapshot was taken. + +To find out what is the situation of binary logging in the server, execute the +following queries: + +``` +mysql> SHOW BINARY LOGS; ++------------------+-----------+ +| Log_name | File_size | ++------------------+-----------+ +| mysql-bin.000001 | 126 | +| mysql-bin.000002 | 1306 | +| mysql-bin.000003 | 126 | +| mysql-bin.000004 | 497 | ++------------------+-----------+ +``` + +and + +``` +mysql> SHOW MASTER STATUS; ++------------------+----------+--------------+------------------+ +| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | ++------------------+----------+--------------+------------------+ +| mysql-bin.000004 | 497 | | | ++------------------+----------+--------------+------------------+ +``` + +The first query will tell you which files contain the binary log and the second +one which file is currently being used to record changes, and the current +position within it. Those files are stored usually in the datadir +(unless other location is specified when the server is started with the +`--log-bin=` option). + +To find out the position of the snapshot taken, see the +`xtrabackup_binlog_info` at the backup’s directory: + +``` +$ cat /path/to/backup/xtrabackup_binlog_info +mysql-bin.000003 57 +``` + +This will tell you which file was used at moment of the backup for the binary +log and its position. That position will be the effective one when you restore +the backup: + +``` +$ xtrabackup --copy-back --target-dir=/path/to/backup +``` + +As the restoration will not affect the binary log files (you may need to adjust +file permissions, see Restoring a Backup), the next step is +extracting the queries from the binary log with **mysqlbinlog** starting +from the position of the snapshot and redirecting it to a file + +``` +$ mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 \ + --start-position=57 > mybinlog.sql +``` + +Note that if you have multiple files for the binary log, as in the example, you +have to extract the queries with one process, as shown above. + +Inspect the file with the queries to determine which position or date +corresponds to the point-in-time wanted. Once determined, pipe it to the +server. Assuming the point is `11-12-25 01:00:00`: + +``` +$ mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 \ + --start-position=57 --stop-datetime="11-12-25 01:00:00" | mysql -u root -p +``` + +and the database will be rolled forward up to that Point-In-Time. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/replication.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/replication.md new file mode 100644 index 000000000000..e393d374d17d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/replication.md @@ -0,0 +1,31 @@ +# Making Backups in Replication Environments + +There are options specific to back up from a replication replica. + +## The `--slave-info` Option + +This option is useful when backing up a replication replica server. It prints the +binary log position and name of the source server. It also writes this +information to the `xtrabackup_slave_info` file as a `CHANGE MASTER` +statement. + +This option is useful for setting up a new replica for this source. +You can start a replica server with this backup and issue the statement saved in the +`xtrabackup_slave_info` file. More details of this procedure can be found +in How to setup a replica for replication in 6 simple steps with Percona XtraBackup. + +## The `--safe-slave-backup` Option + +In order to assure a consistent replication state, this option stops the replication +SQL thread and waits to start backing up until `Slave_open_temp_tables` in +`SHOW STATUS` is zero. If there are no open temporary tables, the backup will +take place, otherwise the SQL thread will be started and stopped until there are +no open temporary tables. The backup will fail if `Slave_open_temp_tables` +does not become zero after `--safe-slave-backup-timeout` +seconds (defaults to 300 seconds). The replication SQL thread will be restarted when +the backup finishes. + +Using this option is always recommended when taking backups from a replica server. + +**WARNING**: Make sure your replica is a true replica of the source before using it as a +source for backup. A good tool to validate a replica is [pt-table-checksum](http://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html). diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/restoring_individual_tables.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/restoring_individual_tables.md new file mode 100644 index 000000000000..2b0ede2605ef --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/restoring_individual_tables.md @@ -0,0 +1,78 @@ +# Restoring Individual Tables + +*Percona XtraBackup* can export a table that is contained in its own .ibd file. With *Percona XtraBackup*, you can export individual tables from any *InnoDB* database, and import them into *Percona Server for MySQL* with *XtraDB* or *MySQL* 8.0. The source doesn’t have to be *XtraDB* or *MySQL* 8.0, but the destination does. This method only works on individual .ibd files. + +The following example exports and imports the following table: + +``` +CREATE TABLE export_test ( +a int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +``` + +## Exporting the Table + +Created the table in innodb_file_per_table mode, so +after taking a backup as usual with the –backup option, the +.ibd file exists in the target directory: + +``` +$ find /data/backups/mysql/ -name export_test.* +/data/backups/mysql/test/export_test.ibd +``` + +when you prepare the backup, add the –export option to the +command. Here is an example: + +``` +$ xtrabackup --prepare --export --target-dir=/data/backups/mysql/ +``` + +**NOTE**: If you restore an encrypted InnoDB tablespace table, add the +keyring file: + +``` +$ xtrabackup --prepare --export --target-dir=/tmp/table \ +--keyring-file-data=/var/lib/mysql-keyring/keyring +``` + +Now you should see an .exp file in the target directory: + +``` +$ find /data/backups/mysql/ -name export_test.* +/data/backups/mysql/test/export_test.exp +/data/backups/mysql/test/export_test.ibd +/data/backups/mysql/test/export_test.cfg +``` + +These three files are the only files required to import the table into a server running +*Percona Server for MySQL* with *XtraDB* or *MySQL* 8.0. In case the server uses [InnoDB +Tablespace Encryption](http://dev.mysql.com/doc/refman/5.7/en/innodb-tablespace-encryption.html) +adds an additional .cfp file which contains the transfer key and an encrypted tablespace key. + +**NOTE**: The .cfg metadata file contains an *InnoDB* dictionary dump in a special format. This format is different from the .exp one which is +used in *XtraDB* for the same purpose. A .cfg\` file is not required to import a tablespace to *MySQL* 8.0 or Percona +Server for MySQL 8.0. + +A tablespace is imported successfully even if the table is from +another server, but *InnoDB* performs a schema validation if the corresponding .cfg file is located in the same directory. + +## Importing the Table + +On the destination server running *Percona Server for MySQL* with *XtraDB* and +[innodb_import_table_from_xtrabackup](http://www.percona.com/doc/percona-server/8.0/management/innodb_expand_import.html#innodb_import_table_from_xtrabackup) +option enabled, or *MySQL* 8.0, create a table with the same +structure, and then perform the following steps: + + +1. Run the `ALTER TABLE test.export_test DISCARD TABLESPACE;` +command. If you see the following error, enable +innodb_file_per_table and create the table again. + + +2. Copy the exported files to the `test/` subdirectory of the destination server’s data directory + + +3. Run `ALTER TABLE test.export_test IMPORT TABLESPACE;` + +The table is imported, and you can run a `SELECT` to see the imported data. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/working_with_binary_logs.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/working_with_binary_logs.md new file mode 100644 index 000000000000..14485a5ac883 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/working_with_binary_logs.md @@ -0,0 +1,32 @@ +# Working with Binary Logs + +The `xtrabackup` binary integrates with the `log_status table`. This integration enables `xtrabackup` to print out the backup’s corresponding binary log position, so that you can use this binary log position to provision a new replica or perform point-in-time recovery. + +## Finding the Binary Log Position + +You can find the binary log position corresponding to a backup after the backup has been taken. If your backup is from a server with binary logging enabled, `xtrabackup` creates a file named `xtrabackup_binlog_info` in the target directory. This file contains the binary log file name and position of the exact point when the backup was taken. + +The output is similar to the following during the backup stage: + +``` +210715 14:14:59 Backup created in directory '/backup/' +MySQL binlog position: filename 'binlog.000002', position '156' +. . . +210715 14:15:00 completed OK! +``` + +**NOTE**: As of Percona XtraBackup 8.0.26-18.0, xtrabackup no longer creates the `xtrabackup_binlog_pos_innodb` file. This change is because MySQL and Percona Server no longer update the binary log information on global transaction system section of `ibdata`. You should rely on `xtrabackup_binlog_info` regardless of the storage engine in use. + +## Point-In-Time Recovery + +To perform a point-in-time recovery from an `xtrabackup` backup, you should prepare and restore the backup, and then replay binary logs from the point shown in the `xtrabackup_binlog_info` file. + +A more detailed procedure is found here. + +## Setting Up a New Replication Replica + +To set up a new replica, you should prepare the backup, and restore it to the data directory of your new replication replica. If you are using version 8.0.22 or earlier, in your `CHANGE MASTER TO` command, use the binary log filename and position shown in the `xtrabackup_binlog_info` file to start replication. + +If you are using 8.0.23 or later, use the [CHANGE_REPLICATION_SOURCE_TO and the appropriate options](https://dev.mysql.com/doc/refman/8.0/en/change-replication-source-to.html). `CHANGE_MASTER_TO` is deprecated. + +A more detailed procedure is found in How to setup a replica for replication in 6 simple steps with Percona XtraBackup. diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xbk_option_reference.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xbk_option_reference.md new file mode 100644 index 000000000000..a96cfead4dbe --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xbk_option_reference.md @@ -0,0 +1,974 @@ +# The xtrabackup Option Reference + +This page documents all of the command-line options for the +**xtrabackup** binary. + +## Modes of operation + +You invoke *xtrabackup* in one of the following modes: + + +* `--backup` mode to make a backup in a target directory + + +* `--prepare` mode to restore data from a backup (created in `--backup` mode) + + +* `--copy-back` to copy data from a backup to the location +that contained the original data; to move data instead of copying use +the alternate `--move-back` mode. + + +* `--stats` mode to scan the specified data files and print out index statistics. + +When you intend to run *xtrabackup* in any of these modes, use the following syntax: + +``` +$ xtrabackup [--defaults-file=#] --backup|--prepare|--copy-back|--stats [OPTIONS] +``` + +For example, the `--prepare` mode is applied as follows: + +``` +$ xtrabackup --prepare --target-dir=/data/backup/mysql/ +``` + +For all modes, the default options are read from the **xtrabackup** and +**mysqld** configuration groups from the following files in the given order: + + +1. `/etc/my.cnf` + + +2. `/etc/mysql/my.cnf` + + +3. `/usr/etc/my.cnf` + + +4. `~/.my.cnf`. + +As the first parameter to *xtrabackup* (in place of the `--defaults-file`, +you may supply one of the following: + + +* `--print-defaults` to have *xtrabackup* print the argument list and exit. + + +* `--no-defaults` to forbid reading options from any file but the login file. + + +* `--defaults-file` to read the default options from the given file. + + +* `--defaults-extra-file` to read the specified additional file after +the global files have been read. + + +* `--defaults-group-suffix` to read the configuration groups with the +given suffix. The effective group name is constructed by concatenating the default +configuration groups (**xtrabackup** and **mysqld**) with the given suffix. + + +* `--login-path` to read the given path from the login file. + +### InnoDB Options + +There is a large group of InnoDB options that are normally read from the +`my.cnf` configuration file, so that *xtrabackup* boots up its embedded +InnoDB in the same configuration as your current server. You normally do not +need to specify them explicitly. These options have the same behavior in InnoDB +and XtraDB. See `--innodb-miscellaneous` for more information. + +## Options + + +### --apply-log-only() +This option causes only the redo stage to be performed when preparing a +backup. It is very important for incremental backups. + + +### --backup() +Make a backup and place it in `--target-dir`. See +Creating a backup. + + +### --backup-lock-timeout() +The timeout in seconds for attempts to acquire metadata locks. + + +### --backup-lock-retry-count() +The number of attempts to acquire metadata locks. + + +### --backup-locks() +This option controls if backup locks should be used instead of `FLUSH TABLES +WITH READ LOCK` on the backup stage. The option has no effect when backup +locks are not supported by the server. This option is enabled by default, +disable with `--no-backup-locks`. + + +### --check-privileges() +This option checks if *Percona XtraBackup* has all required privileges. +If a missing privilege is required for the current operation, +it will terminate and print out an error message. +If a missing privilege is not required for the current operation, +but may be necessary for some other XtraBackup operation, +the process is not aborted and a warning is printed. + +``` +xtrabackup: Error: missing required privilege LOCK TABLES on *.* +xtrabackup: Warning: missing required privilege REPLICATION CLIENT on *.* +``` + + +### --close-files() +Do not keep files opened. When *xtrabackup* opens tablespace it normally +doesn’t close its file handle in order to handle the DDL operations +correctly. However, if the number of tablespaces is really huge and can not +fit into any limit, there is an option to close file handles once they are +no longer accessed. *Percona XtraBackup* can produce inconsistent backups +with this option enabled. Use at your own risk. + + +### --compress() +This option tells *xtrabackup* to compress all output data, including the +transaction log file and meta data files, using either the `quicklz` or +`lz4` compression algorithm. `quicklz` is chosen by default. + +When using `--compress=quicklz` or `--compress`, the resulting files have +the qpress archive format, i.e. every `\*.qp` file produced by *xtrabackup* is +essentially a one-file qpress archive and can be extracted and uncompressed +by the [qpress](http://www.quicklz.com/) file archiver. + +`--compress=lz4` produces `\*.lz4` files. You can extract the contents of +these files by using a program such as `lz4`. + + +### --compress-chunk-size(=#) +Size of working buffer(s) for compression threads in bytes. The default +value is 64K. + + +### --compress-threads(=#) +This option specifies the number of worker threads used by *xtrabackup* for +parallel data compression. This option defaults to `1`. Parallel +compression (`--compress-threads`) can be used together +with parallel file copying (`--parallel`). For example, +`--parallel=4 --compress --compress-threads=2` will create 4 I/O threads +that will read the data and pipe it to 2 compression threads. + + +### --copy-back() +Copy all the files in a previously made backup from the backup directory to +their original locations. This option will not copy over existing files +unless `--force-non-empty-directories` option is +specified. + + +### --core-file() +Write core on fatal signals. + + +### --databases(=#) +This option specifies a list of databases and tables that should be backed +up. The option accepts the list of the form `"databasename1[.table_name1] +databasename2[.table_name2] . . ."`. + + +### --databases-exclude(=name) +Excluding databases based on name, Operates the same way +as `--databases`, but matched names are excluded from +backup. Note that this option has a higher priority than +`--databases`. + + +### --databases-file(=#) +This option specifies the path to the file containing the list of databases +and tables that should be backed up. The file can contain the list elements +of the form `databasename1[.table_name1]`, one element per line. + + +### --datadir(=DIRECTORY) +The source directory for the backup. This should be the same as the datadir +for your *MySQL* server, so it should be read from `my.cnf` if that +exists; otherwise you must specify it on the command line. + +When combined with the `--copy-back` or +`--move-back` option, `--datadir` +refers to the destination directory. + +Once connected to the server, in order to perform a backup you will need +`READ` and `EXECUTE` permissions at a filesystem level in the +server’s datadir. + + +### --debug-sleep-before-unlock(=#) +This is a debug-only option used by the *xtrabackup* test suite. + + +### --debug-sync(=name) +The debug sync point. This option is only used by the *xtrabackup* test suite. + + +### --decompress() +Decompresses all files with the `.qp` extension in a backup previously +made with the `--compress` option. The +`--parallel` option will allow multiple files to be +decrypted simultaneously. In order to decompress, the qpress utility MUST be +installed and accessible within the path. *Percona XtraBackup* does not +automatically remove the compressed files. In order to clean up the backup +directory users should use `--remove-original` option. + +The `--decompress` option may be used with *xbstream* to +decompress individual qpress files. + +If you used the `lz4` compression algorithm to compress the files +(`--compress=lz4`), change the `--decompress` parameter +accordingly: `--decompress=lz4`. + + +### --decompress-threads(=#) +Force *xbstream* to use the specified number of threads for +decompressing. + + +### --decrypt(=ENCRYPTION-ALGORITHM) +Decrypts all files with the `.xbcrypt` extension in a backup +previously made with `--encrypt` option. The +`--parallel` option will allow multiple files to be +decrypted simultaneously. *Percona XtraBackup* doesn’t +automatically remove the encrypted files. In order to clean up the backup +directory users should use `--remove-original` option. + + +### --defaults-extra-file(=[MY.CNF]) +Read this file after the global files are read. Must be given as the first +option on the command-line. + + +### --defaults-file(=[MY.CNF]) +Only read default options from the given file. Must be given as the first +option on the command-line. Must be a real file; it cannot be a symbolic +link. + + +### --defaults-group(=GROUP-NAME) +This option is to set the group which should be read from the configuration +file. This is used by *xtrabackup* if you use the +`--defaults-group` option. It is needed for +`mysqld_multi` deployments. + + +### --defaults-group-suffix(=#) +Also reads groups with concat(group, suffix). + + +### --dump-innodb-buffer-pool() +This option controls whether or not a new dump of buffer pool +content should be done. + +With `--dump-innodb-buffer-pool`, *xtrabackup* +makes a request to the server to start the buffer pool dump (it +takes some time to complete and is done in background) at the +beginning of a backup provided the status variable +`innodb_buffer_pool_dump_status` reports that the dump has been +completed. + +``` +$ xtrabackup --backup --dump-innodb-buffer-pool --target-dir=/home/user/backup +``` + +By default, this option is set to OFF. + +If `innodb_buffer_pool_dump_status` reports that there is running +dump of buffer pool, *xtrabackup* waits for the dump to complete +using the value of `--dump-innodb-buffer-pool-timeout` + +The file `ib_buffer_pool` stores tablespace ID and page ID +data used to warm up the buffer pool sooner. + + +### --dump-innodb-buffer-pool-timeout() +This option contains the number of seconds that *xtrabackup* should +monitor the value of `innodb_buffer_pool_dump_status` to +determine if buffer pool dump has completed. + +This option is used in combination with +`--dump-innodb-buffer-pool`. By default, it is set to 10 +seconds. + + +### --dump-innodb-buffer-pool-pct() +This option contains the percentage of the most recently used buffer pool +pages to dump. + +This option is effective if `--dump-innodb-buffer-pool` option is set +to ON. If this option contains a value, *xtrabackup* sets the *MySQL* +system variable `innodb_buffer_pool_dump_pct`. As soon as the buffer pool +dump completes or it is stopped (see +`--dump-innodb-buffer-pool-timeout`), the value of the *MySQL* system +variable is restored. + + +### --encrypt(=ENCRYPTION_ALGORITHM) +This option instructs xtrabackup to encrypt backup copies of InnoDB data +files using the algorithm specified in the ENCRYPTION_ALGORITHM. Currently +supported algorithms are: `AES128`, `AES192` and `AES256` + + +### --encrypt-key(=ENCRYPTION_KEY) +A proper length encryption key to use. It is not recommended to use this +option where there is uncontrolled access to the machine as the command line +and thus the key can be viewed as part of the process info. + + +### --encrypt-key-file(=ENCRYPTION_KEY_FILE) +The name of a file where the raw key of the appropriate length can be read +from. The file must be a simple binary (or text) file that contains exactly +the key to be used. + +It is passed directly to the xtrabackup child process. See the +**xtrabackup** documentation for more details. + + +### --encrypt-threads(=#) +This option specifies the number of worker threads that will be used for +parallel encryption/decryption. +See the **xtrabackup** documentation for more details. + + +### --encrypt-chunk-size(=#) +This option specifies the size of the internal working buffer for each +encryption thread, measured in bytes. It is passed directly to the +xtrabackup child process. See the **xtrabackup** documentation for more details. + + +### --export() +Create files necessary for exporting tables. See Restoring Individual +Tables. + + +### --extra-lsndir(=DIRECTORY) +(for –backup): save an extra copy of the `xtrabackup_checkpoints` +and `xtrabackup_info` files in this directory. + + +### --force-non-empty-directories() +When specified, it makes `--copy-back` and +`--move-back` option transfer files to non-empty +directories. No existing files will be overwritten. If files that need to +be copied/moved from the backup directory already exist in the destination +directory, it will still fail with an error. + + +### --ftwrl-wait-timeout(=SECONDS) +This option specifies time in seconds that xtrabackup should wait for +queries that would block `FLUSH TABLES WITH READ LOCK` before running it. +If there are still such queries when the timeout expires, xtrabackup +terminates with an error. Default is `0`, in which case it does not wait +for queries to complete and starts `FLUSH TABLES WITH READ LOCK` +immediately. Where supported *xtrabackup* will +automatically use [Backup Locks](https://www.percona.com/doc/percona-server/8.0/management/backup_locks.html#backup-locks) +as a lightweight alternative to `FLUSH TABLES WITH READ LOCK` to copy +non-InnoDB data to avoid blocking DML queries that modify InnoDB tables. + + +### --ftwrl-wait-threshold(=SECONDS) +This option specifies the query run time threshold which is used by +xtrabackup to detect long-running queries with a non-zero value of +`--ftwrl-wait-timeout`. `FLUSH TABLES WITH READ LOCK` +is not started until such long-running queries exist. This option has no +effect if `--ftwrl-wait-timeout` is `0`. Default value +is `60` seconds. Where supported xtrabackup will +automatically use [Backup Locks](https://www.percona.com/doc/percona-server/8.0/management/backup_locks.html#backup-locks) +as a lightweight alternative to `FLUSH TABLES WITH READ LOCK` to copy +non-InnoDB data to avoid blocking DML queries that modify InnoDB tables. + + +### --ftwrl-wait-query-type(=all|update) +This option specifies which types of queries are allowed to complete before +xtrabackup will issue the global lock. Default is `all`. + + +### --galera-info() +This option creates the `xtrabackup_galera_info` file which contains +the local node state at the time of the backup. Option should be used when +performing the backup of *Percona XtraDB Cluster*. It has no effect when +backup locks are used to create the backup. + + +### --generate-new-master-key() +Generate a new master key when doing a copy-back. + + +### --generate-transition-key() +*xtrabackup* needs to access the same keyring file or vault server +during prepare and copy-back but it should not depend on whether the +server keys have been purged. + +`--generate-transition-key` creates and adds to the keyring +a transition key for *xtrabackup* to use if the master key used for +encryption is not found because it has been rotated and purged. + + +### --get-server-public-key() +Get the server public key + + +### --help() +When run with this option or without any options *xtrabackup* displays +information about how to run the program on the command line along with all +supported options and variables with default values where appropriate. + + +### --history(=NAME) +This option enables the tracking of backup history in the +`PERCONA_SCHEMA.xtrabackup_history` table. An optional history series name +may be specified that will be placed with the history record for the current +backup being taken. + + +### --host(=HOST) +This option accepts a string argument that specifies the host to use when +connecting to the database server with TCP/IP. It is passed to the mysql +child process without alteration. See **mysql --help** for details. + + +### --incremental() +This option tells *xtrabackup* to create an incremental backup. It is passed +to the *xtrabackup* child process. When this option is specified, either +`--incremental-lsn` or `--incremental-basedir` can also be +given. If neither option is given, option `--incremental-basedir` is +passed to **xtrabackup** by default, set to the first timestamped +backup directory in the backup base directory. + + +### --incremental-basedir(=DIRECTORY) +When creating an incremental backup, this is the directory containing the +full backup that is the base dataset for the incremental backups. + + +### --incremental-dir(=DIRECTORY) +When preparing an incremental backup, this is the directory where the +incremental backup is combined with the full backup to make a new full +backup. + + +### --incremental-force-scan() +When creating an incremental backup, force a full scan of the data pages in +the instance being backuped even if the complete changed page bitmap data is +available. + + +### --incremental-history-name(=name) +This option specifies the name of the backup series stored in the +`PERCONA_SCHEMA.xtrabackup_history` history record to base an incremental +backup on. *xtrabackup* will search the history table looking for the most +recent (highest `innodb_to_lsn`), successful backup in the series and take +the to_lsn value to use as the starting `lsn` for the incremental +backup. This will be mutually exclusive with +`--incremental-history-uuid`, `--incremental-basedir` and +`--incremental-lsn`. If no valid lsn can be found (no series by that +name, no successful backups by that name) *xtrabackup* will return with an +error. It is used with the `--incremental` option. + + +### --incremental-history-uuid(=name) +This option specifies the *UUID* of the specific history record stored in the +`PERCONA_SCHEMA.xtrabackup_history` to base an incremental backup on. +`--incremental-history-name`, `--incremental-basedir` and +`--incremental-lsn`. If no valid lsn can be found (no success record +with that *UUID*) *xtrabackup* will return with an error. It is used with +the –incremental option. + + +### --incremental-lsn(=LSN) +When creating an incremental backup, you can specify the log sequence number +(LSN) instead of specifying +`--incremental-basedir`. For databases created in 5.1 and +later, specify the LSN as a single 64-bit integer. **ATTENTION**: If +a wrong LSN value is specified (a user error which *Percona XtraBackup* is +unable to detect), the backup will be unusable. Be careful! + + +### --innodb([=name]) +This option is ignored for MySQL option compatibility. + + +### --innodb-miscellaneous() +There is a large group of InnoDB options that are normally read from the +`my.cnf` configuration file, so that *xtrabackup* boots up its +embedded InnoDB in the same configuration as your current server. You +normally do not need to specify these explicitly. These options have the +same behavior in InnoDB and XtraDB: + + +### --keyring-file-data(=FILENAME) +The path to the keyring file. Combine this option with +`--xtrabackup-plugin-dir`. + + +### --kill-long-queries-timeout(=SECONDS) +This option specifies the number of seconds *xtrabackup* waits between +starting `FLUSH TABLES WITH READ LOCK` and killing those queries that block +it. Default is 0 seconds, which means *xtrabackup* will not attempt to kill +any queries. In order to use this option xtrabackup user should have the +`PROCESS` and `SUPER` privileges. Where supported, *xtrabackup* +automatically uses [Backup Locks](https://www.percona.com/doc/percona-server/8.0/management/backup_locks.html#backup-locks) +as a lightweight alternative to `FLUSH TABLES WITH READ LOCK` to copy +non-InnoDB data to avoid blocking DML queries that modify InnoDB tables. + + +### --kill-long-query-type(=all|select) +This option specifies which types of queries should be killed to unblock the +global lock. Default is “select”. + + +### --lock-ddl() +Issue `LOCK TABLES FOR BACKUP` if it is supported by server (otherwise use +`LOCK INSTANCE FOR BACKUP`) at the beginning of the backup to block all DDL +operations. + +**NOTE**: Prior to *Percona XtraBackup* 8.0.22-15.0, using a safe-slave-backup stops the SQL replica thread +after the InnoDB tables and before the non-InnoDB tables are backed up. + +As of *Percona XtraBackup* 8.0.22-15.0, using a safe-slave-backup option stops the SQL +replica thread before copying the InnoDB files. + + +### --lock-ddl-per-table() +Lock DDL for each table before xtrabackup starts to copy +it and until the backup is completed. + +**NOTE**: As of *Percona XtraBackup* 8.0.15, the –lock-ddl-per-table option is deprecated. Use the –lock-ddl option instead. + + +### --lock-ddl-timeout() +If `LOCK TABLES FOR BACKUP` or `LOCK INSTANCE FOR BACKUP` does not return +within given timeout, abort the backup. + + +### --log() +This option is ignored for *MySQL* + + +### --log-bin() +The base name for the log sequence. + + +### --log-bin-index(=name) +File that holds the names for binary log files. + + +### --log-copy-interval(=#) +This option specifies the time interval between checks done by the log +copying thread in milliseconds (default is 1 second). + + +### --login-path() +Read the given path from the login file. + + +### --move-back() +Move all the files in a previously made backup from the backup directory to +their original locations. As this option removes backup files, it must be +used with caution. + + +### --no-backup-locks() +Explicity disables the `--backup-locks` option which is enabled by +default. + + +### --no-defaults() +The default options are only read from the login file. + + +### --no-lock() +Use this option to disable table lock with `FLUSH TABLES WITH READ +LOCK`. Use it only if ALL your tables are InnoDB and you **DO NOT CARE** +about the binary log position of the backup. This option shouldn’t be used if +there are any `DDL` statements being executed or if any updates are +happening on non-InnoDB tables (this includes the system MyISAM tables in the +*mysql* database), otherwise it could lead to an inconsistent backup. Where +supported *xtrabackup* will automatically use [Backup Locks](https://www.percona.com/doc/percona-server/8.0/management/backup_locks.html#backup-locks) +as a lightweight alternative to `FLUSH TABLES WITH READ LOCK` to copy +non-InnoDB data to avoid blocking DML queries that modify InnoDB tables. If +you are considering to use this because your backups are failing to acquire +the lock, this could be because of incoming replication events are preventing +the lock from succeeding. Please try using `--safe-slave-backup` to +momentarily stop the replication replica thread, this may help the backup to +succeed and you do not need to use this option. + + +### --no-server-version-check() +Implemented in *Percona XtraBackup* 8.0.21. + +The `--no-server-version-check` option disables the server version check. + +The default behavior runs a check that compares the source system version to the *Percona XtraBackup* version. If the source system version is higher than the XtraBackup version, the backup is aborted with a message. + +Adding the option overrides this check, and the backup proceeds, but there may be issues with the backup. + +See Server Version and Backup Version Comparison for more information. + + +### --no-version-check() +This option disables the version check. If you do not pass this option, the +automatic version check is enabled implicitly when *xtrabackup* runs +in the `--backup` mode. To disable the version check, you should pass +explicitly the `--no-version-check` option when invoking *xtrabackup*. + +When the automatic version check is enabled, *xtrabackup* performs a +version check against the server on the backup stage after creating a server +connection. *xtrabackup* sends the following information to the server: + + +* MySQL flavour and version + + +* Operating system name + + +* Percona Toolkit version + + +* Perl version + +Each piece of information has a unique identifier. This is a MD5 hash value +that Percona Toolkit uses to obtain statistics about how it is used. This is +a random UUID; no client information is either collected or stored. + + +### --open-files-limit(=#) +The maximum number of file descriptors to reserve with setrlimit(). + + +### --parallel(=#) +This option specifies the number of threads to use to copy multiple data +files concurrently when creating a backup. The default value is 1 (i.e., no +concurrent transfer). In *Percona XtraBackup* 2.3.10 and newer, this option +can be used with the `--copy-back` option to copy the user +data files in parallel (redo logs and system tablespaces are copied in the +main thread). + + +### --password(=PASSWORD) +This option specifies the password to use when connecting to the database. +It accepts a string argument. See **mysql --help** for details. + + +### --plugin-load() +List of plugins to load. + + +### --port(=PORT) +This option accepts a string argument that specifies the port to use when +connecting to the database server with TCP/IP. It is passed to the +**mysql** child process without alteration. See **mysql +--help** for details. + + +### --prepare() +Makes **xtrabackup** perform a recovery on a backup created with +`--backup`, so that it is ready to use. See +preparing a backup. + + +### --print-defaults() +Print the program argument list and exit. Must be given as the first option +on the command-line. + + +### --print-param() +Makes **xtrabackup** print out parameters that can be used for +copying the data files back to their original locations to restore them. + + +### --read-buffer-size() +Set the datafile read buffer size, given value is scaled up to page size. Default +is 10Mb. + + +### --rebuild-indexes() +Rebuilds indexes in a compact backup. This option only has effect when the +`--prepare` and `--rebuild-threads` options are provided. + + +### --rebuild-threads(=#) +Uses the given number of threads to rebuild indexes in a compact backup. This +option only has effect with the `--prepare` and +`--rebuild-indexes` options. + + +### --remove-original() +Implemented in *Percona XtraBackup* 2.4.6, this option when specified will +remove `.qp`, `.xbcrypt` and `.qp.xbcrypt` files after +decryption and decompression. + + +### --rocksdb-datadir() +RocksDB data directory + + +### --rocksdb-wal-dir() +RocksDB WAL directory. + + +### --rocksdb-checkpoint-max-age() +The checkpoint cannot be older than this number of seconds when the backup +completes. + + +### --rocksdb-checkpoint-max-count() +Complete the backup even if the checkpoint age requirement has not been met after +this number of checkpoints. + + +### --rollback-prepared-trx() +Force rollback prepared InnoDB transactions. + + +### --rsync() +Uses the **rsync** utility to optimize local file transfers. When this +option is specified, *xtrabackup* uses **rsync** to copy +all non-InnoDB files instead of spawning a separate **cp** for each +file, which can be much faster for servers with a large number of databases +or tables. This option cannot be used together with `--stream`. + + +### --safe-slave-backup() +When specified, xtrabackup will stop the replica SQL thread just before +running `FLUSH TABLES WITH READ LOCK` and wait to start backup until +`Slave_open_temp_tables` in `SHOW STATUS` is zero. If there are no open +temporary tables, the backup will take place, otherwise the SQL thread will +be started and stopped until there are no open temporary tables. The backup +will fail if `Slave_open_temp_tables` does not become zero after +`--safe-slave-backup-timeout` seconds. The replication SQL +thread will be restarted when the backup finishes. This option is +implemented in order to deal with [replicating temporary tables](https://dev.mysql.com/doc/refman/5.7/en/replication-features-temptables.html) +and isn’t neccessary with Row-Based-Replication. + + +### --safe-slave-backup-timeout(=SECONDS) +How many seconds `--safe-slave-backup` should wait for +`Slave_open_temp_tables` to become zero. Defaults to 300 seconds. + + +### --secure-auth() +Refuse client connecting to server if it uses old (pre-4.1.1) protocol. +(Enabled by default; use –skip-secure-auth to disable.) + + +### --server-id(=#) +The server instance being backed up. + + +### --server-public-key-path() +The file path to the server public RSA key in the PEM format. + + +### --skip-tables-compatibility-check() +See `--tables-compatibility-check`. + + +### --slave-info() +This option is useful when backing up a replication replica server. It prints +the binary log position of the source server. It also writes the binary log +coordinates to the `xtrabackup_slave_info` file as a `CHANGE MASTER` +command. A new replica for this source can be set up by starting a replica server +on this backup and issuing a `CHANGE MASTER` command with the binary log +position saved in the `xtrabackup_slave_info` file. + + +### --socket() +This option accepts a string argument that specifies the socket to use when +connecting to the local database server with a UNIX domain socket. It is +passed to the mysql child process without alteration. See **mysql +--help** for details. + + +### --ssl() +Enable secure connection. More information can be found in [–ssl](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-options.html) +MySQL server documentation. + + +### --ssl-ca() +Path of the file which contains list of trusted SSL CAs. More information +can be found in [–ssl-ca](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-options.html#option_general_ssl-ca) +MySQL server documentation. + + +### --ssl-capath() +Directory path that contains trusted SSL CA certificates in PEM format. More +information can be found in [–ssl-capath](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-options.html#option_general_ssl-capath) +MySQL server documentation. + + +### --ssl-cert() +Path of the file which contains X509 certificate in PEM format. More +information can be found in [–ssl-cert](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-options.html#option_general_ssl-cert) +MySQL server documentation. + + +### --ssl-cipher() +List of permitted ciphers to use for connection encryption. More information +can be found in [–ssl-cipher](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-options.html#option_general_ssl-cipher) +MySQL server documentation. + + +### --ssl-crl() +Path of the file that contains certificate revocation lists. More +information can be found in [–ssl-crl](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-options.html#option_general_ssl-crl) +MySQL server documentation. + + +### --ssl-crlpath() +Path of directory that contains certificate revocation list files. More +information can be found in [–ssl-crlpath](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-options.html#option_general_ssl-crlpath) +MySQL server documentation. + + +### --ssl-fips-mode() +SSL FIPS mode (applies only for OpenSSL); permitted values are: *OFF*, *ON*, +*STRICT*. + + +### --ssl-key() +Path of file that contains X509 key in PEM format. More information can be +found in [–ssl-key](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-options.html#option_general_ssl-key) +MySQL server documentation. + + +### --ssl-mode() +Security state of connection to server. More information can be found in +[–ssl-mode](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-options.html#option_general_ssl-mode) +MySQL server documentation. + + +### --ssl-verify-server-cert() +Verify server certificate Common Name value against host name used when +connecting to server. More information can be found in +[–ssl-verify-server-cert](https://dev.mysql.com/doc/refman/8.0/en/encrypted-connection-options.html#option_general_ssl-verify-server-cert) +MySQL server documentation. + + +### --stats() +Causes **xtrabackup** to scan the specified data files and print out +index statistics. + + +### --stream(=FORMAT) +Stream all backup files to the standard output in the specified format. +Currently, this option only supports the xbstream format. + + +### --strict() +If this option is specified, *xtrabackup* fails with an error when invalid +parameters are passed. + + +### --tables(=name) +A regular expression against which the full tablename, in +`databasename.tablename` format, is matched. If the name matches, the +table is backed up. See partial backups. + + +### --tables-compatibility-check() +Enables the engine compatibility warning. The default value is +ON. To disable the engine compatibility warning use +`--skip-tables-compatibility-check`. + + +### --tables-exclude(=name) +Filtering by regexp for table names. Operates the same +way as `--tables`, but matched names are excluded from +backup. Note that this option has a higher priority than +`--tables`. + + +### --tables-file(=name) +A file containing one table name per line, in databasename.tablename format. +The backup will be limited to the specified tables. + + +### --target-dir(=DIRECTORY) +This option specifies the destination directory for the backup. If the +directory does not exist, **xtrabackup** creates it. If the directory +does exist and is empty, **xtrabackup** will succeed. +**xtrabackup** will not overwrite existing files, however; it will +fail with operating system error 17, `file exists`. + +If this option is a relative path, it is interpreted as being relative to +the current working directory from which **xtrabackup** is executed. + +In order to perform a backup, you need `READ`, `WRITE`, and `EXECUTE` +permissions at a filesystem level for the directory that you supply as the +value of `--target-dir`. + + +### --innodb-temp-tablespaces-dir(=DIRECTORY) +Directory where temp tablespace files live, this path can be absolute. + + +### --throttle(=#) +This option limits the number of chunks copied per second. The chunk size is +*10 MB*. To limit the bandwidth to *10 MB/s*, set the option to *1*: +–throttle=1. + + +### --tls-ciphersuites() +TLS v1.3 cipher to use. + + +### --tls-version() +TLS version to use, permitted values are: *TLSv1*, *TLSv1.1*, +*TLSv1.2*, *TLSv1.3*. + + +### --tmpdir(=name) +Specify the directory that will be used to store temporary files during the +backup + + +### --transition-key(=name) +This option is used to enable processing the backup without accessing the +keyring vault server. In this case, **xtrabackup** derives the AES +encryption key from the specified passphrase and uses it to encrypt +tablespace keys of tablespaces being backed up. + +If `--transition-key` does not have any +value, **xtrabackup** will ask for it. The same passphrase should be +specified for the `--prepare` command. + + +### --use-memory() +This option affects how much memory is allocated for preparing a backup with +`--prepare`, or analyzing statistics with +`--stats`. Its purpose is similar +to innodb_buffer_pool_size. It does not do the same thing as the +similarly named option in Oracle’s InnoDB Hot Backup tool. +The default value is 100MB, and if you have enough available memory, 1GB to +2GB is a good recommended value. Multiples are supported providing the unit +(e.g. 1MB, 1M, 1GB, 1G). + + +### --user(=USERNAME) +This option specifies the MySQL username used when connecting to the server, +if that’s not the current user. The option accepts a string argument. See +mysql –help for details. + + +### -v() +See `--version` + + +### --version() +This option prints *xtrabackup* version and exits. + + +### --xtrabackup-plugin-dir(=DIRNAME) +The absolute path to the directory that contains the `keyring` plugin. + + diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xtrabackup_binary.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xtrabackup_binary.md new file mode 100644 index 000000000000..76a8d7482970 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xtrabackup_binary.md @@ -0,0 +1,80 @@ +# The xtrabackup Binary + +The *xtrabackup* binary is a compiled C program that is linked with the *InnoDB* +libraries and the standard *MySQL* client libraries. + +*xtrabackup* enables point-in-time backups of *InnoDB* / *XtraDB* tables +together with the schema definitions, *MyISAM* tables, and other portions of the +server. + +The *InnoDB* libraries provide the functionality to apply a log to data +files. The *MySQL* client libraries are used to parse command-line options and +configuration file. + +The tool runs in either `--backup` or `--prepare` mode, +corresponding to the two main functions it performs. There are several +variations on these functions to accomplish different tasks, and there are two +less commonly used modes, `--stats` and `--print-param`. + +## Other Types of Backups + + +* Incremental Backups + + +* Partial Backups + + +## Advanced Features + + + +* Analyzing Table Statistics + + +* Working with Binary Logs + + +* Restoring Individual Tables + + +* LRU dump backup + + +* Streaming Backups + + +* Encrypting Backups + + +* `FLUSH TABLES WITH READ LOCK` option + + +* Accelerating the backup process + + +* Point-In-Time recovery + + +* Making Backups in Replication Environments + + +* Store backup history on the server + + +## Implementation + + +* Implementation Details + + +* *xtrabackup* Exit Codes + + +## References + + +* The **xtrabackup** Option Reference diff --git a/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xtrabackup_exit_codes.md b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xtrabackup_exit_codes.md new file mode 100644 index 000000000000..c1cb716f0967 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/docs/xtrabackup_bin/xtrabackup_exit_codes.md @@ -0,0 +1,5 @@ +# xtrabackup Exit Codes + +The *xtrabackup* binary exits with the traditional success value of 0 after a backup when no error occurs. If an error occurs during the backup, the exit value is 1. + +In certain cases, the exit value can be something other than 0 or 1, due to the command-line option code included from the *MySQL* libraries. An unknown command-line option, for example, will cause an exit code of 255. diff --git a/storage/innobase/xtrabackup/doc/mkdocs-base.yml b/storage/innobase/xtrabackup/doc/mkdocs-base.yml new file mode 100644 index 000000000000..386e8c036bab --- /dev/null +++ b/storage/innobase/xtrabackup/doc/mkdocs-base.yml @@ -0,0 +1,171 @@ +# MkDocs configuration for Netlify builds + +site_name: Percona XtraBackup +site_description: Documentation +site_author: Percona LLC +copyright: Percona LLC, © 2022 + +repo_name: percona/percona-xtrabackup +repo_url: https://github.com/percona/percona-xtrabackup +edit_uri: edit/8.0/storage/innobase/xtrabackup/doc/docs/ + +use_directory_urls: false + +# Theme for netlify testing +theme: + name: material + logo: _static/percona-logo.svg + favicon: _static/percona_favicon.ico + custom_dir: _resource/overrides/ + palette: + + # Light mode + - media: "(prefers-color-scheme: light)" + scheme: percona-light + toggle: + icon: material/toggle-switch-off-outline + name: Switch to dark mode + + # Dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/toggle-switch + name: Switch to light mode + +# Theme features + + features: + - search.highlight + - navigation.top + - content.tabs.link + +extra_css: + - https://unicons.iconscout.com/release/v3.0.3/css/line.css + - https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css + - css/percona.css + - css/version-select.css + +extra_javascript: + - js/version-select.js + +markdown_extensions: + attr_list: {} + toc: + permalink: True + title: On this page + admonition: {} + footnotes: {} + def_list: {} # https://michelf.ca/projects/php-markdown/extra/#def-list + meta: {} + md_in_html: {} + smarty: + {smart_angled_quotes: true} + pymdownx.details: {} + pymdownx.mark: {} + pymdownx.smartsymbols: {} + pymdownx.tabbed: + {alternate_style: true} + pymdownx.tilde: {} + pymdownx.superfences: {} + pymdownx.highlight: + linenums: false + pymdownx.inlinehilite: {} + + +plugins: + search: {} + git-revision-date: {} + macros: + include_yaml: +# - 'variables.yml' # Use in markdown as '{{ VAR }}' +# exclude: # Don't process these files +# glob: +# - file.md + with-pdf: # https://github.com/orzih/mkdocs-with-pdf + output_path: '_pdf/PerconaXtrabackup-8.0.pdf' + cover_title: 'Percona XtraBackup Documentation' + cover_subtitle: 8.0.29-22 (July 19, 2022) + author: 'Percona Technical Documentation Team' + cover_logo: docs/_static/percona-xtrabackup-logo.jpg + debug_html: false + custom_template_path: _resource/templates + enabled_if_env: ENABLE_PDF_EXPORT + mike: + version_selector: true + css_dir: css + javascript_dir: js + canonical_version: null + +extra: + version: + provider: mike + +nav: + - index.md + - Introduction: + - intro.md + - how_xtrabackup_works.md + - Installation: + - installation/apt_repo.md + - installation/yum_repo.md + - installation/binary-tarball.md + - installation/compiling_xtrabackup.md + - Run in Docker: + - installation/docker.md + - How Percona XtraBackup works: + - xtrabackup_bin/implementation_details.md + - using_xtrabackup/privileges.md + - using_xtrabackup/configuring.md + - using_xtrabackup/comparison.md + - xtrabackup_bin/xtrabackup_exit_codes.md + - Backup Scenarios: + - backup_scenarios/full_backup.md + - backup_scenarios/incremental_backup.md + - backup_scenarios/compressed_backup.md + - xtrabackup_bin/partial_backups.md + - User’s Manual: + - manual.md + - Advanced Features: + - advanced/throttling_backups.md + - advanced/encrypted_innodb_tablespace_backups.md + - xtrabackup_bin/backup.encrypting.md + - xtrabackup_bin/lru_dump.md + - xtrabackup_bin/point-in-time-recovery.md + - xtrabackup_bin/working_with_binary_logs.md + - advanced/log_enhancements.md + - Security: + - security/pxb-selinux.md + - security/pxb-apparmor.md + - Auxiliary guides: + - howtos/enabling_tcp.md + - howtos/ssh_server.md + - xtrabackup_bin/analyzing_table_statistics.md + - xtrabackup_bin/flush-tables-with-read-lock.md + - advanced/locks.md + - advanced/page_tracking.md + - xbcloud Binary: + - xbcloud/xbcloud.md + - xbcloud/xbcloud_swift.md + - xbcloud/xbcloud_s3.md + - xbcloud/xbcloud_minio.md + - xbcloud/xbcloud_gcs.md + - xbcloud/xbcloud_exbackoff.md + - xbcloud/xbcloud_azure.md + - Tutorials, Recipes, How-tos: + - how-tos.md + - Release notes: + - release-notes.md + - Error message descriptions: + - em/instant.md + - References: + - xtrabackup_bin/xbk_option_reference.md + - xbcrypt/xbcrypt.md + - xbstream/xbstream.md + - faq.md + - glossary.md + - xtrabackup-files.md + - trademark-policy.md + - version-check.md +# - Version Selector: "../" + diff --git a/storage/innobase/xtrabackup/doc/mkdocs-pdf.yml b/storage/innobase/xtrabackup/doc/mkdocs-pdf.yml new file mode 100644 index 000000000000..a5134fd819d8 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/mkdocs-pdf.yml @@ -0,0 +1,9 @@ +# MkDocs configuration for PDF builds +# Usage: ENABLE_PDF_EXPORT=1 mkdocs build -f mkdocs-pdf.yml + +INHERIT: mkdocs-base.yml + +markdown_extensions: + - pymdownx.tabbed + - admonition + diff --git a/storage/innobase/xtrabackup/doc/mkdocs-percona.yml b/storage/innobase/xtrabackup/doc/mkdocs-percona.yml new file mode 100644 index 000000000000..6916c442a91f --- /dev/null +++ b/storage/innobase/xtrabackup/doc/mkdocs-percona.yml @@ -0,0 +1,23 @@ +# MkDocs configuration for Percona website builds + +INHERIT: mkdocs-base.yml + +site_url: "https://docs.percona.com/percona-xtrabackup/8.0/index.html" + +plugins: + section-index: {} + bootstrap-tables: {} + +theme: + name: material + custom_dir: _resource/theme + +extra_css: + - css/version-select.css + - css/toctree.css + - css/percona.css + - css/details.css + +extra: # Used in main.html template and can't be externalized + edit_page_text: ' Edit this page' + updated_text: ' Page updated' \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/mkdocs.yml b/storage/innobase/xtrabackup/doc/mkdocs.yml new file mode 100644 index 000000000000..d6128248d9d1 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/mkdocs.yml @@ -0,0 +1,16 @@ +# MkDocs configuration for builds with material theme + +INHERIT: mkdocs-base.yml + +site_url: "https://docs.percona.com/percona-xtrabackup/8.0/" + +theme: + name: material + custom_dir: _resource/overrides + + +#Google Analytics configuration +extra: + analytics: + provider: google + property: UA-343802-3 diff --git a/storage/innobase/xtrabackup/doc/netlify.toml b/storage/innobase/xtrabackup/doc/netlify.toml new file mode 100644 index 000000000000..217025f1e175 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/netlify.toml @@ -0,0 +1,21 @@ +# Settings in the [build] context are global and are applied to all contexts +# unless otherwise overridden by more specific contexts. +[build] + # Directory to change to before starting a build. + # This is where we will look for package.json/.nvmrc/etc. + # If not set, defaults to the root directory. + base = "storage/innobase/xtrabackup/doc" + + # Directory that contains the deploy-ready HTML files and assets generated by + # the build. This is relative to the base directory if one has been set, or the + # root directory if a base has not been set. This sample publishes the + # directory located at the absolute path "root/project/build-output" + publish = "build/html" + + # Default build command. + command = "make clean netlify" + + # Directory with the serverless functions, including background functions, + # to deploy to AWS. This is relative to the base directory if one has been set, + # or the root directory if a base has not been set. + # functions = "functions/" diff --git a/storage/innobase/xtrabackup/doc/requirements.txt b/storage/innobase/xtrabackup/doc/requirements.txt new file mode 100644 index 000000000000..22682a74f57c --- /dev/null +++ b/storage/innobase/xtrabackup/doc/requirements.txt @@ -0,0 +1,14 @@ +Markdown +mkdocs +mkdocs-versioning +mkdocs-macros-plugin +mkdocs-exclude +markdown-include +mkdocs-material +mkdocs-with-pdf +mkdocs-git-revision-date-plugin +mkdocs-material-extensions +mkdocs-bootstrap-tables-plugin +mkdocs-section-index +mkdocs-htmlproofer-plugin +mike diff --git a/storage/innobase/xtrabackup/doc/runtime.txt b/storage/innobase/xtrabackup/doc/runtime.txt new file mode 100644 index 000000000000..cc1923a40b1a --- /dev/null +++ b/storage/innobase/xtrabackup/doc/runtime.txt @@ -0,0 +1 @@ +3.8 diff --git a/storage/innobase/xtrabackup/doc/source/.res/contents/example.xbstream.txt b/storage/innobase/xtrabackup/doc/source/.res/contents/example.xbstream.txt new file mode 100644 index 000000000000..8e62da1f5209 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/.res/contents/example.xbstream.txt @@ -0,0 +1,74 @@ +.. list-table:: + :widths: 25 75 + :header-rows: 1 + + * - Task + - Command + * - Stream the backup into an archive named :file:`backup.xbstream` + - :bash:`xtrabackup --backup --stream=xbstream --target-dir=./ > backup.xbstream` + * - Stream the backup into a `compressed` archive named :file:`backup.xbstream` + - :bash:`xtrabackup --backup --stream=xbstream --compress --target-dir=./ > backup.xbstream` + * - Encrypt the backup + - $ xtrabackup --backup \ + --stream=xbstream ./ > backup.xbstream \ + gzip - | openssl des3 -salt -k "password" > backup.xbstream.gz.des3 + + * - Unpack the backup to the current directory + - :bash:`xbstream -x < backup.xbstream` + * - Send the backup compressed directly to another host and unpack it + - :bash:`xtrabackup --backup --compress --stream=xbstream --target-dir=./ | ssh user@otherhost "xbstream -x"` + * - Send the backup to another server using ``netcat``. + - On the destination host: + + .. code-block:: bash + + $ nc -l 9999 | cat - > /data/backups/backup.xbstream + + On the source host: + + .. code-block:: bash + + $ xtrabackup --backup --stream=xbstream ./ | nc desthost 9999 + + * - Send the backup to another server using a one-liner: + - $ ssh user@desthost "( nc -l 9999 > /data/backups/backup.xbstream & )" \ + && xtrabackup --backup --stream=xbstream ./ | nc desthost 9999 + + * - Throttle the throughput to 10MB/sec using the ``pipe viewer`` tool [#f1]_ + - $ xtrabackup --backup --stream=xbstream ./ | pv -q -L10m \ + ssh user@desthost "cat - > /data/backups/backup.xbstream" + + * - Checksumming the backup during the streaming: + - On the destination host: + + .. code-block:: bash + + $ nc -l 9999 | tee >(sha1sum > destination_checksum) > /data/backups/backup.xbstream + + On the source host: + + .. code-block:: bash + + $ xtrabackup --backup --stream=xbstream ./ | tee >(sha1sum > source_checksum) | nc desthost 9999 + + Compare the checksums on the source host: + + .. code-block:: bash + + $ cat source_checksum + 65e4f916a49c1f216e0887ce54cf59bf3934dbad - + + Compare the checksums on the destination host: + + .. code-block:: bash + + $ cat destination_checksum + 65e4f916a49c1f216e0887ce54cf59bf3934dbad - + + * - Parallel compression with parallel copying backup + - :bash:`xtrabackup --backup --compress --compress-threads=8 --stream=xbstream --parallel=4 --target-dir=./ > backup.xbstream` + +.. rubric:: Footnotes + +.. [#f1] Install from the `official site `_ or from the distribution package (``apt install pv``) + diff --git a/storage/innobase/xtrabackup/doc/source/.res/contents/important.storage-engine.txt b/storage/innobase/xtrabackup/doc/source/.res/contents/important.storage-engine.txt new file mode 100644 index 000000000000..33565f1c3082 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/.res/contents/important.storage-engine.txt @@ -0,0 +1,12 @@ +.. important:: + + The support of the MyRocks storage engine was added in version 8.0.6. + + |Percona XtraBackup| 8.0 does not support the TokuDB storage engine. + + .. seealso:: + + Percona TokuBackup + https://www.percona.com/doc/percona-server/LATEST/tokudb/toku_backup.html + + diff --git a/storage/innobase/xtrabackup/doc/source/.res/contents/instruction.repository.enabling.txt b/storage/innobase/xtrabackup/doc/source/.res/contents/instruction.repository.enabling.txt new file mode 100644 index 000000000000..1fe4fa7ee36e --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/.res/contents/instruction.repository.enabling.txt @@ -0,0 +1,6 @@ + +Enable the repository: :bash:`percona-release enable-only tools release` + +If |Percona XtraBackup| is intented to be used in combination with +the upstream MySQL Server, you only need to enable the ``tools`` +repository: :bash:`percona-release enable-only tools`. diff --git a/storage/innobase/xtrabackup/doc/source/.res/contents/text.pxb.8-0.txt b/storage/innobase/xtrabackup/doc/source/.res/contents/text.pxb.8-0.txt new file mode 100644 index 000000000000..4d25be0274fc --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/.res/contents/text.pxb.8-0.txt @@ -0,0 +1,14 @@ +|Percona XtraBackup| 8.0 does not support making backups of databases +created in versions prior to 8.0 of |MySQL|, |Percona Server| or +|Percona XtraDB Cluster|. As the changes that |MySQL| 8.0 introduced +in *data dictionaries*, *redo log* and *undo log* are incompatible +with previous versions, it is currently impossible for |Percona +XtraBackup| 8.0 to also support versions prior to 8.0. + +Due to changes in MySQL 8.0.20 released by Oracle at the end of April 2020, +|pxb| 8.0, up to version 8.0.11, is not compatible with MySQL version 8.0.20 or +higher, or Percona products that are based on it: Percona Server for MySQL and +Percona XtraDB Cluster. + +For more information, see `Percona XtraBackup 8.x and MySQL 8.0.20 +`_ diff --git a/storage/innobase/xtrabackup/doc/source/CMakeLists.txt b/storage/innobase/xtrabackup/doc/source/CMakeLists.txt new file mode 100644 index 000000000000..837c2b795fce --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/CMakeLists.txt @@ -0,0 +1,88 @@ +# Copyright (c) 2015 Percona LLC and/or its affiliates. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +# generate man pages +IF(WITH_MAN_PAGES) + IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/build/man) + FILE(GLOB MAN_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/build/man ${CMAKE_CURRENT_SOURCE_DIR}/build/man/*.1) + FOREACH(MAN_FILE ${MAN_FILES}) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/build/man/${MAN_FILE} + ${CMAKE_CURRENT_BINARY_DIR}/build/man/${MAN_FILE} COPYONLY) + ENDFOREACH() + ELSE() + ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/build/man + COMMAND sphinx-build -b man -d ${CMAKE_CURRENT_BINARY_DIR}/build/doctrees ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/build/man + VERBATIM + ) + ENDIF() + + ADD_CUSTOM_TARGET(man ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/build/man + ) + + INSTALL( + CODE "FILE( GLOB MAN1_FILES \"${CMAKE_CURRENT_BINARY_DIR}/build/man/*.1\" )" + CODE "FILE( INSTALL \${MAN1_FILES} DESTINATION \"${INSTALL_MANDIR}/man1\" )" + ) +ENDIF() + +# generate html documentation +IF(WITH_HTML_DOCS) + ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/build/html + # Downloads percona-theme into source dir because of sphinx bug: + # https://github.com/sphinx-doc/sphinx/issues/925 + COMMAND wget -O ${CMAKE_CURRENT_SOURCE_DIR}/percona-theme.tar.gz https://www.percona.com/docs/theme-1-4/percona-xtrabackup/2.3 + COMMAND tar -zxf ${CMAKE_CURRENT_SOURCE_DIR}/percona-theme.tar.gz -C ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND rm -f ${CMAKE_CURRENT_SOURCE_DIR}/percona-theme.tar.gz + COMMAND sphinx-build -b html -d ${CMAKE_CURRENT_BINARY_DIR}/build/doctrees ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/build/html + COMMAND rm -rf ${CMAKE_CURRENT_SOURCE_DIR}/percona-theme-1-4 + VERBATIM + ) + + ADD_CUSTOM_TARGET(html ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/build/html + ) +ENDIF() + +# generate latex or pdf documentation +IF(WITH_LATEX_DOCS OR WITH_PDF_DOCS) + ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/build/latex/PerconaXtraBackup-2.3.tex + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/build/latex/Makefile + COMMAND sphinx-build -b latex -d ${CMAKE_CURRENT_BINARY_DIR}/build/doctrees ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/build/latex + VERBATIM + ) + + ADD_CUSTOM_TARGET(latex ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/build/latex/PerconaXtraBackup-2.3.tex + ) + + IF(WITH_PDF_DOCS) + ADD_CUSTOM_COMMAND( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/build/latex/PerconaXtraBackup-2.3.pdf + COMMAND make -C ${CMAKE_CURRENT_BINARY_DIR}/build/latex all-pdf + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/build/latex/PerconaXtraBackup-2.3.tex + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/build/latex/Makefile + VERBATIM + ) + + ADD_CUSTOM_TARGET(latexpdf ALL + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/build/latex/PerconaXtraBackup-2.3.pdf + ) + ENDIF() + +ENDIF() diff --git a/storage/innobase/xtrabackup/doc/source/README.md b/storage/innobase/xtrabackup/doc/source/README.md new file mode 100644 index 000000000000..9a32af5b4dc7 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/README.md @@ -0,0 +1,7 @@ +# Documentation has moved + +[Percona/pxb-docs](https://github.com/percona/pxb-docs) is the new home of the Percona XtraBackup documentation. + +We have migrated the documentation and changed to Markdown to make it easier to collaborate. + +We encourage contributions to the documentation. The [Contributing Guide](https://github.com/percona/pxb-docs/blob/8.0/contributing.md) describes several ways to do so, including changing the content. \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/source/_res/images/new-topic.png b/storage/innobase/xtrabackup/doc/source/_res/images/new-topic.png new file mode 100644 index 0000000000000000000000000000000000000000..b41c4b3444800e3f918d1331d46a6e9586149fa8 GIT binary patch literal 60063 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 literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/source/_res/replace/README.txt b/storage/innobase/xtrabackup/doc/source/_res/replace/README.txt new file mode 100644 index 000000000000..7cf5d995b99d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_res/replace/README.txt @@ -0,0 +1,29 @@ + +Replace resources +******************************************************************************** + +Replace resources are collections of replace directives that follow common +rules: + +- all placeholders use lower alphabet characters, the dot (.), and the dash (-) + characters. +- all replace directives are arranged in the alphabetic order (descending) +- all replace directives in one file have a prefix that denotes the + type of concept that they represent. The usage of prefix is + consistent within one file: if a prefix is applicable then each + placeholder must have it. + +To avoid confusion, prefixes look similar to the concepts that they represents +but not as full words that may appear in text. + +=========== ======== ======================================================== +Collection Prefix Description +=========== ======== ======================================================== +abbr abbr. Abbreviations +common - Common names the spelling of which is imporant +file fs. File system objects: paths, directories, and files +parameter param. Parameters, options, and configuration variables +command cmd. Executable +proper - Proper names such as company names +text - Fragments of text +=========== ======== ======================================================== diff --git a/storage/innobase/xtrabackup/doc/source/_res/replace/abbr.txt b/storage/innobase/xtrabackup/doc/source/_res/replace/abbr.txt new file mode 100644 index 000000000000..a2335bf42148 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_res/replace/abbr.txt @@ -0,0 +1,4 @@ +.. Abbreviations formatted with the *abbr* role + +.. |abbr.yum| replace:: :abbr:`YUM (Yellowdog Updater, Modified)` +.. |abbr.apt| replace:: :abbr:`APT (Advanced Package Tool)` diff --git a/storage/innobase/xtrabackup/doc/source/_res/replace/command.txt b/storage/innobase/xtrabackup/doc/source/_res/replace/command.txt new file mode 100644 index 000000000000..a5a2226abce8 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_res/replace/command.txt @@ -0,0 +1,8 @@ +.. Commands formatted with *command* role + +.. |cmd.docker| replace:: :command:`docker` +.. |cmd.apt| replace:: :command:`apt` +.. |cmd.yum| replace:: :command:`yum` +.. |cmd.docker-create| replace:: :command:`docker create` +.. |cmd.docker-run| replace:: :command:`docker run` + diff --git a/storage/innobase/xtrabackup/doc/source/_res/replace/file.txt b/storage/innobase/xtrabackup/doc/source/_res/replace/file.txt new file mode 100644 index 000000000000..634608b63b09 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_res/replace/file.txt @@ -0,0 +1,3 @@ +.. Directory names, file names, and path like objects + +.. |dockerhub.percona-xtrabackup| replace:: :file:`perconalab/percona-xtrabackup` diff --git a/storage/innobase/xtrabackup/doc/source/_res/replace/parameter.txt b/storage/innobase/xtrabackup/doc/source/_res/replace/parameter.txt new file mode 100644 index 000000000000..6a14cf599e19 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_res/replace/parameter.txt @@ -0,0 +1,5 @@ +.. Parameters, options, and configuration variables + +.. |param.name| replace:: ``--name`` +.. |param.volumes-from| replace:: ``--volumes-from`` + diff --git a/storage/innobase/xtrabackup/doc/source/_res/replace/proper.txt b/storage/innobase/xtrabackup/doc/source/_res/replace/proper.txt new file mode 100644 index 000000000000..6cc8183ba992 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_res/replace/proper.txt @@ -0,0 +1,13 @@ +.. Company names (e.g. Percona, Oracle), product names (e.g. MySQL, Ubuntu) + +.. |percona| replace:: Percona +.. |percona-xtrabackup| replace:: Percona XtraBackup +.. |percona-server| replace:: Percona Server for MySQL +.. |percona-server-mysql| replace:: Percona Server for MySQL +.. |oracle| replace:: Oracle +.. |mysql| replace:: MySQL +.. |ubuntu| replace:: Ubuntu +.. |debian| replace:: Debian +.. |centos| replace:: CentOS +.. |docker| replace:: Docker +.. |docker-hub| replace:: Docker Hub diff --git a/storage/innobase/xtrabackup/doc/source/_res/replace/pxb-blurb.txt b/storage/innobase/xtrabackup/doc/source/_res/replace/pxb-blurb.txt new file mode 100644 index 000000000000..c038f4d4e297 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_res/replace/pxb-blurb.txt @@ -0,0 +1 @@ +`Percona XtraBackup for MySQL Databases `_ enables MySQL backups without blocking user queries. Percona XtraBackup is ideal for companies with large data sets and mission-critical applications that cannot tolerate long periods of downtime. Offered free as an open source solution, Percona XtraBackup drives down backup costs while providing unique features for MySQL backups. \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/source/_res/replace/useful-links.txt b/storage/innobase/xtrabackup/doc/source/_res/replace/useful-links.txt new file mode 100644 index 000000000000..92feead4b9c5 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_res/replace/useful-links.txt @@ -0,0 +1,10 @@ +Useful Links +================= + +* The `Percona XtraBackup installation instructions `_ + +* The `Percona XtraBackup downloads `_ + +* The `Percona XtraBackup GitHub location `_ + +* To contribute to the documentation, review the `Documentation Contribution Guide `__ diff --git a/storage/innobase/xtrabackup/doc/source/_static/lru_dump.png b/storage/innobase/xtrabackup/doc/source/_static/lru_dump.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d91a1c76742d4cf10607ab6faaca835df1d345 GIT binary patch literal 27861 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 literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/source/_static/percona-logo.svg b/storage/innobase/xtrabackup/doc/source/_static/percona-logo.svg new file mode 100644 index 000000000000..178f62b2d135 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_static/percona-logo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/storage/innobase/xtrabackup/doc/source/_static/percona-xtrabackup-logo.jpg b/storage/innobase/xtrabackup/doc/source/_static/percona-xtrabackup-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c9f9d668bba9eb313a6c84c0d944073c9067bb3 GIT binary patch literal 36163 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 literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/source/_static/percona_favicon.ico b/storage/innobase/xtrabackup/doc/source/_static/percona_favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f426064d6f505e77365a8980046b58ae465ea6b0 GIT binary patch literal 894 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 literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/source/_templates/theme/header.html b/storage/innobase/xtrabackup/doc/source/_templates/theme/header.html new file mode 100644 index 000000000000..1718edaff0a7 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_templates/theme/header.html @@ -0,0 +1,40 @@ +
    + +
    diff --git a/storage/innobase/xtrabackup/doc/source/_templates/theme/layout.html b/storage/innobase/xtrabackup/doc/source/_templates/theme/layout.html new file mode 100644 index 000000000000..a464b2552111 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_templates/theme/layout.html @@ -0,0 +1,19 @@ +{# Import the theme's layout. #} +{% extends "!layout.html" %} + +{# Adds Google Analytics events on button click. #} +{%- block extrahead %} + +{{ super() }} +{%- endblock %} + + +{%- block relbar2 %} +{% include "relbar2.html" %} +{%- endblock %} + + diff --git a/storage/innobase/xtrabackup/doc/source/_templates/theme/localtoc.html b/storage/innobase/xtrabackup/doc/source/_templates/theme/localtoc.html new file mode 100644 index 000000000000..d6361d4dc520 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_templates/theme/localtoc.html @@ -0,0 +1,26 @@ +{% set toc_nodes = derender_toc(toc, True, pagename) if display_toc else [] %} + diff --git a/storage/innobase/xtrabackup/doc/source/_templates/theme/relbar2.html b/storage/innobase/xtrabackup/doc/source/_templates/theme/relbar2.html new file mode 100644 index 000000000000..86d217a31175 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_templates/theme/relbar2.html @@ -0,0 +1,14 @@ +
    +
    +
    +

    Contact Us

    +

    For free technical help, visit the Percona Community Forum.
    +

    To report bugs or submit feature requests, open a JIRA ticket.
    +

    For paid support and managed or consulting services , contact Percona Sales.

    +
    + {# Add the last updated timestamp from git commits using gitstamp extension #} + {%- if gitstamp %} Last update: {{gitstamp}} + {%- endif %} +
    +
    +
    \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/source/_templates/theme/sidebar.html b/storage/innobase/xtrabackup/doc/source/_templates/theme/sidebar.html new file mode 100644 index 000000000000..36ac6e7be739 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/_templates/theme/sidebar.html @@ -0,0 +1,22 @@ + diff --git a/storage/innobase/xtrabackup/doc/source/advanced/encrypted_innodb_tablespace_backups.rst b/storage/innobase/xtrabackup/doc/source/advanced/encrypted_innodb_tablespace_backups.rst new file mode 100644 index 000000000000..8746d5fa09ce --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/advanced/encrypted_innodb_tablespace_backups.rst @@ -0,0 +1,496 @@ +.. _encrypted_innodb_tablespace_backups: + +=================================== +Encrypted InnoDB tablespace backups +=================================== + +InnoDB supports `data encryption for InnoDB tables +`__ stored in file-per-table tablespaces. This feature provides an at-rest encryption for physical tablespace data files. + +For an authenticated user or application to access an encrypted tablespace, +InnoDB uses the master encryption key to decrypt the tablespace key. The +master encryption key is stored in a keyring. *xtrabackup* supports two keyring +plugins: ``keyring_file``, and ``keyring_vault``. These plugins are installed +into the ``plugin`` directory. + +.. rubric:: Version Updates + +Percona XtraBackup 8.0.25-17 adds support for the ``keyring_file`` component, which is part of the component-based infrastructure MySQL which extends the server capabilities. The component is stored in the ``plugin`` directory. + +See a `comparison of keyring components and keyring plugins `__ for more information. + +Percona XtraBackup 8.0.27-19 adds support for the Key Management Interoperability Protocol (KMIP) which enables the communication between the key management system and encrypted database server. This feature is *tech preview* quality. + +Percona XtraBackup 8.0.28-21 adds support for the Amazon Key Management Service (AWS KMS). AWS KMS is cloud-based encryption and key management service. The keys and functionality can be used for other AWS services or your applications that use AWS. No configuration is required to back up a server with AWS KMS-enabled encryption. This feature is *tech preview* quality. + +.. contents:: + :local: + +Making a backup +================ + +Using ``keyring_file`` plugin +----------------------------- + +In order to backup and prepare a database containing encrypted InnoDB +tablespaces, specify the path to a keyring file as the value of the +``--keyring-file-data`` option. + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backup/ --user=root \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +After *xtrabackup* takes the backup, the following +message confirms the action: + +.. code-block:: bash + + xtrabackup: Transaction log of lsn (5696709) to (5696718) was copied. + 160401 10:25:51 completed OK! + +.. warning:: + + *xtrabackup* does not copy the keyring file into the backup directory. To prepare the backup, you must copy the keyring file manually. + +.. rubric:: Preparing the Backup + +To prepare the backup specify the keyring-file-data. + +.. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/backup \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +After *xtrabackup* takes the backup, the following +message confirms the action: + +.. code-block:: bash + + InnoDB: Shutdown completed; log sequence number 5697064 + 160401 10:34:28 completed OK! + +The backup is now prepared and can be restored with the :option:`--copy-back` +option. In case the keyring has been rotated, you must restore the keyring used when the backup was taken and prepared. + +Using ``keyring_vault`` plugin +------------------------------ + +Keyring vault plugin settings are +described `here +`_. + +.. rubric:: Creating Backup + +The following command creates a backup in the ``/data/backup`` directory: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backup --user=root + + +After *xtrabackup* completes the action, the following confirmation message appears: + +.. code-block:: bash + + xtrabackup: Transaction log of lsn (5696709) to (5696718) was copied. + 160401 10:25:51 completed OK! + +.. rubric:: Preparing the Backup + +To prepare the backup, *xtrabackup* must access the keyring. +*xtrabackup* does not communicate with the *MySQL* server or read the default ``my.cnf`` configuration file. Specify the keyring settings in the command line: + +.. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/backup \ + --keyring-vault-config=/etc/vault.cnf + +.. note:: + + Please look `here + `_ + for a description of keyring vault plugin settings. + +After *xtrabackup* completes the action, the following confirmation message appears: + +.. code-block:: text + + InnoDB: Shutdown completed; log sequence number 5697064 + 160401 10:34:28 completed OK! + +The backup is now prepared and can be restored with the :option:`--copy-back` option: + +.. code-block:: bash + + $ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql + + +Using the ``keyring_file`` component +------------------------------------- + +A component is not loaded with the ``--early_plugin_load`` option. The server uses a manifest to load the component and the component has its own configuration file. See `component installation `__ for more information. + +An example of a manifest and a configuration file follows: + +./bin/mysqld.my: + +.. code-block:: json + + { + "components": "file://component_keyring_file" + } + +/lib/plugin/component_keyring_file.cnf: + +.. code-block:: json + + { + "path": "/var/lib/mysql-keyring/keyring_file", "read_only": false + } + + +For more information, see `Keyring Component Installation `__ and `Using the keyring_file File-Based Keyring Plugin `__. + +With the appropriate privilege, you can ``SELECT`` on the `performance_schema.keyring_component_status table `__ to view the attributes and status of the installed keyring component when in use. + +The component has no special requirements for backing up a database that contains encrypted InnoDB tablespaces. + +.. sourcecode:: bash + + xtrabackup --backup --target-dir=/data/backup --user=root + +After *xtrabackup* completes the action, the following confirmation message appears: + +.. sourcecode:: bash + + xtrabackup: Transaction log of lsn (5696709) to (5696718) was copied. + 160401 10:25:51 completed OK! + +.. warning:: + + *xtrabackup* does not copy the keyring file into the backup directory. To prepare the backup, you must copy the keyring file manually. + +.. rubric:: Preparing the Backup + +*xtrabackup* reads the keyring_file component configuration from ``xtrabackup_component_keyring_file.cnf``. You must specify the keyring_file data path if the ``keyring-file-data`` is not located in the attribute ``PATH`` from the xtrabackup_component_keyring_file.cnf. + +The following is an example of adding the location for the keyring-file-data: + +.. sourcecode:: bash + + xtrabackup --prepare --target-dir=/data/backup \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +.. note:: *xtrabackup* attempts to read ``xtrabackup_component_keyring_file.cnf``. You can assign another keyring file component configuration by passing the ``--component-keyring-file-config`` option. + +After *xtrabackup* completes preparing the backup, the following confirmation message appears: + +.. sourcecode:: bash + + InnoDB: Shutdown completed; log sequence number 5697064 + 160401 10:34:28 completed OK! + +The backup is prepared. To restore the backup use the ``--copy-back`` option. If the keyring has been rotated, you must restore the specific keyring used to take and prepare the backup. + + +Incremental Encrypted InnoDB tablespace backups with ``keyring_file`` +--------------------------------------------------------------------- + +The process of taking incremental backups with InnoDB tablespace encryption is +similar to taking the :ref:`xb_incremental` with unencrypted tablespace. + +.. note:: The ``keyring-file`` component should not used in production or for regulatory compliance. + +.. rubric:: Creating an Incremental Backup + +To make an incremental backup, begin with a full backup. The *xtrabackup* binary +writes a file called :file:`xtrabackup_checkpoints` into the backup's target +directory. This file contains a line showing the ``to_lsn``, which is the +database's :term:`LSN` at the end of the backup. First you need to create a full +backup with the following command: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups/base \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +.. warning:: + + *xtrabackup* will not copy the keyring file into the backup directory. In order to + prepare the backup, you must make a copy of the keyring file yourself. If you + try to restore the backup after the keyring has been changed you'll see errors + like ``ERROR 3185 (HY000): Can't find master key from keyring, please check + keyring plugin is loaded.`` when trying to access an encrypted table. + +If you look at the :file:`xtrabackup_checkpoints` file, you should see +contents similar to the following: + +.. code-block:: none + + backup_type = full-backuped + from_lsn = 0 + to_lsn = 7666625 + last_lsn = 7666634 + compact = 0 + recover_binlog_info = 1 + +Now that you have a full backup, you can make an incremental backup based on it. Use a command such as the following: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups/inc1 \ + --incremental-basedir=/data/backups/base \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +.. warning:: + + *xtrabackup* does not copy the keyring file into the backup directory. To prepare the backup, you must copy the keyring file manually. + + If the + keyring has not been rotated you can use the same as the one you've backed-up + with the base backup. If the keyring has been rotated or you have upgraded the plugin to a component, you'll need to back up the keyring file, + otherwise, you are unable to prepare the backup. + +The :file:`/data/backups/inc1/` directory should now contain delta files, such +as :file:`ibdata1.delta` and :file:`test/table1.ibd.delta`. These represent the +changes since the ``LSN 7666625``. If you examine the +:file:`xtrabackup_checkpoints` file in this directory, you should see something +similar to the following: + +.. code-block:: none + + backup_type = incremental + from_lsn = 7666625 + to_lsn = 8873920 + last_lsn = 8873929 + compact = 0 + recover_binlog_info = 1 + +You can use this directory as the base for yet another incremental backup: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups/inc2 \ + --incremental-basedir=/data/backups/inc1 \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +.. rubric:: Preparing Incremental Backups + +The :option:`--prepare` step for incremental backups is not the same as for +normal backups. In normal backups, two types of operations are performed to make +the database consistent: committed transactions are replayed from the log file +against the data files, and uncommitted transactions are rolled back. You must +skip the rollback of uncommitted transactions when preparing a backup, because +transactions that were uncommitted at the time of your backup may be in +progress, and it's likely that they will be committed in the next incremental +backup. You should use the :option:`--apply-log-only` option to prevent the +rollback phase. + +.. warning:: + + If you do not use the :option:`--apply-log-only` option to prevent the + rollback phase, then your incremental backups are useless. After + transactions have been rolled back, further incremental backups cannot be + applied. + +Beginning with the full backup you created, you can prepare it and then apply +the incremental differences to it. Recall that you have the following backups: + +.. code-block:: bash + + /data/backups/base + /data/backups/inc1 + /data/backups/inc2 + +To prepare the base backup, you need to run :option:`--prepare` as usual, but +prevent the rollback phase: + +.. code-block:: bash + + $ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +The output should end with some text such as the following: + +.. code-block:: bash + + InnoDB: Shutdown completed; log sequence number 7666643 + InnoDB: Number of pools: 1 + 160401 12:31:11 completed OK! + +To apply the first incremental backup to the full backup, you should use the +following command: + +.. code-block:: bash + + $ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \ + --incremental-dir=/data/backups/inc1 \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +.. warning:: + + The backup should be prepared with the keyring file and type that was used when backup was being + taken. This means that if the keyring has been rotated or you have upgraded from a plugin to a component between the base and + incremental backup that you must use the keyring that was in use when + the first incremental backup has been taken. + +Preparing the second incremental backup is a similar process: apply the deltas +to the (modified) base backup, and you will roll its data forward in time to the +point of the second incremental backup: + +.. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/backups/base \ + --incremental-dir=/data/backups/inc2 \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +.. note:: + + :option:`--apply-log-only` should be used when merging all + incrementals except the last one. That's why the previous line doesn't contain + the :option:`--apply-log-only` option. Even if the :option:`--apply-log-only` + was used on the last step, backup would still be consistent but in that case + server would perform the rollback phase. + +The backup is now prepared and can be restored with :option:`--copy-back` option. In +case the keyring has been rotated you'll need to restore the keyring which was +used to take and prepare the backup. + +Using Key Management Interoperability Protocol +============================================== + +This feature is *tech preview* quality. + +Percona XtraBackup 8.0.27-19 adds support for the Key Management Interoperability Protocol (KMIP) which enables the communication between the key management system and encrypted database server. + +Percona XtraBackup has no special requirements for backing up a database that contains encrypted InnoDB tablespaces. + +Percona XtraBackup performs the following actions: + +1. Connects to the MySQL server +2. Pulls the configuration +3. Connects to the KMIP server +4. Fetches the necessary keys from the KMIP server +5. Stores the KMIP server configuration settings in the ``xtrabackup_component_keyring_kmip.cnf`` file in the backup directory + +When preparing the backup, Percona XtraBackup connects to the KMIP server with the settings from the ``xtrabackup_component_keyring_kmip.cnf`` file. + +Restoring a Backup When Keyring Is not Available +================================================================================ + +While the described restore method works, this method requires access to the same +keyring that the server is using. It may not be possible if the backup is prepared +on a different server or at a much later time, when keys in the keyring are +purged, or, in the case of a malfunction, when the keyring vault server is not +available at all. + +The ``--transition-key=`` option should be used to make it possible +for *xtrabackup* to process the backup without access to the keyring vault +server. In this case, *xtrabackup* derives the AES encryption key from the +specified passphrase and will use it to encrypt tablespace keys of tablespaces +that are being backed up. + +.. rubric:: Creating a Backup with a Passphrase + +The following example illustrates how the backup can be created in this case: + +.. code-block:: bash + + $ xtrabackup --backup --user=root -p --target-dir=/data/backup \ + --transition-key=MySecetKey + +If ``--transition-key`` is specified without a value, *xtrabackup* will ask for +it. + +.. note:: + + *xtrabackup* scrapes ``--transition-key`` so that its value is not visible in + the ``ps`` command output. + +.. rubric:: Preparing the Backup with a Passphrase + +The same passphrase should be specified for the `prepare` command: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backup \ + --transition-key=MySecretKey + +There are no ``--keyring-vault...``,``--keyring-file...``, or ``--component-keyring-file-config`` options here, +because *xtrabackup* does not talk to the keyring in this case. + +.. rubric:: Restoring the Backup with a Generated Key + +When restoring a backup you will need to generate a new master key. Here is the +example for ``keyring_file`` plugin or component: + +.. code-block:: bash + + $ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \ + --transition-key=MySecetKey --generate-new-master-key \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +In case of ``keyring_vault``, it will look like this: + +.. code-block:: bash + + $ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \ + --transition-key=MySecetKey --generate-new-master-key \ + --keyring-vault-config=/etc/vault.cnf + +*xtrabackup* will generate a new master key, store it in the target keyring +vault server and re-encrypt the tablespace keys using this key. + +.. rubric:: Making the Backup with a Stored Transition Key + +Finally, there is an option to store a transition key in the keyring. In this case, +*xtrabackup* will need to access the same keyring file or vault server during +prepare and copy-back but does not depend on whether the server keys have been +purged. + +In this scenario, the three stages of the backup process look as follows. + +.. doc-attribute warning is version specific; problem may be solved in a later release + (review + after v8.0.7 + jira-issue pxb-1904) + +- Backup + + .. code-block:: bash + + $ xtrabackup --backup --user=root -p --target-dir=/data/backup \ + --generate-transition-key + +- Prepare + + - ``keyring_file`` variant: + + .. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/backup \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + + - ``keyring_vault`` variant: + + .. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/backup \ + --keyring-vault-config=/etc/vault.cnf + +- Copy-back + + - ``keyring_file`` variant: + + .. code-block:: bash + + $ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \ + --generate-new-master-key --keyring-file-data=/var/lib/mysql-keyring/keyring + + - ``keyring_vault`` variant: + + .. code-block:: bash + + $ xtrabackup --copy-back --target-dir=/data/backup --datadir=/data/mysql \ + --generate-new-master-key --keyring-vault-config=/etc/vault.cnf diff --git a/storage/innobase/xtrabackup/doc/source/advanced/locks.rst b/storage/innobase/xtrabackup/doc/source/advanced/locks.rst new file mode 100644 index 000000000000..1b64fbb79b88 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/advanced/locks.rst @@ -0,0 +1,74 @@ +.. _lock_redesign: + +=========================================== +``lock-ddl-per-table`` Option Improvements +=========================================== + +To block DDL statements on an instance, Percona Server implemented +LOCK TABLES FOR BACKUP. *Percona XtraBackup* uses this lock for the duration +of the backup. This lock does not affect DML statements. + +*Percona XtraBackup* has also implemented ``--lock-ddl-per-table``, which +blocks DDL statements by using metadata locks (MDL). + +The following procedures describe a simplified backup operation when using +``--lock-ddl-per-table``: + +1. Parse and copy all redo logs after the checkpoint mark + +2. Fork a dedicated thread to continue following new redo log entries + +3. List the tablespaces required to copy + +4. Iterate through the list. The following steps occur with each listed tablespace: + + a. Query INFORMATION_SCHEMA.INNODB_TABLES to find which tables belong + to the tablespace ID and take a MDL on the underlying table or tables + in case there is a shared tablespace. + + b. Copy the tablespace ``.ibd`` files. + +The backup process may encounter a redo log event, generated by the bulk load +operations, which notifies backup tools that data file changes have been +omitted from the redo log. This event is an ``MLOG_INDEX_LOAD``. If this +event is found by the redo follow thread, the backup continues and assumes +the backup is safe because the MDL protects tablespaces already copied and +the MLOG_INDEX_LOAD event is for a tablespace that is not copied. + +These assumptions may not be correct and may lead to inconsistent backups. + +``--lock-ddl-per-table`` redesign +---------------------------------- + +Implemented in *Percona XtraBackup* version 8.0.22-15.0, the +``--lock-ddl-per-table`` has been redesigned to minimize inconsistent backups. +The following procedure reorders the steps: + +* The MDL lock acquired at the beginning of the backup + +* Scan the redo logs. An ``MLOG_INDEX_LOAD`` event may be recorded if a ``CREATE INDEX`` statement has occurred before the backup starts. At this time, the backup process is safe and can parse and accept the event. + +* After the first scan has completed, the follow redo log thread is initiated. This thread stops the backup process if an ``MLOG_INDEX_LOAD`` event is found. + +* Gather the tablespace list to copy + +* Copy the ``.ibd`` files. + +Other Improvements +------------------ + +The following improvements have been added: + +* If the ``.ibd`` file belongs to a temporary table, the ``SELECT`` query is skipped. + +* For a FullText Index, an MDL is acquired on the base table. + +* A ``SELECT`` query that acquires an MDL does not retrieve any data. + +.. warning:: + + The ``lock-ddl-per-table`` variable is deprecated in *Percona Server for MySQL* 8.0. Use ``--lock-ddl`` instead of this variable. + + + + diff --git a/storage/innobase/xtrabackup/doc/source/advanced/log_enhancements.rst b/storage/innobase/xtrabackup/doc/source/advanced/log_enhancements.rst new file mode 100644 index 000000000000..a26dc7d56b30 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/advanced/log_enhancements.rst @@ -0,0 +1,72 @@ +.. _logs: + +================================================================================ +Improved Log statements +================================================================================ + +**Percona XtraBackup** is an open-source command-line utility. Command-line tools have limited interaction with the background operations and the logs provide the progress of an operation or more information about errors. + +In earlier versions, the error logs did not have a standard structure. Notice in the following examples the variance in the log statements: + +* The backup log statement header has the name of the module, ``xtrabackup``, which generated the statement but no timestamp: + + .. code-block:: mysql + + xtrabackup: recognized client arguments: --parallel=4 --target-dir=/data/backups/ --backup=1 + + ./bin/xtrabackup version 8.0.27-19 based on MySQL server 8.0.27 Linux (x86_64) (revision id: b0f75188ca3) + +* The copy_back log statement has a timestamp but no module name. The timestamp is a mix of UTC and the local timezone. + + .. code-block:: text + + 220322 19:05:13 [01] Copying undo_001 to /data/backups/undo_001 + +* The following prepare log statements do not have header information, which makes diagnosing an issue more difficult. + + .. code-block:: text + + Completed space ID check of 1008 files. + Initializing buffer pool, total size = 128.000000M, instances = 1, chunk size =128.000000M + Completed initialization of buffer pool + If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority(). + +Log statement structure +-------------------------------------------------- + +Starting in **Percona XtraBackup** 8.0.28-20, changes have been made to improve the log statements. The improved log structure is displayed in the backup, prepare, move-back/copy-back error logs. + +Each log statement has the following attributes: + +* **Timestamp** - a timestamp for when the event occurred in a UTC format. + +* **Severity** - the severity level of a statement indicates the importance of an event. + +* **ID** - this identifier is currently not used but may be used in future versions. + +* **Context** - the name of the module that issued the log statement, such as **XtraBackup**, **InnoDB**, or **Server**. + +* **Message** - a description of the event generated by the module. + +An example of the prepare log generated with the improved structure. The uniformity of the headers makes it easier to follow an operation's progress or review the log to diagnose issues. + +.. code-block:: bash + + 2022-03-22T19:15:36.142247+05:30 0 [Note] [MY-011825] [Xtrabackup] This target seems to be not prepared yet. + 2022-03-22T19:15:36.142792+05:30 0 [Note] [MY-013251] [InnoDB] Number of pools: 1 + 2022-03-22T19:15:36.149212+05:30 0 [Note] [MY-011825] [Xtrabackup] xtrabackup_logfile detected: size=8388608, start_lsn=(33311656) + 2022-03-22T19:15:36.149998+05:30 0 [Note] [MY-011825] [Xtrabackup] using the following InnoDB configuration for recovery: + 2022-03-22T19:15:36.150023+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_data_home_dir = . + 2022-03-22T19:15:36.150036+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_data_file_path = ibdata1:12M:autoextend + 2022-03-22T19:15:36.150078+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_group_home_dir = . + 2022-03-22T19:15:36.150095+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_files_in_group = 1 + 2022-03-22T19:15:36.150111+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_file_size = 8388608 + 2022-03-22T19:15:36.151667+05:30 0 [Note] [MY-011825] [Xtrabackup] inititialize_service_handles suceeded + 2022-03-22T19:15:36.151903+05:30 0 [Note] [MY-011825] [Xtrabackup] using the following InnoDB configuration for recovery: + 2022-03-22T19:15:36.151926+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_data_home_dir = . + 2022-03-22T19:15:36.151954+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_data_file_path = ibdata1:12M:autoextend + 2022-03-22T19:15:36.151976+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_group_home_dir = . + 2022-03-22T19:15:36.151991+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_files_in_group = 1 + 2022-03-22T19:15:36.152004+05:30 0 [Note] [MY-011825] [Xtrabackup] innodb_log_file_size = 8388608 + 2022-03-22T19:15:36.152021+05:30 0 [Note] [MY-011825] [Xtrabackup] Starting InnoDB instance for recovery. + 2022-03-22T19:15:36.152035+05:30 0 [Note] [MY-011825] [Xtrabackup] Using 104857600 bytes for buffer pool (set by --use-memory parameter) \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/source/advanced/page_tracking.rst b/storage/innobase/xtrabackup/doc/source/advanced/page_tracking.rst new file mode 100644 index 000000000000..2cf5138a7f58 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/advanced/page_tracking.rst @@ -0,0 +1,124 @@ +.. _page_tracking: + +======================================= +Incremental backup using page tracking +======================================= + +This feature is *tech preview* quality. + +Percona XtraBackup 8.0.27 adds support for the page tracking functionality for `incremental backup `__ . + +To create an incremental backup with page tracking, Percona XtraBackup uses the MySQL mysqlbackup component. This component provides a list of pages modified since the last backup, and Percona XtraBackup copies only those pages. This operation removes the need to scan all of the pages in the database. If the majority of pages have not been modified, the page tracking feature can improve the speed of incremental backups. + +Install the component +--------------------- + +To start using the page tracking functionality, do the following steps: + +1. Install the mysqlbackup component and enable it on the server: + + .. code-block:: mysql + + $ INSTALL COMPONENT "file://component_mysqlbackup"; + +2. Check whether the mysqlbackup component is installed succesfuly: + + .. code-block:: bash + + SELECT COUNT(1) FROM mysql.component WHERE component_urn='file://component_mysqlbackup'; + +Using page tracking +----------------------- + +You can enable the page tracking functionality for the full and incremental backups with the ``--page-tracking`` option. + +The option has the following benefits: + +* Resets page tracking to the start of the backup. This reset allows the next incremental backup to use page tracking. + +* Allows the use of page tracking for an incremental backup if the page tracking data is available from the backup's start checkpoint LSN. + + .. note:: + + Percona XtraBackup processes a list of all the tracked pages in memory. If Percona XtraBackup does not have enough available memory to process the list of all the tracked pages, Percona XtraBackup throws an error and exits. For example, if an incremental backup uses 200GB, Percona XtraBackup can additionally use about 100MB of memory to store the page tracking data. + +An example of creating a full backup using the ``--page-tracking`` option. + + .. code-block:: bash + + xtrabackup --backup --target-dir=$FULL_BACK --page-tracking + +An example of creating an incremental backup using the ``--page-tracking`` option. + + .. code-block:: bash + + xtrabackup --backup --target-dir=$INC_BACKUP --incremental-basedir=$FULL_BACKUP --page-tracking + +After enabling the functionality, the next incremental backup finds changed pages using page tracking. + +.. note:: + + For the very first full backup using page tracking, Percona XtraBackup may have a delay. The following is an example of the message you can receive: + + .. code-block:: bash + + xtrabackup: pagetracking: Sleeping for 1 second, waiting for checkpoint lsn 17852922 / + to reach to page tracking start lsn 21353759 + + You can avoid this delay by enabling page tracking before creating the first backup. Thus, you ensure that page tracking log sequence number (LSN) is more than the checkpoint LSN of the server. + +Start page tracking manually +---------------------------- + +After the mysqlbackup component is loaded and active on the server, you can start page tracking manually with the following option: + + .. code-block:: mysql + + $ SELECT mysqlbackup_page_track_set(true); + +Check the LSN value +------------------- + +Check the LSN value starting from which changed pages are tracked with the following option: + + .. code-block:: mysql + + $ SELECT mysqlbackup_page_track_get_start_lsn(); + +Stop page tracking +------------------ + +If you need to stop page tracking, use the following option: + + .. code-block:: mysql + + $ SELECT mysqlbackup_page_track_set(false); + +Purge page tracking data +---------------------------- + +When you start page tracking, it creates a file under the server's datadir to collect data about changed pages. This file grows until you stop the page tracking. If you stop the server and then restart it, page tracking creates a new file but also keeps the old one. The old file continues to grow until you stop the page tracking explicitly. + +If you purge the page tracking data, you should create a full backup afterward. To purge the page tracking data, do the following steps: + + .. code-block:: mysql + + $ SELECT mysqlbackup_page_track_set(false); + $ SELECT mysqlbackup_page_track_purge_up_to(9223372036854775807); + /* Specify the LSN up to which you want to purge page tracking data. / + 9223372036854775807 is the highest possible LSN which purges all page tracking files.*/ + $ SELECT mysqlbackup_page_track_set(true); + +Known issue +------------ + +If the index is built in place using an exclusive algorithm and then is added to a table after the last LSN checkpoint, you may get a bad incremental backup using page tracking. Find more details in `PS-8032 `__ . + +Uninstall the mysqlbackup component +------------------------------------- + +If you need to uninstall the mysqlbackup component, use the following option: + + .. code-block:: mysql + + $ UNINSTALL COMPONENT "file://component_mysqlbackup" \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/source/advanced/throttling_backups.rst b/storage/innobase/xtrabackup/doc/source/advanced/throttling_backups.rst new file mode 100644 index 000000000000..67aa860b48a9 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/advanced/throttling_backups.rst @@ -0,0 +1,29 @@ +.. _throttling_backups: + +================== +Throttling Backups +================== + +Although *xtrabackup* does not block your database's operation, any backup +can add load to the system being backed up. On systems that do not have much +spare I/O capacity, it might be helpful to throttle the rate at which +*xtrabackup* reads and writes data. You can do this with the +:option:`--throttle` option. This option limits the number of chunks copied per second. The chunk ++size is *10 MB*. + +The image below shows how throttling works when :option:`--throttle` is +set to ``1``. + +.. image:: /_static/throttle.png + + +When specified with the :option:`--backup` option, this option +limits the number of pairs of read-and-write operations per second that +*xtrabackup* will perform. If you are creating an incremental backup, then the +limit is the number of read I/O operations per second. + +By default, there is no throttling, and *xtrabackup* reads and writes data as +quickly as it can. If you set too strict of a limit on the IOPS, the +backup might be so slow that it will never catch up with the transaction logs +that InnoDB is writing, so the backup might never complete. + diff --git a/storage/innobase/xtrabackup/doc/source/backup_scenarios/compressed_backup.rst b/storage/innobase/xtrabackup/doc/source/backup_scenarios/compressed_backup.rst new file mode 100644 index 000000000000..701dffe9995b --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/backup_scenarios/compressed_backup.rst @@ -0,0 +1,120 @@ +.. _compressed_backup: + +================= +Compressed Backup +================= + +*Percona XtraBackup* supports compressed backups: a local or streaming backup +can be compressed or decompressed with *xbstream*. + +Creating Compressed Backups +=========================== + +In order to make a compressed backup you'll need to use the :option:`--compress` +option: + +.. code-block:: bash + + $ xtrabackup --backup --compress --target-dir=/data/compressed/ + +The :option:`--compress` uses the ``qpress`` tool that you can install via +the ``percona-release`` package configuration tool as follows: + +.. code-block:: bash + + $ sudo percona-release enable tools + $ sudo apt update + $ sudo apt install qpress + +.. note:: + + .. include:: ../.res/contents/instruction.repository.enabling.txt + + .. seealso:: :ref:`installing_from_binaries` + +If you want to speed up the compression you can use the parallel compression, +which can be enabled with :option:`--compress-threads` option. +Following example will use four threads for compression: + +.. code-block:: bash + + $ xtrabackup --backup --compress --compress-threads=4 \ + --target-dir=/data/compressed/ + +Output should look like this :: + + ... + 170223 13:00:38 [01] Compressing ./test/sbtest1.frm to /tmp/compressed/test/sbtest1.frm.qp + 170223 13:00:38 [01] ...done + 170223 13:00:38 [01] Compressing ./test/sbtest2.frm to /tmp/compressed/test/sbtest2.frm.qp + 170223 13:00:38 [01] ...done + ... + 170223 13:00:39 [00] Compressing xtrabackup_info + 170223 13:00:39 [00] ...done + xtrabackup: Transaction log of lsn (9291934) to (9291934) was copied. + 170223 13:00:39 completed OK! + +Preparing the backup +-------------------- + +Before you can prepare the backup you'll need to uncompress all the files. +*Percona XtraBackup* has implemented :option:`--decompress` option +that can be used to decompress the backup. + + +.. code-block:: bash + + $ xtrabackup --decompress --target-dir=/data/compressed/ + +.. note:: + + :option:`--parallel` can be used with + :option:`--decompress` option to decompress multiple files + simultaneously. + +*Percona XtraBackup* doesn't automatically remove the compressed files. In +order to clean up the backup directory you should use +:option:`--remove-original` option. Even if they're not removed +these files will not be copied/moved over to the datadir if +:option:`--copy-back` or :option:`--move-back` are used. + +When the files are uncompressed you can prepare the backup with the +:option:`--prepare` option: + +.. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/compressed/ + +You should check for a confirmation message: :: + + InnoDB: Starting shutdown... + InnoDB: Shutdown completed; log sequence number 9293846 + 170223 13:39:31 completed OK! + +Now the files in :file:`/data/compressed/` are ready to be used by the server. + +Restoring the backup +-------------------- + +*xtrabackup* has a :option:`--copy-back` option, which performs the +restoration of a backup to the server's :term:`datadir`: + +.. code-block:: bash + + $ xtrabackup --copy-back --target-dir=/data/backups/ + +It will copy all the data-related files back to the server's :term:`datadir`, +determined by the server's :file:`my.cnf` configuration file. You should check +the last line of the output for a success message:: + + 170223 13:49:13 completed OK! + +You should check the file permissions after copying the data back. You may need +to adjust them with something like: + +.. code-block:: bash + + $ chown -R mysql:mysql /var/lib/mysql + +Now that the :term:`datadir` contains the restored data. You are ready to start +the server. diff --git a/storage/innobase/xtrabackup/doc/source/backup_scenarios/full_backup.rst b/storage/innobase/xtrabackup/doc/source/backup_scenarios/full_backup.rst new file mode 100644 index 000000000000..60595220d30e --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/backup_scenarios/full_backup.rst @@ -0,0 +1,215 @@ +.. _full_backup: + +================================================================================ +The Backup Cycle - Full Backups +================================================================================ + +.. _creating_a_backup: + +Creating a backup +================================================================================ + +To create a backup, run :program:`xtrabackup` with the :option:`--backup` +option. You also need to specify the :option:`--target-dir` option, which is where +the backup will be stored, if the *InnoDB* data or log files are not stored in +the same directory, you might need to specify the location of those, too. If the +target directory does not exist, *xtrabackup* creates it. If the directory does +exist and is empty, *xtrabackup* will succeed. + +*xtrabackup* will not overwrite existing files, it will fail with operating +system error 17, ``file exists``. + +To start the backup process run: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups/ + +This will store the backup at :file:`/data/backups/`. If you specify a +relative path, the target directory will be relative to the current directory. + +During the backup process, you should see a lot of output showing the data +files being copied, as well as the log file thread repeatedly scanning the log +files and copying from it. Here is an example that shows the log thread +scanning the log in the background, and a file copying thread working on the +:file:`ibdata1` file: + +.. code-block:: text + + 160906 10:19:17 Finished backing up non-InnoDB tables and files + 160906 10:19:17 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS... + xtrabackup: The latest check point (for incremental): '62988944' + xtrabackup: Stopping log copying thread. + .160906 10:19:18 >> log scanned up to (137343534) + 160906 10:19:18 Executing UNLOCK TABLES + 160906 10:19:18 All tables unlocked + 160906 10:19:18 Backup created in directory '/data/backups/' + 160906 10:19:18 [00] Writing backup-my.cnf + 160906 10:19:18 [00] ...done + 160906 10:19:18 [00] Writing xtrabackup_info + 160906 10:19:18 [00] ...done + xtrabackup: Transaction log of lsn (26970807) to (137343534) was copied. + 160906 10:19:18 completed OK! + +The last thing you should see is something like the following, where the value +of the ```` will be a number that depends on your system: + +.. code-block:: text + + $ xtrabackup: Transaction log of lsn () to () was copied. + +.. note:: + + Log copying thread checks the transactional log every second to see if there + were any new log records written that need to be copied, but there is a + chance that the log copying thread might not be able to keep up with the + amount of writes that go to the transactional logs, and will hit an error + when the log records are overwritten before they could be read. + +After the backup is finished, the target directory will contain files such as +the following, assuming you have a single InnoDB table :file:`test.tbl1` and you +are using MySQL's :term:`innodb_file_per_table` option: + +.. code-block:: bash + + $ ls -lh /data/backups/ + total 182M + drwx------ 7 root root 4.0K Sep 6 10:19 . + drwxrwxrwt 11 root root 4.0K Sep 6 11:05 .. + -rw-r----- 1 root root 387 Sep 6 10:19 backup-my.cnf + -rw-r----- 1 root root 76M Sep 6 10:19 ibdata1 + drwx------ 2 root root 4.0K Sep 6 10:19 mysql + drwx------ 2 root root 4.0K Sep 6 10:19 performance_schema + drwx------ 2 root root 4.0K Sep 6 10:19 sbtest + drwx------ 2 root root 4.0K Sep 6 10:19 test + drwx------ 2 root root 4.0K Sep 6 10:19 world2 + -rw-r----- 1 root root 116 Sep 6 10:19 xtrabackup_checkpoints + -rw-r----- 1 root root 433 Sep 6 10:19 xtrabackup_info + -rw-r----- 1 root root 106M Sep 6 10:19 xtrabackup_logfile + +The backup can take a long time, depending on how large the database is. It is +safe to cancel at any time, because *xtrabackup* does not modify the database. + +The next step is getting your backup ready to be restored. + +.. _preparing_a_backup: + +Preparing a backup +================================================================================ +After making a backup with the :option:`--backup` option, you need need to +prepare it in order to restore it. Data files are not point-in-time consistent +until they are *prepared*, because they were copied at different times as the +program ran, and they might have been changed while this was happening. + +If you try to start InnoDB with these data files, it will detect corruption and +stop working to avoid running on damaged data. The :option:`--prepare` step +makes the files perfectly consistent at a single instant in time, so you can run +*InnoDB* on them. + +You can run the *prepare* operation on any machine; it does not need to be on the +originating server or the server to which you intend to restore. You can copy +the backup to a utility server and prepare it there. + +Note that *Percona XtraBackup* 8.0 can only prepare backups of *MySQL* +8.0, *Percona Server for MySQL* 8.0, and *Percona XtraDB Cluster* 8.0 +databases. Releases prior to 8.0 are not supported. + +During the *prepare* operation, *xtrabackup* boots up a kind of modified +embedded InnoDB (the libraries *xtrabackup* was linked against). The +modifications are necessary to disable InnoDB standard safety checks, such as +complaining about the log file not being the right size. This warning is not +appropriate for working with backups. These modifications are only for the +xtrabackup binary; you do not need a modified *InnoDB* to use *xtrabackup* for +your backups. + +The *prepare* step uses this "embedded InnoDB" to perform crash recovery on the +copied data files, using the copied log file. The ``prepare`` step is very +simple to use: you simply run *xtrabackup* with the :option:`--prepare` option +and tell it which directory to prepare, for example, to prepare the previously +taken backup run: + +.. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/backups/ + +When this finishes, you should see an ``InnoDB shutdown`` with a message such +as the following, where again the value of :term:`LSN` will depend on your +system: + +.. code-block:: text + + InnoDB: Shutdown completed; log sequence number 137345046 + 160906 11:21:01 completed OK! + +All following prepares will not change the already prepared data files, you'll +see that output says: + +.. code-block:: console + + xtrabackup: This target seems to be already prepared. + xtrabackup: notice: xtrabackup_logfile was already used to '--prepare'. + +It is not recommended to interrupt xtrabackup process while preparing backup +because it may cause data files corruption and backup will become unusable. +Backup validity is not guaranteed if prepare process was interrupted. + +.. note:: + + If you intend the backup to be the basis for further incremental backups, you + should use the :option:`--apply-log-only` option when preparing + the backup, or you will not be able to apply incremental backups to it. See + the documentation on preparing :ref:`incremental backups + ` for more details. + +.. _restoring_a_backup: + +Restoring a Backup +================================================================================ + +.. warning:: + + Backup needs to be :ref:`prepared ` before it can be + restored. + +For convenience, *xtrabackup* binary has the :option:`--copy-back` +option to copy the backup to the :term:`datadir` of the server: + +.. code-block:: bash + + $ xtrabackup --copy-back --target-dir=/data/backups/ + +If you don't want to save your backup, you can use the +:option:`--move-back` option which will move the backed up data to +the :term:`datadir`. + +If you don't want to use any of the above options, you can additionally use +:program:`rsync` or :program:`cp` to restore the files. + +.. note:: + + The :term:`datadir` must be empty before restoring the backup. Also it's + important to note that MySQL server needs to be shut down before restore is + performed. You cannot restore to a :term:`datadir` of a running mysqld instance + (except when importing a partial backup). + +Example of the :program:`rsync` command that can be used to restore the backup +can look like this: + +.. code-block:: bash + + $ rsync -avrP /data/backup/ /var/lib/mysql/ + +You should check that the restored files have the correct ownership and +permissions. + +As files' attributes will be preserved, in most cases you will need to change +the files' ownership to ``mysql`` before starting the database server, as they +will be owned by the user who created the backup: + +.. code-block:: bash + + $ chown -R mysql:mysql /var/lib/mysql + +Data is now restored and you can start the server. + + diff --git a/storage/innobase/xtrabackup/doc/source/backup_scenarios/incremental_backup.rst b/storage/innobase/xtrabackup/doc/source/backup_scenarios/incremental_backup.rst new file mode 100644 index 000000000000..8c04cd0d7a9d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/backup_scenarios/incremental_backup.rst @@ -0,0 +1,245 @@ +.. _incremental_backup: + +================== +Incremental Backup +================== + +*xtrabackup* supports incremental backups, which means that they can copy only +the data that has changed since the last backup. + +.. note:: Incremental backups on the MyRocks storage engine do not determine if an earlier full backup or incremental backup contains the same files. **Percona XtraBackup** copies all of the MyRocks files each time it takes a backup. + +You can perform many incremental backups between each full backup, so you can +set up a backup process such as a full backup once a week and an incremental +backup every day, or full backups every day and incremental backups every hour. + +Incremental backups work because each *InnoDB* page contains a log sequence +number, or :term:`LSN`. The :term:`LSN` is the system version number for the +entire database. Each page's :term:`LSN` shows how recently it was changed. + +An incremental backup copies each page whose :term:`LSN` is newer than the +previous incremental or full backup's :term:`LSN`. There are two algorithms in +use to find the set of such pages to be copied. The first one, available with +all the server types and versions, is to check the page :term:`LSN` directly by +reading all the data pages. The second one, available with *Percona Server for MySQL*, is +to enable the `changed page tracking +`_ +feature on the server, which will note the pages as they are being changed. +This information will be then written out in a compact separate so-called +bitmap file. The *xtrabackup* binary will use that file to read only the data +pages it needs for the incremental backup, potentially saving many read +requests. The latter algorithm is enabled by default if the *xtrabackup* binary +finds the bitmap file. It is possible to specify +:option:`--incremental-force-scan` to read all the pages even if the +bitmap data is available. + +.. important:: + + Incremental backups do not actually compare the data files to the previous + backup's data files. For this reason, running an incremental backup after a + *partial backup* may lead to inconsistent data. + + Incremental backups simply read the pages and compare their :term:`LSN` to + the last backup's :term:`LSN`. You still need a full backup to recover the + incremental changes, however; without a full backup to act as a base, the + incremental backups are useless. + + You can use the :option:`--incremental-lsn` option to perform an incremental + backup without even having the previous backup, if you know its :term:`LSN`. + + .. seealso:: :ref:`pxb.partial-backup` + +Creating an Incremental Backup +============================== + +To make an incremental backup, begin with a full backup as usual. The +*xtrabackup* binary writes a file called :file:`xtrabackup_checkpoints` into +the backup's target directory. This file contains a line showing the +``to_lsn``, which is the database's :term:`LSN` at the end of the backup. +:ref:`Create the full backup ` with a following command: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups/base + +If you look at the :file:`xtrabackup_checkpoints` file, you should see similar +content depending on your LSN nuber: + +.. code-block:: text + + backup_type = full-backuped + from_lsn = 0 + to_lsn = 1626007 + last_lsn = 1626007 + compact = 0 + recover_binlog_info = 1 + +Now that you have a full backup, you can make an incremental backup based on +it. Use the following command: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups/inc1 \ + --incremental-basedir=/data/backups/base + +The :file:`/data/backups/inc1/` directory should now contain delta files, such +as :file:`ibdata1.delta` and :file:`test/table1.ibd.delta`. These represent the +changes since the ``LSN 1626007``. If you examine the +:file:`xtrabackup_checkpoints` file in this directory, you should see similar +content to the following: + +.. code-block:: text + + backup_type = incremental + from_lsn = 1626007 + to_lsn = 4124244 + last_lsn = 4124244 + compact = 0 + recover_binlog_info = 1 + +``from_lsn`` is the starting LSN of the backup and for incremental it has to be +the same as ``to_lsn`` (if it is the last checkpoint) of the previous/base +backup. + +It's now possible to use this directory as the base for yet another incremental +backup: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups/inc2 \ + --incremental-basedir=/data/backups/inc1 + +This folder also contains the :file:`xtrabackup_checkpoints`: + +.. code-block:: text + + backup_type = incremental + from_lsn = 4124244 + to_lsn = 6938371 + last_lsn = 7110572 + compact = 0 + recover_binlog_info = 1 + +.. note:: + + In this case you can see that there is a difference between the ``to_lsn`` + (last checkpoint LSN) and ``last_lsn`` (last copied LSN), this means that + there was some traffic on the server during the backup process. + +.. _preparing_incremental_backups: + +Preparing the Incremental Backups +================================= + +The :option:`--prepare` step for incremental backups is not the same +as for full backups. In full backups, two types of operations are performed to +make the database consistent: committed transactions are replayed from the log +file against the data files, and uncommitted transactions are rolled back. You +must skip the rollback of uncommitted transactions when preparing an +incremental backup, because transactions that were uncommitted at the time of +your backup may be in progress, and it's likely that they will be committed in +the next incremental backup. You should use the +:option:`--apply-log-only` option to prevent the rollback phase. + +.. warning:: + + **If you do not use the** :option:`--apply-log-only` **option to + prevent the rollback phase, then your incremental backups will be useless**. + After transactions have been rolled back, further incremental backups cannot + be applied. + +Beginning with the full backup you created, you can prepare it, and then apply +the incremental differences to it. Recall that you have the following backups: + +.. code-block:: bash + + /data/backups/base + /data/backups/inc1 + /data/backups/inc2 + +To prepare the base backup, you need to run :option:`--prepare` as +usual, but prevent the rollback phase: + +.. code-block:: bash + + $ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base + +The output should end with text similar to the following: + +.. code-block:: text + + InnoDB: Shutdown completed; log sequence number 1626007 + 161011 12:41:04 completed OK! + +The log sequence number should match the ``to_lsn`` of the base backup, which +you saw previously. + +.. note:: + + This backup is actually safe to :ref:`restore ` as-is + now, even though the rollback phase has been skipped. If you restore it and + start *MySQL*, *InnoDB* will detect that the rollback phase was not + performed, and it will do that in the background, as it usually does for a + crash recovery upon start. It will notify you that the database was not shut + down normally. + +To apply the first incremental backup to the full backup, run the following +command: + +.. code-block:: bash + + $ xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \ + --incremental-dir=/data/backups/inc1 + +This applies the delta files to the files in :file:`/data/backups/base`, which +rolls them forward in time to the time of the incremental backup. It then +applies the redo log as usual to the result. The final data is in +:file:`/data/backups/base`, not in the incremental directory. You should see +an output similar to: + +.. code-block:: text + + incremental backup from 1626007 is enabled. + xtrabackup: cd to /data/backups/base + xtrabackup: This target seems to be already prepared with --apply-log-only. + xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(4124244) + ... + xtrabackup: page size for /tmp/backups/inc1/ibdata1.delta is 16384 bytes + Applying /tmp/backups/inc1/ibdata1.delta to ./ibdata1... + ... + 161011 12:45:56 completed OK! + +Again, the LSN should match what you saw from your earlier inspection of the +first incremental backup. If you restore the files from +:file:`/data/backups/base`, you should see the state of the database as of the +first incremental backup. + +.. warning:: + + *Percona XtraBackup* does not support using the same incremental backup directory to prepare + two copies of backup. Do not run :option:`--prepare` with the same + incremental backup directory (the value of `--incremental-dir`) more than + once. + +Preparing the second incremental backup is a similar process: apply the deltas +to the (modified) base backup, and you will roll its data forward in time to +the point of the second incremental backup: + +.. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/backups/base \ + --incremental-dir=/data/backups/inc2 + +.. note:: + + :option:`--apply-log-only` should be used when merging all incrementals except + the last one. That's why the previous line doesn't contain the + :option:`--apply-log-only` option. Even if the :option:`--apply-log-only` was + used on the last step, backup would still be consistent but in that case server + would perform the rollback phase. + +Once prepared incremental backups are the same as the :ref:`full backups +` and they can be :ref:`restored ` in the same +way. + + diff --git a/storage/innobase/xtrabackup/doc/source/conf-material/conf.py b/storage/innobase/xtrabackup/doc/source/conf-material/conf.py new file mode 100644 index 000000000000..66feb4ad4c8d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/conf-material/conf.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +import sys +import os +sys.path.append(os.path.abspath("../")) +from conf import * +extensions.append('sphinx_gitstamp') +extensions.append('sphinx_copybutton') +html_sidebars['**']=['globaltoc.html', 'searchbox.html', 'localtoc.html', 'logo-text.html'] +html_theme = 'sphinx_material' +html_theme_options = { + 'base_url': 'http://bashtage.github.io/sphinx-material/', + 'repo_url': 'https://github.com/percona/percona-xtrabackup', + 'repo_name': 'percona/percona-xtrabackup', + 'color_accent': 'grey', + 'color_primary': 'orange', + 'globaltoc_collapse': True, + 'version_dropdown': True, + 'version_dropdown_text': 'Versions', + 'version_info': { + "2.4": "https://docs.percona.com/percona-xtrabackup/2.4/", + "8.0": "https://docs.percona.com/percona-xtrabackup/8.0/", + "Latest": "https://docs.percona.com/percona-xtrabackup/latest/" + }, +} +html_logo = '../_static/percona-logo.svg' +html_favicon = '../_static/percona_favicon.ico' +pygments_style = 'emacs' +gitstamp_fmt = "%b %d, %Y" +# Specify the text pattern that won't be copied with the code block contents +copybutton_prompt_text = '$' +# Add any paths that contain templates here, relative to this directory. +templates_path = ['../_templates/theme'] +#html_last_updated_fmt = '' diff --git a/storage/innobase/xtrabackup/doc/source/conf.py b/storage/innobase/xtrabackup/doc/source/conf.py new file mode 100644 index 000000000000..190c1a054e19 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/conf.py @@ -0,0 +1,299 @@ +# -*- coding: utf-8 -*- +# +# Percona XtraBackup documentation build configuration file, created by +# sphinx-quickstart on Mon Jun 27 22:27:15 2011. +# +# This file is execfile()d with the current directory set to its containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys, os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ----------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. + +# extensions = ['sphinx.ext.extlinks', 'sphinx.ext.todo', +# 'sphinx.ext.coverage', 'sphinx.ext.ifconfig'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Percona XtraBackup' +copyright = u'2009-2022, Percona LLC and/or its affiliates' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '8.0' +# The full version, including alpha/beta/rc tags. +release = '8.0.29-22.0' +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + + +rst_prolog = ''' + +.. role:: mysql(code) + :language: mysql + +.. role:: dir(file) + +.. role:: bash(code) + :language: bash + + +.. |check| replace:: ``|[[---CHECK---]]|`` + +.. |xtrabackup| replace:: :program:`xtrabackup` + +.. |innobackupex| replace:: :program:`innobackupex` + +.. |xbstream| replace:: :term:`xbstream` + +.. |xbcrypt| replace:: :term:`xbcrypt` + +.. |XtraDB| replace:: *XtraDB* + +.. |InnoDB| replace:: *InnoDB* + +.. |MyISAM| replace:: *MyISAM* + +.. |Percona Toolkit| replace:: *Percona Toolkit* + +.. |LSN| replace:: :term:`LSN` + +.. |XtraBackup| replace:: *Percona XtraBackup* + +.. |Percona XtraBackup| replace:: *Percona XtraBackup* + +.. |PXB| replace:: *Percona XtraBackup* + +.. |Percona XtraDB Cluster| replace:: *Percona XtraDB Cluster* + +.. |Percona Server| replace:: *Percona Server for MySQL* + +.. |Percona| replace:: *Percona* + +.. |MySQL| replace:: *MySQL* + +.. |MariaDB| replace:: *MariaDB* + +.. |tar4ibd| replace:: :program:`tar4ibd` + +.. |tar| replace:: :program:`tar` + +.. |xbcloud| replace:: *xbcloud* + +''' + +extlinks = {'mysqlbug': ('http://bugs.mysql.com/bug.php?id=%s', '#'), + 'jirabug': ('https://jira.percona.com/browse/%s', '')} + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + + +# -- Options for HTML output --------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# -- html_theme = 'percona-theme-1-4' + + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +# -- html_theme_path = ['.', './percona-theme'] + +# Redirect info for Edit on Github link +# -- html_context = { +# -- 'repo_name': '/percona/percona-xtrabackup', +# -- 'repo_url': 'https://github.com/percona/percona-xtrabackup', +# -- 'edit_uri': 'edit/8.0/storage/innobase/xtrabackup/doc/source' +# -- } + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +# -- html_title = ' '.join([project, version, 'Documentation']) + +# A shorter title for the navigation bar. Default is the same as html_title. +# -- html_short_title = ' '.join([project, version, 'Documentation']) + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# -- html_logo = 'percona-xtrabackup-logo.jpg' + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# -- html_favicon = 'percona_favicon.ico' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# -- html_static_path = ['_static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# -- html_sidebars = { +# -- '**': ['localtoc.html', 'sourcelink.html'], +# -- 'using/windows': ['windowssidebar.html'], +# -- } + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +#htmlhelp_basename = 'PerconaXtraBackupDocumentation' +# -- htmlhelp_basename = ''.join([''.join(project.split()), +# -- 'Documentation']) + +# -- Options for LaTeX output -------------------------------------------------- + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, documentclass [howto/manual]). +# -- latex_documents = [ +# -- ('index', +# -- '.'.join(['-'.join([''.join(project.split()), version]), 'tex']), +# -- ' '.join([project, version, 'Documentation']), +# -- u'Percona LLC and/or its affiliates', 'manual'), +# -- ] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# -- latex_logo = 'percona-logo-color.png' + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# -- latex_toplevel_sectioning = 'part' + +# -- #latex_elements = { +# -- 'classoptions': ',oneside', +# -- 'babel': '\\usepackage[english]{babel}' +# -- } + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output -------------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('xtrabackup_bin/xtrabackup_binary', 'xtrabackup', ' '.join([project, version, 'Documentation']), + [u'Percona LLC and/or its affiliates'], 1), + ('xbcrypt/xbcrypt', 'xbcrypt', u'Percona xbcrypt Documentation', + [u'Percona LLC and/or its affiliates'], 1), + ('xbstream/xbstream', 'xbstream', u'Percona xbstream Documentation', + [u'Percona LLC and/or its affiliates'], 1) +] diff --git a/storage/innobase/xtrabackup/doc/source/em/instant.rst b/storage/innobase/xtrabackup/doc/source/em/instant.rst new file mode 100644 index 000000000000..86fd7c486694 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/em/instant.rst @@ -0,0 +1,71 @@ +.. em-instant: + +============================================================================== +Error Message: Found tables with row versions due to INSTANT ADD/DROP columns +============================================================================== + +*MySQL* 8.0.29 extended the support for `ALTER TABLE … ALGORITHM=INSTANT` to allow users to add a column in any table position or drop any column. As part of this update, the redo log format has changed for all server DML operations. This updated redo log format has a design flaw that can cause data corruption for tables with INSTANT ADD/DROP COLUMNS. + +The corruption happens when the crash recovery occurs. InnoDB applies redo logs at startup. Xtrabackup copies the redo log during the backup and applies the log as part of the `--prepare` step to bring the backup to a consistent state. + +Percona fixed the corruption issue and several other issues with the INSTANT ADD/DROP column feature in the upcoming Percona Server for MySQL 8.0.29. + +For more details, see the following: + +* `PS-8291 `__, + +* `PS-8292 `__ + +* `PS-8303 `__ + +Percona XtraBackup 8.0.29 is able to take backups of Percona Server for MySQL 8.0.29 with tables that have `INSTANT ADD/DROP COLUMNS`. However, the issues in MySQL 8.0.29 make this version unsafe to take backups. + +It is impossible for XtraBackup to deal with the corrupted redo log generated by MySQL 8.0.29 and, for this reason, XtraBackup 8.0.29 version will not take backups if it detects tables with `INSTANT ADD/DROP COLUMNS` and generates an error listing the affected tables and providing instructions to convert them to regular tables. + +Please avoid ALTER ADD/DROP COLUMN without an explicit ALGORITHM=INPLACE. The default ALGORITHM is INSTANT, so ALTER TABLE without the ALGORITHM keyword uses the newly introduced INSTANT algorithm. + +If you already have such tables (information below on how to find such tables), users are advised to do `OPTIMIZE TABLE` against these tables before taking backups. + + +To find tables with `INSTANT ADD/DROP COLUMNS` run the following command: + +.. code-block:: mysql + + mysql> SELECT NAME FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE TOTAL_ROW_VERSIONS > 0; + +---------+ + | NAME | + +---------+ + | test/t1 | + | test/t2 | + | test/t3 | + +---------+ + 3 rows in set (0.02 sec) + + +If this query shows an empty result set, you have no issues. Percona Xtrabackup takes the backup of your MySQL 8.0.29 server. If the results are a list of tables, please run OPTIMIZE TABLE on the list before taking the backup. + +Percona XtraBackup Error Message +--------------------------------- + +If Percona XtraBackup detects that MySQL 8.0.29 server has tables with instant add/drop columns, it aborts with the following error message + + + .. code-block:: mysql + + 2022-07-01T15:18:35.127689+05:30 0 [ERROR] [MY-011825] [Xtrabackup] Found tables with row versions due to INSTANT ADD/DROP columns + 2022-07-01T15:18:35.127714+05:30 0 [ERROR] [MY-011825] [Xtrabackup] This feature is not stable and will cause backup corruption. + 2022-07-01T15:18:35.127723+05:30 0 [ERROR] [MY-011825] [Xtrabackup] Tables found: + 2022-07-01T15:18:35.127730+05:30 0 [ERROR] [MY-011825] [Xtrabackup] test/t1 + 2022-07-01T15:18:35.127737+05:30 0 [ERROR] [MY-011825] [Xtrabackup] test/t2 + 2022-07-01T15:18:35.127744+05:30 0 [ERROR] [MY-011825] [Xtrabackup] test/t3 + 2022-07-01T15:18:35.127752+05:30 0 [ERROR] [MY-011825] [Xtrabackup] Please run OPTIMIZE TABLE or ALTER TABLE ALGORITHM=COPY on all listed tables to fix this issue. + +Summary +-------------- + +The option, `ALGORITHM=INSTANT` is the default value in MySQL 8.0.29. If you do not specify an algorithm, all `ALTER TABLE ADD/DROP COLUMN` statements use this algorithm. + +The `INSTANT` algorithm is unstable at this point. + +Percona XtraBackup refuses to take backups from MySQL 8.0.29 tables that have used this algorithm. +Percona Server users do not suffer the same limitations as the corruption issues are fixed in the upcoming release of Percona Server for MySQL 8.0.29 diff --git a/storage/innobase/xtrabackup/doc/source/faq.rst b/storage/innobase/xtrabackup/doc/source/faq.rst new file mode 100644 index 000000000000..a0d632197c4e --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/faq.rst @@ -0,0 +1,96 @@ +================================================================================ +Frequently Asked Questions +================================================================================ + +Does *Percona XtraBackup* 8.0 support making backups of databases in versions prior to 8.0? +==================================================================================================== + +.. include:: .res/contents/text.pxb.8-0.txt + +.. _pxb.faq.innobackupex.8-0: + +Why will ``innobackupex`` not run in *Percona XtraBackup* 8.0? +================================================================================ + +:program:`innobackupex` has been removed from *Percona XtraBackup* +8.0 in favor of :program:`xtrabackup`. + +What's the difference between :program:`innobackupex` and :program:`xtrabackup`? +================================================================================ + +See :ref:`pxb.faq.innobackupex.8-0` + +Are you aware of any web-based backup management tools (commercial or not) built around *Percona XtraBackup*? +======================================================================================================================== + +`Zmanda Recovery Manager `_ is +a commercial tool that uses *Percona XtraBackup* for Non-Blocking Backups: + + *"ZRM provides support for non-blocking backups of MySQL using Percona + XtraBackup. ZRM with *Percona XtraBackup* provides resource utilization + management by providing throttling based on the number of IO operations per + second. *Percona XtraBackup* based backups also allow for table level recovery + even though the backup was done at the database level (needs the recovery + database server to be *Percona Server for MySQL* with XtraDB)."* + +*xtrabackup* binary fails with a floating point exception +================================================================================ + +In most of the cases this is due to not having install the required libraries +(and version) by *xtrabackup*. Installing the *GCC* suite with the supporting +libraries and recompiling *xtrabackup* will solve the issue. See +:doc:`installation/compiling_xtrabackup` for instructions on the procedure. + +How xtrabackup handles the ibdata/ib_log files on restore if they aren't in mysql datadir? +==================================================================================================== + +In case the :file:`ibdata` and :file:`ib_log` files are located in different +directories outside of the datadir, you will have to put them in their proper +place after the logs have been applied. + +Backup fails with Error 24: 'Too many open files' +================================================= + +This usually happens when database being backed up contains large amount of +files and *Percona XtraBackup* can't open all of them to create a successful +backup. In order to avoid this error the operating system should be configured +appropriately so that *Percona XtraBackup* can open all its files. On Linux, +this can be done with the ``ulimit`` command for specific backup session or by +editing the :file:`/etc/security/limits.conf` to change it globally (**NOTE**: +the maximum possible value that can be set up is ``1048576`` which is a +hard-coded constant in the Linux kernel). + +How to deal with skipping of redo logs for DDL operations? +========================================================== + +To prevent creating corrupted backups when running DDL operations, +Percona XtraBackup aborts if it detects that redo logging is disabled. +In this case, the following error is printed:: + + [FATAL] InnoDB: An optimized (without redo logging) DDL operation has been performed. All modified pages may not have been flushed to the disk yet. + Percona XtraBackup will not be able to take a consistent backup. Retry the backup operation. + +.. note:: Redo logging is disabled during a `sorted index build + `_ + +To avoid this error, +Percona XtraBackup can use metadata locks on tables while they are copied: + +* To block all DDL operations, use the :option:`--lock-ddl` option + that issues ``LOCK TABLES FOR BACKUP``. + +* If ``LOCK TABLES FOR BACKUP`` is not supported, + you can block DDL for each table + before XtraBackup starts to copy it + and until the backup is completed + using the :option:`--lock-ddl-per-table` option. + + .. note:: + + As of *Percona XtraBackup* 8.0.15, the `--lock-ddl-per-table` option is deprecated. + Use the `--lock-ddl` option. + +.. 8.0 replace:: '8.0' +.. seealso:: + + :ref:`lock_redesign` diff --git a/storage/innobase/xtrabackup/doc/source/glossary.rst b/storage/innobase/xtrabackup/doc/source/glossary.rst new file mode 100644 index 000000000000..e7f13566bbc5 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/glossary.rst @@ -0,0 +1,210 @@ +========== + Glossary +========== + +.. glossary:: + + UUID + Universally Unique IDentifier which uniquely identifies the state and the + sequence of changes node undergoes. 128-bit UUID is a classic DCE UUID + Version 1 (based on current time and MAC address). Although in theory this + UUID could be generated based on the real MAC-address, in the Galera it is + always (without exception) based on the generated pseudo-random addresses + ("locally administered" bit in the node address (in the UUID structure) is + always equal to unity). + + Complete structure of the 128-bit UUID field and explanation for its + generation are as follows: + + ===== ==== ======= ===================================================== + From To Length Content + ===== ==== ======= ===================================================== + 0 31 32 Bits 0-31 of Coordinated Universal Time (UTC) as a + count of 100-nanosecond intervals since 00:00:00.00, + 15 October 1582, encoded as big-endian 32-bit number. + 32 47 16 Bits 32-47 of UTC as a count of 100-nanosecond + intervals since 00:00:00.00, 15 October 1582, encoded + as big-endian 16-bit number. + 48 59 12 Bits 48-59 of UTC as a count of 100-nanosecond + intervals since 00:00:00.00, 15 October 1582, encoded + as big-endian 16-bit number. + 60 63 4 UUID version number: always equal to 1 (DCE UUID). + 64 69 6 most-significants bits of random number, which + generated from the server process PID and Coordinated + Universal Time (UTC) as a count of 100-nanosecond + intervals since 00:00:00.00, 15 October 1582. + 70 71 2 UID variant: always equal to binary 10 (DCE variant). + 72 79 8 8 least-significant bits of random number, which + generated from the server process PID and Coordinated + Universal Time (UTC) as a count of 100-nanosecond + intervals since 00:00:00.00, 15 October 1582. + 80 80 1 Random bit ("unique node identifier"). + 81 81 1 Always equal to the one ("locally administered MAC + address"). + 82 127 46 Random bits ("unique node identifier"): readed from + the :file:`/dev/urandom` or (if :file:`/dev/urandom` + is unavailable) generated based on the server process + PID, current time and bits of the default "zero node + identifier" (entropy data). + ===== ==== ======= ===================================================== + + LSN + Each InnoDB page (usually 16kb in size) contains a log sequence number, or + LSN. The LSN is the system version number for the entire database. Each + page's LSN shows how recently it was changed. + + innodb_file_per_table + By default, InnoDB creates tables and indexes in a `file-per-tablespace `__. If the ``innodb_file_per_table`` variable is disabled, you can enable the variable in your configuration file: + + .. code-block:: text + + [mysqld] + innodb_file_per_table + + or start the server with ``--innodb_file_per_table``. + + innodb_expand_import + This feature of *Percona Server for MySQL* implements the ability to import + arbitrary :term:`.ibd` files exported using the *Percona XtraBackup* + :option:`--export` option. + + See the `full documentation + `_ + for more information. + + innodb_data_home_dir + The directory (relative to :term:`datadir`) where the database server + stores the files in a shared tablespace setup. This option does not affect + the location of :term:`innodb_file_per_table`. For example: + + .. code-block:: text + + [mysqld] + innodb_data_home_dir = ./ + + innodb_data_file_path + Specifies the names, sizes and location of shared tablespace files: + + .. code-block:: text + + [mysqld] + innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend + + innodb_log_group_home_dir + Specifies the location of the *InnoDB* log files: + + .. code-block:: text + + [mysqld] + innodb_log_group_home=/var/lib/mysql + + innodb_buffer_pool_size + The size in bytes of the memory buffer to cache data and indexes of + *InnoDB*'s tables. This aims to reduce disk access to provide better + performance. By default: + + .. code-block:: text + + [mysqld] + innodb_buffer_pool_size=8MB + + InnoDB + Storage engine which provides ACID-compliant transactions and foreign + key support, among others improvements over :term:`MyISAM`. It is the + default engine for *MySQL* as of the 8.0 series. + + MyISAM + Previous default storage engine for *MySQL* for versions prior to 5.5. It + doesn't fully support transactions but in some scenarios may be faster + than :term:`InnoDB`. Each table is stored on disk in 3 files: + :term:`.frm`, :term:`.MYD`, :term:`.MYI`. + + XtraDB + *Percona XtraDB* is an enhanced version of the InnoDB storage engine, + designed to better scale on modern hardware, and including a variety of + other features useful in high performance environments. It is fully + backwards compatible, and so can be used as a drop-in replacement for + standard InnoDB. More information `here + `_. + + my.cnf + This file refers to the database server's main configuration file. Most + Linux distributions place it as :file:`/etc/mysql/my.cnf` or + :file:`/etc/my.cnf`, but the location and name depends on the particular + installation. Note that this is not the only way of configuring the + server, some systems does not have one even and rely on the command + options to start the server and its defaults values. + + datadir + The directory in which the database server stores its databases. Most Linux + distribution use :file:`/var/lib/mysql` by default. + + xbcrypt + To support encryption and decryption of the backups, a new tool xbcrypt + was introduced to *Percona XtraBackup*. This utility has been modeled + after The xbstream binary to perform encryption and decryption outside of + *Percona XtraBackup*. + + xbstream + To support simultaneous compression and streaming, *Percona XtraBackup* uses the + xbstream format. For more information see :option:`--stream` + + ibdata + Default prefix for tablespace files, e.g. :file:`ibdata1` is a 10MB + auto-extensible file that *MySQL* creates for the shared tablespace by + default. + + .frm + For each table, the server will create a file with the ``.frm`` extension + containing the table definition (for all storage engines). + + .ibd + On a multiple tablespace setup (:term:`innodb_file_per_table` enabled), + *MySQL* will store each newly created table on a file with a ``.ibd`` + extension. + + .MYD + Each *MyISAM* table has ``.MYD`` (MYData) file which contains the data on + it. + + .MYI + Each *MyISAM* table has ``.MYI`` (MYIndex) file which contains the table's + indexes. + + .exp + Files with the ``.exp`` extension are created by *Percona XtraBackup* per + each *InnoDB* tablespace when the :option:`--export` option is + used on prepare. These files can be used to import those tablespaces on + *Percona Server for MySQL* 5.5 or lower versions, see :doc:`restoring individual + tables `". + + .MRG + Each table using the :program:`MERGE` storage engine, besides of a + :term:`.frm` file, will have :term:`.MRG` file containing the names of the + *MyISAM* tables associated with it. + + .TRG + File containing the Triggers associated to a table, e.g. + `:file:`mytable.TRG`. With the :term:`.TRN` file, they represent all the + Trigger definitions. + + .TRN + File containing the Triggers' Names associated to a table, e.g. + `:file:`mytable.TRN`. With the :term:`.TRG` file, they represent all the + Trigger definitions. + + .CSM + Each table with the :program:`CSV Storage Engine` has ``.CSM`` file which + contains the metadata of it. + + .CSV + Each table with the :program:`CSV Storage` engine has ``.CSV`` file which + contains the data of it (which is a standard Comma Separated Value file). + + .opt + *MySQL* stores options of a database (like charset) in a file with a + :file:`.opt` extension in the database directory. + + .par + Each partitioned table has .par file which contains metadata about the + partitions. diff --git a/storage/innobase/xtrabackup/doc/source/how-tos.rst b/storage/innobase/xtrabackup/doc/source/how-tos.rst new file mode 100644 index 000000000000..3680d48a8f99 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/how-tos.rst @@ -0,0 +1,65 @@ +=================== +How-tos and Recipes +=================== + +.. _recipes-xbk: + +Recipes for *xtrabackup* +======================== + +.. toctree:: + :maxdepth: 1 + + howtos/recipes_xbk_full + howtos/recipes_xbk_inc + howtos/recipes_xbk_stream + howtos/recipes_xbk_compressed + howtos/recipes_xbk_partition + +.. _howtos: + +How-Tos +======= + +.. toctree:: + :maxdepth: 1 + + howtos/permissions + howtos/setting_up_replication + howtos/backup_verification + howtos/recipes_ibkx_gtid + + + + +Assumptions in this section +=========================== + +Most of the times, the context will make the recipe or tutorial understandable. +To assure that, a list of the assumptions, names and "things" that will appear +in this section is given. At the beginning of each recipe or tutorial they will +be specified in order to make it quicker and more practical. + +``HOST`` + + A system with a *MySQL*-based server installed, configured and running. We + will assume the following about this system: + + * the MySQL server is able to :doc:`communicate with others by the + standard TCP/IP port `; + + * a SSH server is installed and configured - see :doc:`here + ` if it is not; + + * you have an user account in the system with the appropriate + :doc:`permissions ` and + + * you have a MySQL's user account with appropriate :ref:`privileges`. + +``USER`` + An user account in the system with shell access and appropriate permissions + for the task. A guide for checking them is :doc:`here `. + +``DB-USER`` + An user account in the database server with appropriate privileges for the + task. A guide for checking them is :doc:`here `. diff --git a/storage/innobase/xtrabackup/doc/source/how_xtrabackup_works.rst b/storage/innobase/xtrabackup/doc/source/how_xtrabackup_works.rst new file mode 100644 index 000000000000..280985eef96a --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/how_xtrabackup_works.rst @@ -0,0 +1,127 @@ +.. _how_xtrabackup_works: + +================================================================================ +How *Percona XtraBackup* Works +================================================================================ + +*Percona XtraBackup* is based on :term:`InnoDB`'s crash-recovery functionality. +It copies your *InnoDB* data files, which results in data that is internally +inconsistent; but then it performs crash recovery on the files to make them a +consistent, usable database again. + +This works because *InnoDB* maintains a redo log, also called the transaction +log. This contains a record of every change to InnoDB data. When *InnoDB* +starts, it inspects the data files and the transaction log, and performs two +steps. It applies committed transaction log entries to the data files, and it +performs an undo operation on any transactions that modified data but did not +commit. + +*Percona XtraBackup* works by remembering the log sequence number (:term:`LSN`) +when it starts, and then copying away the data files. It takes some time to do +this, so if the files are changing, then they reflect the state of the database +at different points in time. At the same time, *Percona XtraBackup* runs a +background process that watches the transaction log files, and copies changes +from it. *Percona XtraBackup* needs to do this continually because the +transaction logs are written in a round-robin fashion, and can be reused after a +while. *Percona XtraBackup* needs the transaction log records for every change +to the data files since it began execution. + +*Percona XtraBackup* uses `Backup locks +`_ +where available as a lightweight alternative to ``FLUSH TABLES WITH READ +LOCK``. This feature is available in *Percona Server for MySQL* 5.6+. *MySQL* 8.0 allows +acquiring an instance level backup lock via the ``LOCK INSTANCE FOR BACKUP`` +statement. + +Locking is only done for *MyISAM* and other non-InnoDB tables +**after** *Percona XtraBackup* finishes backing up all InnoDB/XtraDB data and +logs. *Percona XtraBackup* uses this automatically to copy non-InnoDB data to +avoid blocking DML queries that modify *InnoDB* tables. + +.. important:: + + To use effectively either ``LOCK INSTANCE FOR BACKUP`` or ``LOCK TABLES FOR + BACKUP``, the ``BACKUP_ADMIN`` privilege is needed in order to query + ``performance_schema.log_status``. + +*xtrabackup* tries to avoid backup locks and ``FLUSH TABLES WITH READ LOCK`` +when the instance contains only InnoDB tables. In this case, *xtrabackup* +obtains binary log coordinates from ``performance_schema.log_status``. ``FLUSH +TABLES WITH READ LOCK`` is still required in MySQL 8.0 when xtrabackup is +started with the :option:`--slave-info`. The ``log_status`` table in Percona +Server for MySQL 8.0 is extended to include the relay log coordinates, so no locks are +needed even with the :option:`--slave-info` option. + +.. seealso:: + + *MySQL* Documentation: More information about ``LOCK INSTANCE FOR BACKUP`` + https://dev.mysql.com/doc/refman/8.0/en/lock-instance-for-backup.html + +When backup locks are supported by the server, *xtrabackup* first copies +*InnoDB* data, runs the ``LOCK TABLES FOR BACKUP`` and then copies the *MyISAM* +tables. Once this is done, the backup of the files will +begin. It will backup :term:`.frm`, :term:`.MRG`, :term:`.MYD`, :term:`.MYI`, :term:`.CSM`, +:term:`.CSV`, ``.sdi`` and ``.par`` files. + + + +After that *xtrabackup* will use ``LOCK BINLOG FOR BACKUP`` to block all +operations that might change either binary log position or +``Exec_Master_Log_Pos`` or ``Exec_Gtid_Set`` (i.e. source binary log coordinates +corresponding to the current SQL thread state on a replication replica) as +reported by ``SHOW MASTER/SLAVE STATUS``. *xtrabackup* will then finish copying +the REDO log files and fetch the binary log coordinates. After this is completed +*xtrabackup* will unlock the binary log and tables. + +Finally, the binary log position will be printed to ``STDERR`` and *xtrabackup* +will exit returning 0 if all went OK. + +Note that the ``STDERR`` of *xtrabackup* is not written in any file. You will +have to redirect it to a file, e.g., ``xtrabackup OPTIONS 2> backupout.log``. + +It will also create the :ref:`following files ` in the +directory of the backup. + +During the prepare phase, *Percona XtraBackup* performs crash recovery against +the copied data files, using the copied transaction log file. After this is +done, the database is ready to restore and use. + +The backed-up *MyISAM* and *InnoDB* tables will be eventually consistent with +each other, because after the prepare (recovery) process, *InnoDB*'s data is +rolled forward to the point at which the backup completed, not rolled back to +the point at which it started. This point in time matches where the ``FLUSH +TABLES WITH READ LOCK`` was taken, so the *MyISAM* data and the prepared +*InnoDB* data are in sync. + +The *xtrabackup* offers many features not mentioned in the preceding +explanation. The functionality of each tool is explained in more +detail further in this manual. In brief, though, the tools enable you +to do operations such as streaming and incremental backups with +various combinations of copying the data files, copying the log files, +and applying the logs to the data. + +.. _copy-back-xbk: + +Restoring a backup +------------------ + +To restore a backup with *xtrabackup* you can use the :option:`--copy-back` or +:option:`--move-back` options. + +*xtrabackup* will read from the :file:`my.cnf` the variables :term:`datadir`, +:term:`innodb_data_home_dir`, :term:`innodb_data_file_path`, +:term:`innodb_log_group_home_dir` and check that the directories exist. + +It will copy the *MyISAM* tables, indexes, etc. (:term:`.MRG`, :term:`.MYD`, +:term:`.MYI`, :term:`.CSM`, :term:`.CSV`, ``.sdi``, +and ``par`` files) first, *InnoDB* tables and indexes next and the log files at +last. It will preserve file's attributes when copying them, you may have to +change the files' ownership to ``mysql`` before starting the database server, as +they will be owned by the user who created the backup. + +Alternatively, the :option:`--move-back` option may be used to +restore a backup. This option is similar to :option:`--copy-back` +with the only difference that instead of copying files it moves them to their +target locations. As this option removes backup files, it must be used with +caution. It is useful in cases when there is not enough free disk space to hold +both data files and their backup copies. diff --git a/storage/innobase/xtrabackup/doc/source/howtos/backup_verification.rst b/storage/innobase/xtrabackup/doc/source/howtos/backup_verification.rst new file mode 100644 index 000000000000..9032c208478d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/backup_verification.rst @@ -0,0 +1,73 @@ +.. _backup_verification: + +==================================================== + Verifying Backups with replication and pt-checksum +==================================================== + +One way to verify if the backup is consistent is by setting up the replication and running `pt-table-checksum `_. This can be used to verify any type of backups, but before setting up replication, backup should be prepared and be able to run (this means that incremental backups should be merged to full backups, encrypted backups decrypted etc.). + +Setting up the replication +============================ + +:ref:`replication_howto` guide provides a detailed instructions on how to take the backup and set up the replication. + +For checking the backup consistency you can use either the original server where the backup was taken, or another test server created by using a different backup method (such as cold backup, mysqldump or LVM snapshots) as the source server in the replication setup. + +Using pt-table-checksum +========================= + +This tool is part of the *Percona Toolkit*. It performs an online replication consistency check by executing checksum queries on the source, which produces different results on replicas that are inconsistent with the source. + +After you confirmed that replication has been set up successfully, you can `install `_ or download *pt-table-checksum*. This example shows downloading the latest version of *pt-table-checksum*: :: + + $ wget percona.com/get/pt-table-checksum + +.. note:: + + In order for pt-table-checksum to work correctly ``libdbd-mysql-perl`` will need to be installed on *Debian/Ubuntu* systems or ``perl-DBD-MySQL`` on *RHEL/CentOS*. If you installed the *percona-toolkit* package from the Percona repositories package manager should install those libraries automatically. + +After this command has been run, *pt-table-checksum* will be downloaded to your current working directory. + +Running the *pt-table-checksum* on the source will create ``percona`` database with the ``checksums`` table which will be replicated to the replicas as well. Example of the *pt-table-checksum* will look like this: :: + + $ ./pt-table-checksum + TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE + 04-30T11:31:50 0 0 633135 8 0 5.400 exampledb.aka_name + 04-30T11:31:52 0 0 290859 1 0 2.692 exampledb.aka_title + Checksumming exampledb.user_info: 16% 02:27 remain + Checksumming exampledb.user_info: 34% 01:58 remain + Checksumming exampledb.user_info: 50% 01:29 remain + Checksumming exampledb.user_info: 68% 00:56 remain + Checksumming exampledb.user_info: 86% 00:24 remain + 04-30T11:34:38 0 0 22187768 126 0 165.216 exampledb.user_info + 04-30T11:38:09 0 0 0 1 0 0.033 mysql.time_zone_name + 04-30T11:38:09 0 0 0 1 0 0.052 mysql.time_zone_transition + 04-30T11:38:09 0 0 0 1 0 0.054 mysql.time_zone_transition_type + 04-30T11:38:09 0 0 8 1 0 0.064 mysql.user + +If all the values in the ``DIFFS`` column are 0 that means that backup is consistent with the current setup. + +In case backup wasn't consistent *pt-table-checksum* should spot the difference and point to the table that doesn't match. Following example shows adding new user on the backed up replica in order to simulate the inconsistent backup: :: + + mysql> grant usage on exampledb.* to exampledb@localhost identified by 'thisisnewpassword'; + +If we run the *pt-table-checksum* now difference should be spotted :: + + $ ./pt-table-checksum + TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE + 04-30T11:31:50 0 0 633135 8 0 5.400 exampledb.aka_name + 04-30T11:31:52 0 0 290859 1 0 2.692 exampledb.aka_title + Checksumming exampledb.user_info: 16% 02:27 remain + Checksumming exampledb.user_info: 34% 01:58 remain + Checksumming exampledb.user_info: 50% 01:29 remain + Checksumming exampledb.user_info: 68% 00:56 remain + Checksumming exampledb.user_info: 86% 00:24 remain + 04-30T11:34:38 0 0 22187768 126 0 165.216 exampledb.user_info + 04-30T11:38:09 0 0 0 1 0 0.033 mysql.time_zone_name + 04-30T11:38:09 0 0 0 1 0 0.052 mysql.time_zone_transition + 04-30T11:38:09 0 0 0 1 0 0.054 mysql.time_zone_transition_type + 04-30T11:38:09 1 0 8 1 0 0.064 mysql.user + +This output shows that source and the replica aren't in consistent state and that the difference is in the ``mysql.user`` table. + +More information on different options that pt-table-checksum provides can be found in the *pt-table-checksum* `documentation `_. diff --git a/storage/innobase/xtrabackup/doc/source/howtos/enabling_tcp.rst b/storage/innobase/xtrabackup/doc/source/howtos/enabling_tcp.rst new file mode 100644 index 000000000000..4983383ec3e2 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/enabling_tcp.rst @@ -0,0 +1,22 @@ +Enabling the server to communicate via TCP/IP +============================================== + +Most of the Linux distributions do not enable by default to accept TCP/IP connections from outside in their MySQL or Percona Server packages. + +You can check it with ``netstat`` on a shell: :: + + $ netstat -lnp | grep mysql + tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2480/mysqld + unix 2 [ ACC ] STREAM LISTENING 8101 2480/mysqld /tmp/mysql.sock + +You should check two things: + +* there is a line starting with ``tcp`` (the server is indeed accepting TCP connections) and + +* the first address (``0.0.0.0:3306`` in this example) is different than ``127.0.0.1:3306`` (the bind address is not localhost's). + +In the first case, the first place to look is the ``my.cnf`` file. If you find the option ``skip-networking``, comment it out or just delete it. Also check that *if* the variable ``bind_address`` is set, then it shouldn't be set to localhost's but to the host's IP. Then restart the MySQL server and check it again with ``netstat``. If the changes you did had no effect, then you should look at your distribution's startup scripts (like ``rc.mysqld``). You should comment out flags like ``--skip-networking`` and/or change the ``bind-address``. + +After you get the server listening to remote TCP connections properly, the last thing to do is checking that the port (3306 by default) is indeed open. Check your firewall configurations (``iptables -L``) and that you are allowing remote hosts on that port (in ``/etc/hosts.allow``). + +And we're done! We have a MySQL server running which is able to communicate with the world through TCP/IP. diff --git a/storage/innobase/xtrabackup/doc/source/howtos/permissions.rst b/storage/innobase/xtrabackup/doc/source/howtos/permissions.rst new file mode 100644 index 000000000000..7d2f347d0490 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/permissions.rst @@ -0,0 +1,54 @@ +====================================== + Privileges and Permissions for Users +====================================== + +We will be referring to *permissions* to the ability of a user to access and perform changes on the relevant parts of the host's filesystem, starting/stopping services and installing software. + +By *privileges* we refer to the abilities of a database user to perform different kinds of actions on the database server. + + +At a system level +----------------- + +There are many ways for checking the permission on a file or directory. For example, ``ls -ls /path/to/file`` or ``stat /path/to/file | grep Access`` will do the job: :: + + $ stat /etc/mysql | grep Access + Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) + Access: 2011-05-12 21:19:07.129850437 -0300 + $ ls -ld /etc/mysql/my.cnf + -rw-r--r-- 1 root root 4703 Apr 5 06:26 /etc/mysql/my.cnf + +As in this example, ``my.cnf`` is owned by ``root`` and not writable for anyone else. Assuming that you do not have ``root`` 's password, you can check what permissions you have on this types of files with ``sudo -l``: :: + + $ sudo -l + Password: + You may run the following commands on this host: + (root) /usr/bin/ + (root) NOPASSWD: /etc/init.d/mysqld + (root) NOPASSWD: /bin/vi /etc/mysql/my.cnf + (root) NOPASSWD: /usr/local/bin/top + (root) NOPASSWD: /usr/bin/ls + (root) /bin/tail + +Being able to execute with ``sudo`` scripts in ``/etc/init.d/``, ``/etc/rc.d/`` or ``/sbin/service`` is the ability to start and stop services. + +Also, If you can execute the package manager of your distribution, you can install or remove software with it. If not, having ``rwx`` permission over a directory will let you do a local installation of software by compiling it there. This is a typical situation in many hosting companies' services. + +There are other ways for managing permissions, such as using *PolicyKit*, *Extended ACLs* or *SELinux*, which may be preventing or allowing your access. You should check them in that case. + +At a database server level +-------------------------- + +To query the privileges that your database user has been granted, at a console of the server execute: :: + + mysql> SHOW GRANTS; + +or for a particular user with: :: + + mysql> SHOW GRANTS FOR 'db-user'@'host'; + +It will display the privileges using the same format as for the `GRANT statement `_. + +Note that privileges may vary across versions of the server. To list the exact list of privileges that your server support (and a brief description of them) execute: :: + + mysql> SHOW PRIVILEGES; diff --git a/storage/innobase/xtrabackup/doc/source/howtos/recipes_ibkx_gtid.rst b/storage/innobase/xtrabackup/doc/source/howtos/recipes_ibkx_gtid.rst new file mode 100644 index 000000000000..83f47dc887c7 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/recipes_ibkx_gtid.rst @@ -0,0 +1,144 @@ +.. _recipes_ibkx_gtid: + +================================================================================ +How to create a new (or repair a broken) GTID-based Replica +================================================================================ + +*MySQL* 5.6 introduced the Global Transaction ID (`GTID +`_) +support in replication. *Percona XtraBackup* automatically +stores the ``GTID`` value in the :file:`xtrabackup_binlog_info` when doing the +backup of *MySQL* and *Percona Server for MySQL* 5.7 with the ``GTID`` mode enabled. This +information can be used to create a new (or repair a broken) ``GTID``-based +replica. + + +STEP 1: Take a backup from any server on the replication environment, source or replica +========================================================================================= + +The following command takes a backup and saves it in the :file:`/data/backups/$TIMESTAMP` folder: + +.. code-block:: bash + + $ xtrabackup --backup --target-dirs=/data/backups/ + +In the destination folder, there will be a file with the name +:file:`xtrabackup_binlog_info`. This file contains both binary log coordinates and the ``GTID`` information. + +.. code-block:: bash + + $ cat xtrabackup_binlog_info + mysql-bin.000002 1232 c777888a-b6df-11e2-a604-080027635ef5:1-4 + +That information is also printed by xtrabackup after taking the backup: + +.. code-block:: text + + xtrabackup: MySQL binlog position: filename 'mysql-bin.000002', position 1232, GTID of the last change 'c777888a-b6df-11e2-a604-080027635ef5:1-4' + +STEP 2: Prepare the backup +================================================================================ + +The backup will be prepared with the following command on the Source: + +.. code-block:: console + + $ xtrabackup --prepare --target-dir=/data/backup + +You need to select the path where your snapshot has been taken, for example +``/data/backups/2013-05-07_08-33-33``. If everything is ok you should get the +same OK message. Now, the transaction logs are applied to the data files, and new +ones are created: your data files are ready to be used by the MySQL server. + +STEP 3: Move the backup to the destination server +================================================================================ + +Use :command:`rsync` or :command:`scp` to copy the data to the destination +server. If you are synchronizing the data directly to the already running replica's data +directory it is advised to stop the *MySQL* server there. + +.. code-block:: bash + + $ rsync -avprP -e ssh /path/to/backupdir/$TIMESTAMP NewSlave:/path/to/mysql/ + +After you copy the data over, make sure *MySQL* has proper permissions to access them. + +.. code-block:: bash + + $ chown mysql:mysql /path/to/mysql/datadir + +STEP 4: Configure and start replication +================================================================================ + +Set the gtid_purged variable to the ``GTID`` from +:file:`xtrabackup_binlog_info`. Then, update the information about the +source node and, finally, start the replica. Run the following commands on the replica if you are using a version before 8.0.22: + +.. code-block:: mysql + + # Using the mysql shell + > SET SESSION wsrep_on = 0; + > RESET MASTER; + > SET SESSION wsrep_on = 1; + > SET GLOBAL gtid_purged=''; + > CHANGE MASTER TO + MASTER_HOST="$masterip", + MASTER_USER="repl", + MASTER_PASSWORD="$slavepass", + MASTER_AUTO_POSITION = 1; + > START SLAVE; + +If you are using version 8.0.22 or later, use ``START REPLICA`` instead of ``START SLAVE``. ``START SLAVE`` is deprecated as of that release. If you are using version 8.0.21 or earlier, use ``START SLAVE``. + + +If you are using a version 8.0.23 or later, run the following commands: + +.. code-block:: mysql + + # Using the mysql shell + > SET SESSION wsrep_on = 0; + > RESET MASTER; + > SET SESSION wsrep_on = 1; + > SET GLOBAL gtid_purged=''; + > CHANGE REPLICATION SOURCE TO + SOURCE_HOST="$masterip", + SOURCE_USER="repl", + SOURCE_PASSWORD="$slavepass", + SOURCE_AUTO_POSITION = 1; + > START REPLICA; + + +If you are using version 8.0.23 or later, use `CHANGE_REPLICATION_SOURCE_TO and the appropriate options `__. ``CHANGE_MASTER_TO`` is deprecated as of that release. + +.. note:: + + The example above is applicable to Percona XtraDB Cluster. The ``wsrep_on`` variable + is set to `0` before resetting the source (``RESET MASTER``). The + reason is that Percona XtraDB Cluster will not allow resetting the source if + ``wsrep_on=1``. + +STEP 5: Check the replication status +================================================================================ + +The following command returns the replica status: + +.. code-block:: text + + SHOW REPLICA STATUS\G + [..] + Slave_IO_Running: Yes + Slave_SQL_Running: Yes + [...] + Retrieved_Gtid_Set: c777888a-b6df-11e2-a604-080027635ef5:5 + Executed_Gtid_Set: c777888a-b6df-11e2-a604-080027635ef5:1-5 + +.. note:: + + + The command `SHOW SLAVE STATUS `__ is deprecated. Use `SHOW REPLICA STATUS `__. + +We can see that the replica has retrieved a new transaction with number 5, so +transactions from 1 to 5 are already on this slave. + +We have created a new replica in our ``GTID`` based replication +environment. diff --git a/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_compressed.rst b/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_compressed.rst new file mode 100644 index 000000000000..217132c38d11 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_compressed.rst @@ -0,0 +1,119 @@ +.. _recipes_ibkx_compressed: + +================================================================================ +Making a Compressed Backup +================================================================================ + +In order to make a compressed backup, use the :option:`--compress` option along +with the :option:`--backup` and :option:`--target-dir` options. By default +:option:`--compress` uses the ``quicklz`` compression algorithm. + +.. code-block:: bash + + $ xtrabackup --backup --compress --target-dir=/data/backup + +You can also use the ``lz4`` compression algorithm by setting :option:``--compress`` to ``lz4``. + +.. code-block:: bash + + $ xtrabackup --backup --compress=lz4 --target-dir=/data/backup + +If you want to speed up the compression you can use the parallel +compression, which can be enabled with :option:`--compress-threads` +option. The following example uses four threads for compression. + +.. code-block:: bash + + $ xtrabackup --backup --compress --compress-threads=4 --target-dir=/data/backup + +Output should look like this :: + + ... + + [01] Compressing ./imdb/comp_cast_type.ibd to /data/backup/imdb/comp_cast_type.ibd.qp + [01] ...done + ... + 130801 11:50:24 xtrabackup: completed OK + +.. _recipe.xtrabackup.backup.preparing: + +Preparing the backup +-------------------------------------------------------------------------------- + +Before you can prepare the backup you'll need to uncompress all the files with +`qpress `_ (which is available from `Percona Software +repositories +`_). +You can use the following one-liner to uncompress all the files: + +.. code-block:: bash + + $ for bf in `find . -iname "*\.qp"`; do qpress -d $bf $(dirname $bf) && rm $bf; done + +If you used the ``lz4`` compression algorithm change this script to search for ``*.lz4`` files: + +.. code-block:: bash + + $ for bf in `find . -iname "*\.lz4"`; do lz4 -d $bf $(dirname $bf) && rm $bf; done + +You can decompress the backup by using the :option:`--decompress` option: + +.. code-block:: bash + + $ xtrabackup --decompress --target-dir=/data/backup/ + +.. seealso:: + + What is required to use the `--decompress` option effectively? + :option:`--decompress` + +When the files are uncompressed you can prepare the backup with the +:option:`--apply-log-only` option: + +.. code-block:: bash + + $ xtrabackup --apply-log-only --target-dir=/data/backup/ + +You should check for a confirmation message: :: + + 130802 02:51:02 xtrabackup: completed OK! + +Now the files in :file:`/data/backup/` is ready to be used by the server. + +.. note:: + + *Percona XtraBackup* doesn't automatically remove the compressed files. In + order to clean up the backup directory users should remove the :file:`*.qp` + files. + +.. _recipe.xtrabackup.backup.restoring: + +Restoring the backup +-------------------------------------------------------------------------------- + +Once the backup has been prepared you can use the :option:`--copy-back` to +restore the backup. + +.. code-block:: bash + + $ xtrabackup --copy-back --target-dir=/data/backup/ + +This will copy the prepared data back to its original location as defined by the +``datadir`` variable in your :term:`my.cnf`. + +After the confirmation message, you should check the file permissions after +copying the data back. + +.. code-block:: text + + 130802 02:58:44 xtrabackup: completed OK! + +You may need to adjust the file permissions. The following example demonstrates +how to do it recursively by using :program:`chown`: + +.. code-block:: bash + + $ chown -R mysql:mysql /var/lib/mysql + +Now, your :term:`data directory ` contains the restored data. You are +ready to start the server. diff --git a/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_full.rst b/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_full.rst new file mode 100644 index 000000000000..de58c1050fa2 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_full.rst @@ -0,0 +1,38 @@ +.. _xtrabackup.full: + +================================================================================ + Making a Full Backup +================================================================================ + +Backup the InnoDB data and log files located in ``/var/lib/mysql/`` to +``/data/backups/mysql/`` (destination). Then, prepare the backup files to be +ready to restore or use (make the data files consistent). + +.. rubric:: Making a backup + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backup/mysql/ + +.. rubric:: Preparing the backup twice + +.. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/backup/mysql/ + $ xtrabackup --prepare --target-dir=/data/backup/mysql/ + +.. rubric:: Success Criteria + +* The exit status of xtrabackup is 0. +* In the second :option:`--prepare` step, you should see InnoDB print messages + similar to ``Log file ./ib_logfile0 did not exist: new to be created``, + followed by a line indicating the log file was created (creating new logs is + the purpose of the second preparation). + +.. note:: + + You might want to set the :option:`--use-memory` option to a value close + to the size of your buffer pool, if you are on a dedicated server that has + enough free memory. More details :ref:`here `. + + A more detailed explanation is :ref:`here `. diff --git a/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_inc.rst b/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_inc.rst new file mode 100644 index 000000000000..4676981bbee8 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_inc.rst @@ -0,0 +1,66 @@ +================================================================================ + Making an Incremental Backup +================================================================================ + +Backup all InnoDB data and log files - located in ``/var/lib/mysql/`` - +**once**, then make two daily incremental backups in ``/data/backups/mysql/`` +(destination). Finally, prepare the backup files to be ready to restore or use. + +Create one full backup +====================== + +Making an incremental backup requires a full backup as a base:: + + xtrabackup --backup --target-dir=/data/backups/mysql/ + +It is important that you **do not run** the :option:`--prepare` command yet. + +Create two incremental backups +============================== + +Suppose the full backup is on Monday, and you will create an incremental one on Tuesday:: + + xtrabackup --backup --target-dir=/data/backups/inc/tue/ \ + --incremental-basedir=/data/backups/mysql/ + +and the same policy is applied on Wednesday:: + + xtrabackup --backup --target-dir=/data/backups/inc/wed/ \ + --incremental-basedir=/data/backups/inc/tue/ + +Prepare the base backup +======================= + +Prepare the base backup (Monday's backup):: + + xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/ + +Roll forward the base data to the first increment +================================================= + +Roll Monday's data forward to the state on Tuesday: :: + + xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/ \ + --incremental-dir=/data/backups/inc/tue/ + +Roll forward again to the second increment +========================================== + +Roll forward again to the state on Wednesday: :: + + xtrabackup --prepare --apply-log-only --target-dir=/data/backups/mysql/ \ + --incremental-dir=/data/backups/inc/wed/ + +Prepare the whole backup to be ready to use +=========================================== + +Create the new logs by preparing it:: + + xtrabackup --prepare --target-dir=/data/backups/mysql/ + +Notes +===== + +* You might want to set the :option:`--use-memory` to speed up the process if you are on a dedicated server that has enough free memory. More details :doc:`here <../xtrabackup_bin/xbk_option_reference>`. + +* A more detailed explanation is :doc:`here <../xtrabackup_bin/incremental_backups>`. diff --git a/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_partition.rst b/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_partition.rst new file mode 100644 index 000000000000..4c4772fc8aeb --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_partition.rst @@ -0,0 +1,108 @@ +================================================================================ + Backing Up and Restoring Individual Partitions +================================================================================ + +Percona XtraBackup lets you backup +individual partitions because partitions are regular tables with specially formatted names. The only +requirement for this feature is having the `innodb_file_per_table` option +enabled in the server. + +There is one caveat about using this kind of backup: you can not copy back +the prepared backup. Restoring partial backups should be done by importing the +tables. + +Creating the backup +================================================================================ + +There are three ways of specifying which part of the whole data will be backed +up: regular expressions ( --tables), enumerating the +tables in a file (--tables) or providing a list of +databases (--databases). + +The regular expression provided to this option will be matched against the fully +qualified database name and table name, in the form of +``database-name.table-name``. + +If the partition 0 is not backed up, Percona XtraBackup cannot generate a .cfg file. MySQL 8.0 stores the table metadata in partition 0. + +For example, this operation takes a back up of the partition ``p4`` from the table ``name`` located in the database ``imdb``:: + + xtrabackup --tables=^imdb[.]name#p#p4 --backup + +If partition 0 is not backed up, the following errors may occur: :: + + xtrabackup: export option not specified + xtrabackup: error: cannot find dictionary record of table imdb/name#p#p4 + + +Note that this option is passed to ``xtrabackup --tables`` and is matched +against each table of each database, the directories of each database will be +created even if they are empty. + +Preparing the backup +================================================================================ + +For preparing partial backups, the procedure is analogous to restoring +individual tables apply the logs and use `xtrabackup --export`: + +.. code-block:: bash + + xtrabackup --apply-log --export /mnt/backup/2012-08-28_10-29-09 + +You may see warnings in the output about tables that do not exist. This is +because *InnoDB*-based engines stores its data dictionary inside the tablespace +files. *xtrabackup* removes the missing tables (those that haven't been selected in the partial +backup) from the data dictionary in order to avoid future warnings or errors. + +Restoring from the backups +================================================================================ + +Restoring should be done by importing the tables in the partial backup to the +server. + +First step is to create new table in which data will be restored. + +.. code-block:: mysql + + CREATE TABLE `name_p4` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` text NOT NULL, + `imdb_index` varchar(12) DEFAULT NULL, + `imdb_id` int(11) DEFAULT NULL, + `name_pcode_cf` varchar(5) DEFAULT NULL, + `name_pcode_nf` varchar(5) DEFAULT NULL, + `surname_pcode` varchar(5) DEFAULT NULL, + PRIMARY KEY (`id`) + ) ENGINE=InnoDB AUTO_INCREMENT=2812744 DEFAULT CHARSET=utf8 + + +.. note:: + + Generate a `.cfg metadata file `__ by running ``FLUSH TABLES ... FOR EXPORT``. The command can only be run on a table, not on the individual table partitions. + The file is located in the table schema directory and is used for schema verification when importing the tablespace. + +To restore the partition from the backup, the tablespace must be discarded for +that table: + +.. code-block:: mysql + + ALTER TABLE name_p4 DISCARD TABLESPACE; + +The next step is to copy the :term:`.exp` and `ibd` files from the backup to the MySQL data directory: + +.. code-block:: bash + + cp /mnt/backup/2012-08-28_10-29-09/imdb/name#p#p4.exp /var/lib/mysql/imdb/name_p4.exp + cp /mnt/backup/2012-08-28_10-29-09/imdb/name#P#p4.ibd /var/lib/mysql/imdb/name_p4.ibd + +.. note:: + + Make sure that the copied files can be accessed by the user running MySQL. + +The last step is to import the tablespace: + +.. code-block:: mysql + + ALTER TABLE name_p4 IMPORT TABLESPACE; + + diff --git a/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_stream.rst b/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_stream.rst new file mode 100644 index 000000000000..169d5ad431ca --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/recipes_xbk_stream.rst @@ -0,0 +1,21 @@ +.. _pxb.recipe.backup.streaming: + +================================================================================ +Make a Streaming Backup +================================================================================ + +Stream mode sends the backup to ``STDOUT`` in the ``xbstream`` format instead of +copying it to the directory named by the first argument. You can pipe the output +to a local file, or, across the network, to another server. + +To extract the resulting ``xbstream`` file, you **must** use the ``xbstream`` +utility: ``xbstream -x < backup.xbstream``. + +.. rubric:: Examples of Using ``xbstream`` + +.. include:: ../.res/contents/example.xbstream.txt + +.. seealso:: + + More information about streaming and compressing backups + Section :ref:`pxb.xtrabackup.streaming` diff --git a/storage/innobase/xtrabackup/doc/source/howtos/setting_up_replication.rst b/storage/innobase/xtrabackup/doc/source/howtos/setting_up_replication.rst new file mode 100644 index 000000000000..2c52e14f9812 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/setting_up_replication.rst @@ -0,0 +1,291 @@ +.. _replication_howto: + +=========================================================================================== + How to setup a replica for replication in 6 simple steps with Percona XtraBackup +=========================================================================================== + +Data is, by far, the most valuable part of a system. Having a backup done +systematically and available for a rapid recovery in case of failure is +admittedly essential to a system. However, it is not common practice because of +its costs, infrastructure needed or even the boredom associated to the +task. Percona XtraBackup is designed to solve this problem. + +You can have almost real-time backups in 6 simple steps by setting up a +replication environment with Percona XtraBackup. + +All the things you will need +============================= + +Setting up a replica for replication with *Percona XtraBackup* is a +straightforward procedure. In order to keep it simple, here is a list of the +things you need to follow the steps without hassles: + +``Source`` + A system with a *MySQL*-based server installed, configured and running. This + system will be called ``Source``, as it is where your data is stored and + the one to be replicated. We will assume the following about this system: + + * the *MySQL* server is able to communicate with others by the standard TCP/IP port; + + * the *SSH* server is installed and configured; + + * you have a user account in the system with the appropriate permissions; + + * you have a MySQL's user account with appropriate privileges. + + * server has binlogs enabled and server-id set up to 1. + + +``Replica`` + Another system, with a *MySQL*-based server installed on it. We + will refer to this machine as ``Replica`` and we will assume the same things + we did about ``Source``, except that the server-id on ``Replica`` is 2. + +``Percona XtraBackup`` + The backup tool we will use. It should be installed in both computers for convenience. + +.. note:: + + It is not recommended to mix MySQL variants (Percona Server, MySQL) in your + replication setup. This may produce incorrect :file:`xtrabackup_slave_info` + file when adding a new replica. + +STEP 1: Make a backup on the ``Source`` and prepare it +======================================================= + +At the ``Source``, issue the following to a shell: + +.. code-block:: console + + $ xtrabackup --backup --user=yourDBuser --password=MaGiCdB1 --target-dir=/path/to/backupdir + +After this is finished you should get: + +.. code-block:: console + + xtrabackup: completed OK! + +This will make a copy of your *MySQL* data dir +to the :file:`/path/to/backupdir` directory. +You have told *Percona XtraBackup* to connect to the database server +using your database user and password, +and do a hot backup of all your data in it +(all *MyISAM*, *InnoDB* tables and indexes in them). + +In order for snapshot to be consistent you need to prepare the data on the source: + +.. code-block:: console + + $ xtrabackup --user=yourDBuser --password=MaGiCdB1 \ + --prepare --target-dir=/path/to/backupdir + +You need to select path where your snapshot has been taken. +If everything is ok you should get the same OK message. +Now the transaction logs are applied to the data files, +and new ones are created: +your data files are ready to be used by the MySQL server. + +*Percona XtraBackup* knows where your data is by reading your :term:`my.cnf`. +If you have your configuration file in a non-standard place, +you should use the flag :option:`--defaults-file` ``=/location/of/my.cnf``. + +If you want to skip writing the user name and password +every time you want to access *MySQL*, +you can set it up in :file:`.mylogin.cnf` as follows:: + + mysql_config_editor set --login-path=client --host=localhost --user=root --password + +For more information, see `MySQL Configuration Utility `. + +This is will give you root access to MySQL. + +STEP 2: Copy backed up data to the Replica +============================================ + +On the Source, use rsync or scp to copy the data from the Source to the Replica. If you are syncing the data directly to replica's data directory, we recommend that you stop the mysqld there. + +.. code-block:: console + + $ rsync -avpP -e ssh /path/to/backupdir Replica:/path/to/mysql/ + +After data has been copied, you can back up the original or previously installed *MySQL* :term:`datadir` (**NOTE**: Make sure mysqld is shut down before you move the contents of its datadir, or move the snapshot into its datadir.). Run the following commands on the Replica: + +.. code-block:: console + + $ mv /path/to/mysql/datadir /path/to/mysql/datadir_bak + +and move the snapshot from the ``Source`` in its place: + +.. code-block:: console + + $ xtrabackup --move-back --target-dir=/path/to/mysql/backupdir + +After you copy data over, make sure the Replica *MySQL* has the proper permissions to access them. + +.. code-block:: console + + $ chown mysql:mysql /path/to/mysql/datadir + +If the ibdata and iblog files are located in directories outside of the datadir, you must put these files in their proper place after the logs have been applied. + +STEP 3: Configure the Source's MySQL server +============================================ + +On the source, run the following command to add the appropriate grant. This grant allows the replica to be able to connect to source: + +.. code-block:: mysql + + > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'$replicaip' + IDENTIFIED BY '$replicapass'; + +Also make sure that firewall rules are correct and that the ``Replica`` can connect to the ``Source``. Run the following command on the Replica to test that you can run the mysql client on ``Replica``, connect to the ``Source``, and authenticate. :: + + $ mysql --host=Source --user=repl --password=$replicapass + +Verify the privileges. :: + + mysql> SHOW GRANTS; + +STEP 4: Configure the Replica's MySQL server +============================================= + +Copy the :term:`my.cnf` file from the ``Source`` to the ``Replica``: + +.. code-block:: console + + $ scp user@Source:/etc/mysql/my.cnf /etc/mysql/my.cnf + +and change the following options in /etc/mysql/my.cnf: + +.. code-block:: console + + server-id=2 + +and start/restart `mysqld` on the ``Replica``. + +In case you're using init script on Debian-based system to start mysqld, be sure that the password for ``debian-sys-maint`` user has been updated and it's the same as that user's password on the ``Source``. Password can be seen and updated in :file:`/etc/mysql/debian.cnf`. + + +STEP 5: Start the replication +============================== + +On the ``Replica``, review the content of the file :file:`xtrabackup_binlog_info`, it will be something like: + +.. code-block:: console + + $ cat /var/lib/mysql/xtrabackup_binlog_info + Source-bin.000001 481 + +If you are using version 8.0.23 or later, on the ``Replica``, execute the `CHANGE_REPLICATION_SOURCE_TO and the appropriate options `__ on a MySQL console. ``CHANGE_MASTER_TO`` is deprecated as of that release. Use the user name and password you created in STEP 3. + +If you are using a version before 8.0.23, on the ``Replica``, execute the ``CHANGE MASTER`` statement on a MySQL console and use the username and password you've set up in STEP 3: + +.. code-block:: mysql + + CHANGE REPLICATION SOURCE TO + SOURCE_HOST='$sourceip', + SOURCE_USER='repl', + SOURCE_PASSWORD='$replicapass', + SOURCE_LOG_FILE='Source-bin.000001', + SOURCE_LOG_POS=481; + +Start the replica: + +.. code-block:: mysql + + START REPLICA; + +If you are using version 8.0.22 or later, use ``START REPLICA`` instead of ``START SLAVE``. ``START SLAVE`` is deprecated as of that release. If you are using a version before 8.0.22, use ``START SLAVE``. + +STEP 6: Check +============== + +On the ``Replica``, check that everything went OK with: + +.. code-block:: text + + SHOW REPLICA STATUS\G + +The result shows the status: + +.. code-block:: text + +... +Slave_IO_Running: Yes +Slave_SQL_Running: Yes +... +Seconds_Behind_Master: 13 +... + +Both ``IO`` and ``SQL`` threads need to be running. The ``Seconds_Behind_Master`` means the ``SQL`` currently being executed has a ``current_timestamp`` of 13 seconds ago. It is an estimation of the lag between the ``Source`` and the ``Replica``. Note that at the beginning, a high value could be shown because the ``Replica`` has to "catch up" with the ``Source``. + +Adding more replicas to the Source +=================================== + +You can use this procedure with slight variation to add new replicas to a source. We will use *Percona XtraBackup* to clone an already configured replica. We will continue using the previous scenario for convenience but we will add a ``NewReplica`` to the plot. + +At the ``Replica``, do a full backup: + +.. code-block:: console + + $ xtrabackup --user=yourDBuser --password=MaGiCiGaM \ + --backup --slave-info --target-dir=/path/to/backupdir + +By using the :option:`--slave-info` *Percona XtraBackup* creates additional file called :file:`xtrabackup_slave_info`. + +Apply the logs: + +.. code-block:: console + + $ xtrabackup --prepare --use-memory=2G --target-dir=/path/to/backupdir/ + +Copy the directory from the ``Replica`` to the ``NewReplica`` (**NOTE**: Make sure mysqld is shut down on the ``NewReplica`` before you copy the contents the snapshot into its :term:`datadir`.): + +.. code-block:: console + + rsync -avprP -e ssh /path/to/backupdir NewReplica:/path/to/mysql/datadir + +For example, to set up a new user, ``user2``, you add an additional grant on the Source: + +.. code-block:: mysql + + > GRANT REPLICATION SLAVE ON *.* TO 'user2'@'$newreplicaip' + IDENTIFIED BY '$replicapass'; + +On the ``NewReplica``, copy the configuration file from the ``Replica``: + +.. code-block:: console + + $ scp user@Replica:/etc/mysql/my.cnf /etc/mysql/my.cnf + +Make sure you change the server-id variable in :file:`/etc/mysql/my.cnf` to 3 and disable the replication on start: + +.. code-block:: console + + skip-slave-start + server-id=3 + +After setting ``server_id``, start :command:`mysqld`. + +Fetch the master_log_file and master_log_pos from the file :file:`xtrabackup_slave_info`, execute the statement for setting up the source and the log file for the `NewReplica`: + +.. code-block:: mysql + + > CHANGE MASTER TO + MASTER_HOST='$Sourceip', + MASTER_USER='repl', + MASTER_PASSWORD='$replicapass', + MASTER_LOG_FILE='Source-bin.000001', + MASTER_LOG_POS=481; + +If you are using version 8.0.23 or later, use `CHANGE_REPLICATION_SOURCE_TO and the appropriate options `__. ``CHANGE_MASTER_TO`` is deprecated as of that version. In versions before 8.0.23, use ``CHANGE MASTER TO``. + +and start the replica: + +.. code-block:: mysql + + > START SLAVE; + +If you are using version 8.0.22 or later, use ``START REPLICA`` instead of ``START SLAVE``. ``START SLAVE`` is deprecated as of that release. If you are using a version before 8.0.22 use ``START SLAVE``. + +If both IO and SQL threads are running when you check the ``NewReplica``, server is replicating the ``Source``. diff --git a/storage/innobase/xtrabackup/doc/source/howtos/ssh_server.rst b/storage/innobase/xtrabackup/doc/source/howtos/ssh_server.rst new file mode 100644 index 000000000000..951dc44714f7 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/howtos/ssh_server.rst @@ -0,0 +1,25 @@ +========================================= + Installing and configuring a SSH server +========================================= + +Many Linux distributions only install the ssh client by default. If you don't have the ssh server installed already, the easiest way of doing it is by using your distribution's packaging system: :: + + ubuntu$ sudo apt install openssh-server + archlinux$ sudo pacman -S openssh + +You may need to take a look at your distribution's documentation or search for a tutorial on the internet to configure it if you haven't done it before. + + +Some links of them are: + +* Debian - http://wiki.debian.org/SSH + +* Ubuntu - https://help.ubuntu.com/10.04/serverguide/C/openssh-server.html + +* Archlinux - https://wiki.archlinux.org/index.php/SSH + +* Fedora - http://docs.fedoraproject.org/en-US/Fedora/12/html/Deployment_Guide/s1-openssh-server-config.html + +* CentOS - http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-openssh-server-config.html + +* RHEL - http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/ch-OpenSSH.html diff --git a/storage/innobase/xtrabackup/doc/source/index.rst b/storage/innobase/xtrabackup/doc/source/index.rst new file mode 100644 index 000000000000..3f730ac0c72a --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/index.rst @@ -0,0 +1,213 @@ +.. Percona XtraBackup documentation master file, created by + sphinx-quickstart on Fri May 6 01:04:39 2011. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +==================================== + Percona XtraBackup - Documentation +==================================== + +*Percona XtraBackup* is an open-source hot backup utility for +*MySQL* - based servers that doesn't lock your database during the +backup. + +Whether it is a 24x7 highly loaded server or a low-transaction-volume +environment, *Percona XtraBackup* is designed to make backups a seamless +procedure without disrupting the performance of the server in a production +environment. `Commercial support contracts are available +`_. + +*Percona XtraBackup* can back up data from *InnoDB*, *XtraDB*, +*MyISAM*, and MyRocks tables on *MySQL* 8.0 servers as well as *Percona Server for MySQL* +with *XtraDB*, *Percona Server for MySQL* 8.0, and *Percona XtraDB Cluster* 8.0. + +.. include:: .res/contents/important.storage-engine.txt + +.. include:: .res/contents/text.pxb.8-0.txt + +For a high-level overview of many of its advanced features, including +a feature comparison, please see :doc:`intro`. + + +Introduction +============ + +.. toctree:: + :maxdepth: 1 + :glob: + + intro + how_xtrabackup_works + +Installation +============ + +.. toctree:: + :maxdepth: 1 + :glob: + + installation/apt_repo + installation/yum_repo + installation/binary-tarball + installation/compiling_xtrabackup + +Run in Docker +===================== + +.. toctree:: + :maxdepth: 1 + :glob: + + installation/docker + +How Percona XtraBackup works +================================== + +.. toctree:: + :maxdepth: 1 + :glob: + + xtrabackup_bin/implementation_details + using_xtrabackup/privileges + using_xtrabackup/configuring + using_xtrabackup/comparison + xtrabackup_bin/xtrabackup_exit_codes + + +Backup Scenarios +================ + +.. toctree:: + :maxdepth: 1 + :glob: + + backup_scenarios/full_backup + backup_scenarios/incremental_backup + backup_scenarios/compressed_backup + xtrabackup_bin/partial_backups + +User's Manual +============= + +.. toctree:: + :maxdepth: 2 + :glob: + + manual + +Advanced Features +================= + +.. toctree:: + :maxdepth: 1 + :glob: + + advanced/throttling_backups + advanced/encrypted_innodb_tablespace_backups + xtrabackup_bin/backup.encrypting + xtrabackup_bin/lru_dump + xtrabackup_bin/point-in-time-recovery + xtrabackup_bin/working_with_binary_logs + advanced/log_enhancements + +Security +=============== + +.. toctree:: + :maxdepth: 1 + :glob: + + security/pxb-selinux + security/pxb-apparmor + +.. _aux-guides: + +Auxiliary guides +======================= + +.. toctree:: + :maxdepth: 1 + :glob: + + howtos/enabling_tcp + howtos/ssh_server + xtrabackup_bin/analyzing_table_statistics + xtrabackup_bin/flush-tables-with-read-lock + advanced/locks + advanced/page_tracking + +xbcloud Binary +================== + +.. toctree:: + :maxdepth: 1 + :glob: + + xbcloud/xbcloud + xbcloud/xbcloud_swift + xbcloud/xbcloud_s3 + xbcloud/xbcloud_minio + xbcloud/xbcloud_gcs + xbcloud/xbcloud_exbackoff + xbcloud/xbcloud_azure + +Tutorials, Recipes, How-tos +=========================== + +.. * :ref:`recipes-ibk` + +.. toctree:: + :maxdepth: 2 + :hidden: + + how-tos + +* :ref:`recipes-xbk` +* :ref:`howtos` + + + +Release notes +============= + +.. toctree:: + :maxdepth: 1 + :glob: + + release-notes + +Error Message Descriptions +============================= + +.. toctree:: + :maxdepth: 1 + :glob: + + em/instant + +References +========== + +.. known_issues + +.. toctree:: + :maxdepth: 1 + :glob: + + xtrabackup_bin/xbk_option_reference + xbcrypt/xbcrypt + xbstream/xbstream + faq + glossary + xtrabackup-files + trademark-policy + Version checking + +Indices and tables +================== + +* :ref:`genindex` + +* :ref:`search` + + diff --git a/storage/innobase/xtrabackup/doc/source/installation/apt_repo.rst b/storage/innobase/xtrabackup/doc/source/installation/apt_repo.rst new file mode 100644 index 000000000000..ad6ab34596ab --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/installation/apt_repo.rst @@ -0,0 +1,159 @@ +.. _apt_repo: + +========================================================== + Installing *Percona XtraBackup* on *Debian* and *Ubuntu* +========================================================== + +Ready-to-use packages are available from the *Percona XtraBackup* software +repositories and the `download page +`_. + +Specific information on the supported platforms, products, and versions is described in `Percona Release Lifecycle Overview `_. + +What's in each DEB package? +================================================================================ + +The ``percona-xtrabackup-80`` package contains the latest *Percona XtraBackup* +GA binaries and associated files. + +The ``percona-xtrabackup-dbg-80`` package contains the debug symbols for +binaries in ``percona-xtrabackup-80``. + +The ``percona-xtrabackup-test-80`` package contains the test suite for +*Percona XtraBackup*. + +The ``percona-xtrabackup`` package contains the older version of the +*Percona XtraBackup*. + +Installing *Percona XtraBackup* via *percona-release* +================================================================================ + +*Percona XtraBackup*, like many other *Percona* products, is installed +with the *percona-release* package configuration tool. + +1. Download a deb package for *percona-release* the repository packages from Percona web: + + .. code-block:: bash + + $ wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb + +#. Install the downloaded package with :program:`dpkg`. To do that, run the + following commands as root or with :program:`sudo`: :bash:`dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb` + + Once you install this package the Percona repositories should be added. You + can check the repository setup in the + :file:`/etc/apt/sources.list.d/percona-release.list` file. + +#. Enable the repository: :bash:`percona-release enable-only tools release` + + If *Percona XtraBackup* is intended to be used in combination with + the upstream MySQL Server, you only need to enable the ``tools`` + repository: :bash:`percona-release enable-only tools`. + +#. Remember to update the local cache: :bash:`apt update` + +#. After that you can install the ``percona-xtrabackup-80`` package: + + .. code-block:: bash + + $ sudo apt install percona-xtrabackup-80 + +#. In order to make compressed backups, install the ``qpress`` package: + + .. code-block:: bash + + $ sudo apt install qpress + + .. seealso:: :ref:`compressed_backup` + + .. note:: + + For AppArmor profile information, see :ref:`pxb-apparmor`. + +Apt-Pinning the packages +======================== + +In some cases you might need to "pin" the selected packages to avoid the +upgrades from the distribution repositories. Make a new file +:file:`/etc/apt/preferences.d/00percona.pref` and add the following lines in +it: + +.. code-block:: text + + Package: * + Pin: release o=Percona Development Team + Pin-Priority: 1001 + +For more information about the pinning, check the official +`debian wiki `_. + +.. _standalone_deb: + +Installing *Percona XtraBackup* using downloaded deb packages +============================================================= + +Download the packages of the desired series for your architecture from `Download Percona XtraBackup 8.0 `_. The following +example downloads *Percona XtraBackup* 8.0.26-18 release package for Ubuntu 20.04: + +.. code-block:: bash + + $ wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.26-18/binary/debian/focal/x86_64/percona-xtrabackup-80_8.0.26-18-1.focal_amd64.deb + +Install *Percona XtraBackup* by running: + +.. code-block:: bash + + $ sudo dpkg -i percona-xtrabackup-80_8.0.26-18-1.focal_amd64.deb + +.. note:: + + When installing packages manually like this, resolve all the dependencies and install missing packages yourself. + +Update the Curl utility in Debian 10 +============================================= + +The default curl version, 7.64.0, in Debian 10 has known issues when attempting to reuse an already closed connection. This issue directly affects ``xbcloud`` and users may see intermittent backup failures. + +For more details, see `curl #3750 `__ or `curl #3763 `__. + +Follow these steps to upgrade curl to version 7.74.0: + + +#. Edit the ``/etc/apt/sources.list`` to add the following: + + .. code-block:: text + + deb http://ftp.de.debian.org/debian buster-backports main + +#. Refresh the ``apt`` sources: + + .. code-block:: bash + + sudo apt update + +#. Install the version from ``buster-backports``: + + .. code-block:: bash + + $ sudo apt install curl/buster-backports + +#. Verify the version number: + + .. code-block:: bash + + $ curl --version + curl 7.74.0 (x86_64-pc-linux-gnu) libcurl/7.74.0 + +Uninstalling *Percona XtraBackup* +================================= + +To uninstall *Percona XtraBackup*, remove all the installed +packages. + +#. Remove the packages + + .. code-block:: bash + + $ sudo apt remove percona-xtrabackup-80 + + diff --git a/storage/innobase/xtrabackup/doc/source/installation/binary-tarball.rst b/storage/innobase/xtrabackup/doc/source/installation/binary-tarball.rst new file mode 100644 index 000000000000..88d1ea7b1c43 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/installation/binary-tarball.rst @@ -0,0 +1,61 @@ +.. _binary-tarball: + +======================================================== +Installing *Percona XtraBackup* from a Binary Tarball +======================================================== + +**Percona** provides binary tarballs of **Percona XtraBackup**. Binary tarballs +contain precompiled executable files, libraries, and other dependencies and are +compressed ``tar`` archives. Extract the binary tarballs to any path. + +Binary tarballs are available for `download `__ and installation. + +The following table lists the tarball types available in ``Linux - Generic``. Select the *Percona XtraBackup* 8.0 version, the software or the operating system, and the type of tarball for your installation. Binary tarballs support all distributions. + +After you have downloaded the binary tarballs, extract the tarball in the file location of your choice. + +.. important:: + + Starting with **Percona XtraBackup 8.0.28-20**, Percona no longer provides a + tarball for CentOS 6. For more information, see `Spring Cleaning: + Discontinuing RHEL 6/CentOS 6 (glibc2.12) and 32-bit Binary Builds of + Percona Software + `__ + +.. tabularcolumns:: |p{0.08\linewidth}|p{0.30\linewidth}|p{0.10\linewidth}|p{0.40\linewidth}| + +.. list-table:: + :header-rows: 1 + + * - Type + - Name + - Operating systems + - Description + * - Full + - percona-xtrabackup--Linux.x86_64.glibc2.12.tar.gz + - Built for CentOS 6 + - Contains binary files, libraries, test files, and debug symbols + * - Minimal + - percona-xtrabackup--Linux.x86_64.glibc2.12-minimal.tar.gz + - Built for CentOS 6 + - Contains binary files, and libraries but does not include test files, or + debug symbols + * - Full + - percona-xtrabackup--Linux.x86_64.glibc2.17.tar.gz + - Compatible with any operating system except for CentOS 6 + - Contains binary files, libraries, test files, and debug symbols + * - Minimal + - percona-xtrabackup--Linux.x86_64.glibc2.17-minimal.tar.gz + - Compatible with any operating system except for CentOS 6 + - Contains binary files, and libraries but does not include test files, or + debug symbols + + + +Selecting a different software, such as Ubuntu 20.04 (Focal Fossa), provides a tarball for that operating system. You can download the packages together or separately. + +The following link is an example of downloading the full tarball for Linux/Generic: + +.. code-block:: bash + + $ wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.23-16/binary/tarball/percona-xtrabackup-8.0.23-16-Linux-x86_64.glibc2.17.tar.gz diff --git a/storage/innobase/xtrabackup/doc/source/installation/compiling_xtrabackup.rst b/storage/innobase/xtrabackup/doc/source/installation/compiling_xtrabackup.rst new file mode 100644 index 000000000000..905651f0987a --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/installation/compiling_xtrabackup.rst @@ -0,0 +1,232 @@ +.. _compiling_xtrabackup: + +================================================================================ +Compiling and Installing from Source Code +================================================================================ + +The source code is available from the *Percona XtraBackup Github* `project +`_. The easiest way to get the +code is by using the :command:`git clone` command. Then, switch to the release +branch that you want to install, such as **8.0**. + +.. code-block:: bash + + $ git clone https://github.com/percona/percona-xtrabackup.git + $ cd percona-xtrabackup + $ git checkout 8.0 + $ git submodule update --init --recursive + +.. _pxb.source-code.installing/prerequesite: + +Step 1: Installing prerequisites +================================================================================ + +The following packages and tools must be installed to compile *Percona XtraBackup* from source. +These might vary from system to system. + +.. important:: + + In order to build *Percona XtraBackup* v8.0 from source, you must use + `cmake` version 3. In your distribution, it may be available either as a + separate package ``cmake3`` or as ``cmake``. To check which version is + installed, run ``cmake --version`` and if it does report a version 3, install + ``cmake3`` for your system. + + .. seealso:: https://cmake.org/ + +.. rubric:: Debian or Ubuntu using ``apt`` + +.. code-block:: bash + + sudo apt install bison pkg-config cmake devscripts debconf \ + debhelper automake bison ca-certificates \ + libcurl4-openssl-dev cmake debhelper libaio-dev \ + libncurses-devlibssl-dev libtool libz-dev libgcrypt-dev libev-dev \ + lsb-release python-docutils build-essential rsync \ + libdbd-mysql-perl libnuma1 socat librtmp-dev libtinfo5 \ + qpress liblz4-tool liblz4-1 liblz4-dev vim-common + +To install the man pages, install the python3-sphinx package first: + +.. code-block:: bash + + $ sudo apt install python3-sphinx + +.. rubric:: CentOS or Red Hat using ``yum`` + +*Percona Xtrabackup* requires GCC version 5.3 or higher. If the +version of GCC installed on your system is lower then you may need to +install and enable `the Developer Toolset 7 +`_ on +``RPM``-based distributions to make sure that you use the latest GCC +compiler and development tools. Then, install ``cmake`` and other +dependencies: + +.. code-block:: bash + + $ sudo yum install cmake openssl-devel libaio libaio-devel automake autoconf \ + bison libtool ncurses-devel libgcrypt-devel libev-devel libcurl-devel zlib-devel \ + vim-common + +To install the man pages, install the python3-sphinx package first: + +.. code-block:: bash + + $ sudo yum install python3-sphinx + +.. _pxb.source-code.installing/build-pipe-line.generating: + +Step 2: Generating the build pipeline +================================================================================ + +At this step, you have ``cmake`` run the commands in the :file:`CMakeList.txt` +file to generate the build pipeline, i.e. a native build environment that will +be used to compile the source code). + +1. Change to the directory where you cloned the Percona XtraBackup repository + + .. code-block:: bash + + $ cd percona-xtrabackup + +#. Create a directory to store the compiled files and then change to that + directory: + + .. code-block:: bash + + $ mkdir build + $ cd build + +#. Run `cmake` or `cmake3`. In either case, the options you need to use are the + same. + +.. note:: + + You can build *Percona XtraBackup* with man pages but this requires + ``python-sphinx`` package which isn't available from that main repositories + for every distribution. If you installed the ``python-sphinx`` package you + need to remove the ``-DWITH_MAN_PAGES=OFF`` from previous command. + + + .. code-block:: bash + + $ cmake -DWITH_BOOST=PATH-TO-BOOST-LIBRARY -DDOWNLOAD_BOOST=ON \ + -DBUILD_CONFIG=xtrabackup_release -DWITH_MAN_PAGES=OFF -B .. + + .. admonition:: More information about parameters + + -DWITH_BOOST + For the ``-DWITH_BOOST`` parameter, specify the name of a directory to + download the boost library to. This directory will be created automatically + in your current directory. + + -B (--build) + *Percona XtraBackup* is configured to forbid generating the build pipeline for + ``make`` in the same directory where you store your sources. The ``-B`` + parameter refers to the directory that contains the source code. In + this example we use the relative path to the parent directory (..). + + .. important:: + + CMake Error at CMakeLists.txt:367 (MESSAGE): Please do not build + in-source. Out-of source builds are highly recommended: you can + have multiple builds for the same source, and there is an easy way + to do cleanup, simply remove the build directory (note that 'make + clean' or 'make distclean' does *not* work) + + You *can* force in-source build by invoking cmake with + -DFORCE_INSOURCE_BUILD=1 + + -DWITH_MAN_PAGES + To build *Percona XtraBackup* man pages, use ``ON`` or remove this + parameter from the command line (it is ``ON`` by default). + + To install the man pages, install the python3-sphinx package first. + + .. seealso:: :ref:`pxb.source-code.installing/prerequesite` + +.. _pxb.source-code.installing/compiling: + +Step 2: Compiling the source code +================================================================================ + +To compile the source code in your :file:`build` directory, use the ``make`` command. + +.. important:: + + The computer where you intend to compile *Percona XtraBackup* 8.0 must have + at least 2G of RAM available. + +1. Change to the :file:`build` directory (created at + :ref:`pxb.source-code.installing/build-pipe-line.generating`). +#. Run the ``make`` command. This command may take a long time to complete. + + .. code-block:: bash + + $ make + +.. _pxb.source-code.installing/target-system: + +Step 3: Installing on the target system +================================================================================ + +The following command installs all *Percona XtraBackup* binaries *xtrabackup* +and tests to default location on the target system: :file:`/usr/local/xtrabackup`. + +Run ``make install`` to install *Percona XtraBackup* to the default location. + +.. code-block:: bash + + $ sudo make install + +.. rubric:: Installing to a non-default location + +You may use the `DESTDIR` parameter with ``make install`` to install *Percona +XtraBackup* to another location. Make sure that the effective user is able to +write to the destination you choose. + +.. code-block:: bash + + $ sudo make DESTDIR= install + +In fact, the destination directory is determined by the installation layout +(``-DINSTALL_LAYOUT``) that ``cmake`` applies (see +:ref:`pxb.source-code.installing/build-pipe-line.generating`). In addition to +the installation directory, this parameter controls a number of other +destinations that you can adjust for your system. + +By default, this parameter is set to ``STANDALONE``, which implies the +installation directory to be :file:`/usr/local/xtrabackup`. + +.. seealso:: `MySQL Documentation: -DINSTALL_LAYOUT + `_ + +.. _pxb.source-code.installing/running: + +Step 4: Running +================================================================================ + +After *Percona XtraBackup* is installed on your system, you may run it by using +the full path to the ``xtrabackup`` command: + +.. code-block:: bash + + $ /usr/local/xtrabackup/bin/xtrabackup + +Update your PATH environment variable if you would like to use the command on +the command line directly. + +.. code-block:: bash + + $# Setting $PATH on the command line + $ PATH=$PATH:/usr/local/xtrabackup/bin/xtrabackup + + $# Run xtrabackup directly + $ xtrabackup + +Alternatively, you may consider placing a soft link (using ``ln -s``) to one of +the locations listed in your ``PATH`` environment variable. + +.. seealso:: ``man ln`` + +To view the documentation with ``man``, update the ``MANPATH`` variable. diff --git a/storage/innobase/xtrabackup/doc/source/installation/docker.rst b/storage/innobase/xtrabackup/doc/source/installation/docker.rst new file mode 100644 index 000000000000..7ae296544fd0 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/installation/docker.rst @@ -0,0 +1,124 @@ +.. _docker: + +Running Percona XtraBackup in a Docker container +******************************************************************************** + +Docker allows you to run applications in a lightweight unit called a container. + +You can run *Percona XtraBackup* in a Docker container without installing the product. All required libraries are available in +the container. Being a lightweight execution environment, Docker containers enable creating +configurations where each program runs in a separate container. You may run +*Percona Server for MySQL* in one container and *Percona XtraBackup* in another. Docker images offer a range of options. + +Create a Docker container based on a Docker image. Docker images for Percona XtraBackup +are hosted publicly on Docker Hub `here `__. + +.. code-block:: bash + + $ sudo docker create ... percona/percona-xtrabackup --name xtrabackup ... + +.. rubric:: Scope of this section + +This section demonstrates how to backup data +on a Percona Server for MySQL running in another Dockers container. + +Installing Docker +================================================================================ + +Your operating system may already provide a package for *docker*. However, +the versions of Docker provided by your operating system are likely to be +outdated. + +Use the installation instructions for your operating system available from the +Docker site to set up the latest version of *docker*. + +.. seealso:: + + Docker Documentation: + - `How to use Docker `_ + - `Installing `_ + - `Getting started `_ + +Connecting to a Percona Server for MySQL container +================================================================================ + +Percona XtraBackup works in combination with a database server. When +running a Docker container for Percona XtraBackup, you can make +backups for a database server either installed on the host machine or running +in a separate Docker container. + +To set up a database server on a host machine or in Docker +container, follow the documentation of the supported product that you +intend to use with *Percona XtraBackup*. + +.. seealso:: + + Percona Server for MySQL Documentation: + - `Installing on a host machine + `_ + - `Running in a Docker container + `_ + +.. code-block:: bash + + $ sudo docker run -d --name percona-server-mysql \ + -e MYSQL_ROOT_PASSWORD=root percona/percona-server:8.0 + +As soon as Percona Server for MySQL runs, add some data to it. Now, you are +ready to make backups with Percona XtraBackup. + +.. important:: + + **When running Percona XtraBackup from a container and connecting to a MySQL server container, we recommend using the --user root option in the Docker command.** + +Creating a Docker container from Percona XtraBackup image +================================================================================ + +You can create a Docker container based on Percona XtraBackup image with +either ``docker create`` or the ``docker run`` command. ``docker create`` +creates a Docker container and makes it available for starting later. + +Docker downloads the Percona XtraBackup image from the Docker Hub. If it +is not the first time you use the selected image, Docker uses the image available locally. + +.. code-block:: bash + + $ sudo docker create --name percona-xtrabackup --volumes-from percona-server-mysql \ + percona/percona-xtrabackup \ + xtrabackup --backup --datadir=/var/lib/mysql/ --target-dir=/backup \ + --user=root --password=mysql + +With parameter name you give a meaningful name to your new Docker container so +that you could easily locate it among your other containers. + +The ``volumes-from`` flag refers to Percona Server for MySQL and indicates that you +indend to use the same data as the Percona Server for MySQL container. + +Run the container with exactly the same parameters that were used when the container was created: + +.. code-block:: bash + + $ sudo docker start -ai percona-xtrabackup + +This command starts the *percona-xtrabackup* container, attaches to its +input/output streams, and opens an interactive shell. + +The ``docker run`` is a shortcut command that creates a Docker container and then immediately runs it. + +.. code-block:: bash + + $ sudo docker run --name percona-xtrabackup --volumes-from percona-server-mysql \ + percona/percona-xtrabackup + xtrabackup --backup --data-dir=/var/lib/mysql --target-dir=/backup --user=root --password=mysql + +.. seealso:: + + More in Docker documentation + - `Docker volumes as persistent data storage for containers + `_ + - `More information about containers + `_ + +.. include:: ../_res/replace/proper.txt +.. include:: ../_res/replace/command.txt +.. include:: ../_res/replace/parameter.txt diff --git a/storage/innobase/xtrabackup/doc/source/installation/yum_repo.rst b/storage/innobase/xtrabackup/doc/source/installation/yum_repo.rst new file mode 100644 index 000000000000..c55963882f85 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/installation/yum_repo.rst @@ -0,0 +1,93 @@ +.. _yum_repo: + +================================================================================ +Installing *Percona XtraBackup* on *Red Hat Enterprise Linux* and *CentOS* +================================================================================ + +Ready-to-use packages are available from the *Percona XtraBackup* software +repositories and the `download page +`_. The Percona `yum` repository supports popular *RPM*-based operating systems, including the *Amazon +Linux AMI*. + +The easiest way to install the *Percona Yum* repository is to install an *RPM* +that configures `yum` and installs the `Percona GPG key +`_. + +Specific information on the supported platforms, products, and versions is described in `Percona Software and Platform Lifecycle `_. + +What's in each RPM package? +================================================================================ + +The ``percona-xtrabackup-80`` package contains the latest *Percona XtraBackup* +GA binaries and associated files. + +.. list-table:: + :header-rows: 1 + + * - Package + - Contains + * - ``percona-xtrabackup-80-debuginfo`` + - The debug symbols for binaries in ``percona-xtrabackup-80`` + * - ``percona-xtrabackup-test-80`` + - The test suite for *Percona XtraBackup* + * - ``percona-xtrabackup`` + - The older version of the *Percona XtraBackup* + +Installing *Percona XtraBackup* from Percona ``yum`` repository +=============================================================== + +1. Install the Percona yum repository by running the following command as the + ``root`` user or with :program:`sudo`: :bash:`yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm` + +#. + .. include:: ../.res/contents/instruction.repository.enabling.txt + +#. Install *Percona XtraBackup* by running: :bash:`yum install percona-xtrabackup-80` + +.. warning:: + + Make sure that you have the ``libev`` package installed before + installing *Percona XtraBackup* on CentOS 6. For this operating system, the + ``libev`` package is available from the `EPEL + `_ repositories. + +#. To be able to make compressed backups, install the ``qpress`` package: + + $ yum install qpress + + .. seealso:: :ref:`compressed_backup` + +.. _standalone_rpm: + +Installing *Percona XtraBackup* using downloaded rpm packages +================================================================================ + +Download the packages of the desired series for your architecture from the +`download page `_. The following +example downloads *Percona XtraBackup* 8.0.4 release package for *CentOS* +7: + +.. code-block:: bash + + + $ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm + +Now you can install *Percona XtraBackup* by running ``yum localinstall``: + +.. code-block:: bash + + $ yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpm + +.. note:: + + When installing packages manually like this, you'll need to make sure to + resolve all the dependencies and install missing packages yourself. + +.. _pxb.install.yum.uninstalling: + +Uninstalling *Percona XtraBackup* +================================================================================ + +To completely uninstall *Percona XtraBackup* you'll need to remove all the +installed packages: ``yum remove percona-xtrabackup`` + diff --git a/storage/innobase/xtrabackup/doc/source/intro.rst b/storage/innobase/xtrabackup/doc/source/intro.rst new file mode 100644 index 000000000000..f8d1d93bad90 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/intro.rst @@ -0,0 +1,82 @@ +.. _intro: + +========================== + About Percona XtraBackup +========================== + +*Percona XtraBackup* is the world's only open-source, free *MySQL* hot backup +software that performs non-blocking backups for *InnoDB* and *XtraDB* +databases. With *Percona XtraBackup*, you can achieve the following benefits: + +* Backups that complete quickly and reliably +* Uninterrupted transaction processing during backups +* Savings on disk space and network bandwidth +* Automatic backup verification +* Higher uptime due to faster restore time + +*Percona XtraBackup* makes *MySQL* hot backups for all versions of Percona +Server for MySQL, and *MySQL*. It performs streaming, compressed, and incremental *MySQL* +backups. + +.. important:: + + With the introduction of *Percona XtraBackup* 8.0, *Percona XtraBackup* 2.4 + will continue to support MySQL and Percona Server 5.6 and 5.7 databases. Due + to the new MySQL redo log and data dictionary formats the Percona XtraBackup + 8.0.x versions will only be compatible with MySQL 8.0.x and the upcoming + Percona Server for MySQL 8.0.x + +Percona's enterprise-grade commercial `MySQL Support +`_ contracts include support for *Percona +XtraBackup*. We recommend support for critical production deployments. Percona XtraDB Backup supports encryption. + +.. rubric:: Supported storage engines + +Percona XtraBackup works with MySQL and Percona Server. It supports +completely non-blocking backups of InnoDB, XtraDB, and MyRocks storage +engines. Fast incremental backups are supported for Percona Server with the XtraDB changed page tracking enabled. + +In addition, it can back up the following storage engines by briefly +pausing writes at the end of the backup: MyISAM and :term:`Merge <.MRG>`, including partitioned tables, triggers, and database +options. InnoDB tables are still locked while copying non-InnoDB data. + +.. important:: + + The support of the MyRocks storage engine was added in version 8.0.6. + Incremental backups on the MyRocks storage engine do not determine if an earlier full backup or incremental backup contains the same files. **Percona XtraBackup** copies all of the MyRocks files each time it takes a backup. + + Percona XtraBackup 8.0 does not support the TokuDB storage engine. + + .. seealso:: + + Percona TokuBackup + https://www.percona.com/doc/percona-server/LATEST/tokudb/toku_backup.html + + +What are the features of Percona XtraBackup? +============================================ + +Here is a short list of the Percona XtraBackup features. See the documentation +for more. + +* Create hot InnoDB backups without pausing your database +* Make incremental backups of MySQL +* Stream compressed MySQL backups to another server +* Move tables between MySQL servers on-line +* Create new MySQL replication replicas easily +* Backup MySQL without adding load to the server +* Percona XtraBackup performs throttling based on the number of IO operations per second +* Percona XtraBackup skips secondary index pages and recreates them when a compact backup is prepared +* Percona XtraBackup can export individual tables even from a full backup, regardless of the InnoDB version +* Backup locks is a lightweight alternative to ``FLUSH TABLES WITH READ LOCK`` available in Percona Server. Percona XtraBackup uses them automatically to copy non-InnoDB data to avoid blocking DML queries that modify InnoDB tables. + +.. seealso:: + + For more information, see :ref:`how_xtrabackup_works`. + + + + +.. rubric:: Additional information + +*InnoDB* tables are still locked while copying non-*InnoDB* data. diff --git a/storage/innobase/xtrabackup/doc/source/manual.rst b/storage/innobase/xtrabackup/doc/source/manual.rst new file mode 100644 index 000000000000..0f5094b473e1 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/manual.rst @@ -0,0 +1,36 @@ +.. _user-manual: + +================================== + *Percona XtraBackup* User Manual +================================== + +.. toctree:: + :maxdepth: 1 + :hidden: + + xtrabackup_bin/xtrabackup_binary + xbstream/xbstream + xbcrypt/xbcrypt + xbcloud/xbcloud + how_xtrabackup_works + +*Percona XtraBackup* is a set of the following tools: + +:doc:`xtrabackup ` + a compiled *C* binary that provides functionality to backup a whole *MySQL* + database instance with *MyISAM*, *InnoDB*, and *XtraDB* tables. + +:doc:`xbcrypt ` + utility used for encrypting and decrypting backup files. + +:doc:`xbstream ` + utility that allows streaming and extracting files to/from the + :term:`xbstream` format. + +:doc:`xbcloud ` + utility used for downloading and uploading full or part of *xbstream* + archive from/to cloud. + +After *Percona XtraBackup* 2.3 release, the recommend way to take the backup is +by using the *xtrabackup* script. More information on script options can be found +in :doc:`how to use xtrabackup `. diff --git a/storage/innobase/xtrabackup/doc/source/percona-logo-color.png b/storage/innobase/xtrabackup/doc/source/percona-logo-color.png new file mode 100644 index 0000000000000000000000000000000000000000..042dc27d8057880b959ca47cef421c629050a10f GIT binary patch literal 17550 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 literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/source/percona-logo.jpg b/storage/innobase/xtrabackup/doc/source/percona-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2828c6c41ea2d76e055434ee1c85e932e453590a GIT binary patch literal 55451 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 literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/source/percona-xtrabackup-logo.jpg b/storage/innobase/xtrabackup/doc/source/percona-xtrabackup-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6c9f9d668bba9eb313a6c84c0d944073c9067bb3 GIT binary patch literal 36163 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 literal 0 HcmV?d00001 diff --git a/storage/innobase/xtrabackup/doc/source/percona_favicon.ico b/storage/innobase/xtrabackup/doc/source/percona_favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f426064d6f505e77365a8980046b58ae465ea6b0 GIT binary patch literal 894 zcma)*y-QnR6o=2f1!I;Hp`@aNT`C2!h#-ZEi~0xX;8Hu38qlQ*ox_(f?^{iiV^YKL1IHplY4#M`^rTkf;YeS@;mQ&&USYFXmp^NlI@J9BQIe;k z(7CLs*^{Tm%esmOqlG%$X{~wSukq}gkcBW*F#!N|rgw=JOye#;bCk`Wvs@9{nXJn& zG3KUg_4yxH{sTW-un~rkj_S`kEr5%v){K&{_`^(+RM%$4oWA8TgglZOvOf$4T=hO? zRIH$;{_SdMJ{{5as}k=y@QX z_io42yoUznE;!H`sf8ibDehqUl@0$$7;OjM_CtiJ=s)`~et|G|_rHV^?kn#8c4_vU zdHc?_@HruX3u`m6bzL@kl|PazHc92cZb*umznxDZ%zZLdBC_WZ3Gv + Percona Xtrabackup 8.0.27-19.0 (2022-02-02) + Percona XtraBackup 8.0.26-18.0 (2021-09-02) + Percona Xtrabackup 8.0.25-17.0 (2021-06-03) + Percona XtraBackup 8.0.23-16.0 (2021-03-22) + Percona Xtrabackup 8.0.22-15.0 (2020-12-14) + Percona XtraBackup 8.0.14 (2020-08-31) + Percona Xtrabackup 8.0.13 (2020-06-17) + Percona XtraBackup 8.0.12 (2020-05-27) + Percona Xtrabackup 8.0.11 (2020-04-13) + Percona XtraBackup 8.0.10 (2020-03-16) + Percona Xtrabackup 8.0.9 (2019-12-16) + Percona XtraBackup 8.0.8 (2019-11-21) + Percona Xtrabackup 8.0.7 (2019-08-07) + Percona Xtrabackup 8.0.6 (2019-05-09) + Percona XtraBackup 8.0.5 (2019-03-04) + Percona Xtrabackup 8.0.4 (2018-12-10) + Percona XtraBackup 8.0-3-rc1 (2018-10-31) \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0-3-rc1.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0-3-rc1.rst new file mode 100644 index 000000000000..126875273096 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0-3-rc1.rst @@ -0,0 +1,39 @@ +================================ +Percona XtraBackup 8.0-3-rc1 +================================ + +Percona is glad to announce the release of Percona XtraBackup 8.0-3-rc1 on +October 31 2018. Downloads are available from our `download site +`_ and from :ref:`apt ` +and :ref:`yum ` repositories. + +This is a **Release Candidate** quality release and it is not intended for +production. If you want a high quality, Generally Available release, use the +current Stable version (the most recent stable version at the time of writing is +2.4.12 in the 2.4 series). + +.. rubric:: Things to Note + +- ``innobackupex`` was previously deprecated and has been removed +- Due to the new MySQL redo log and data dictionary formats the + Percona XtraBackup 8.0.x versions will only be compatible with MySQL + 8.0.x and the upcoming Percona Server for MySQL 8.0.x +- For experimental migrations from earlier database server versions, + you will need to `backup and restore and using XtraBackup 2.4 + `_ + and then use ``mysql_upgrade`` from MySQL 8.0.x + +Improvements +================================================================================ + +- :jirabug:`PXB-1655`: The ``--lock-ddl`` option is supported when backing up MySQL 8 + +Bugs Fixed +================================================================================ + +- :jirabug:`PXB-1678`: Incremental backup prepare with the ``--apply-log-only`` + option could roll back uncommitted transactions +- :jirabug:`PXB-1672`: The MTS slave without GTID could be backed up when the + ``--safe-slave-backup`` option was applied. + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.10.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.10.rst new file mode 100644 index 000000000000..3ad4b5078df6 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.10.rst @@ -0,0 +1,31 @@ +.. _rn.8-0-10: + +================================================================================ +Percona XtraBackup 8.0.10 +================================================================================ + +:Date: March 16, 2020 +`Installing Percona XtraBackup 8.0 `__ + +Downloads are available from our `download site +`_ and from +:ref:`apt ` and :ref:`yum ` repositories. + +*Percona XtraBackup* enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot +tolerate long periods of downtime. Offered free as an open source solution, it +drives down backup costs while providing unique features for *MySQL* backups. + +All *Percona* software is open-source and free. + +Bugs Fixed +================================================================================ + +- :jirabug:`PXB-1982`: The `history` table showed a wrong value for ``lock_time``. +- :jirabug:`PXB-2099`: ``copy-back`` did not move undo files to the *data directory*. +- :jirabug:`PXB-2107`: If the `undo tablespace` was created in a + directory which is a symbolic link to another directory then the + backup failed at backup stage. +- :jirabug:`PXB-2118`: Undo log file was renamed incorrectly to undo tablespace name after restore + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.11.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.11.rst new file mode 100644 index 000000000000..faec1b775fc7 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.11.rst @@ -0,0 +1,23 @@ +.. _rn.8-0-11: + +================================================================================ +Percona XtraBackup 8.0.11 +================================================================================ + +:Date: April 13, 2020 +`Installing Percona XtraBackup 8.0 `__ + +Downloads are available from our `download site +`_ and from +:ref:`apt ` and :ref:`yum ` repositories. + +Percona XtraBackup enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot +tolerate long periods of downtime. Offered free as an open source solution, it +drives down backup costs while providing unique features for *MySQL* backups. + +All *Percona* software is open-source and free. + +This release fixes security vulnerability *CVE-2020-10997*. + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.12.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.12.rst new file mode 100644 index 000000000000..09ecf0a74a30 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.12.rst @@ -0,0 +1,25 @@ +.. _PXB-8.0.12: + +================================================================================ +*Percona XtraBackup* 8.0.12 +================================================================================ + +:Date: May 27, 2020 +:Installation: `Installing Percona XtraBackup `_ + +Percona XtraBackup enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot tolerate +long periods of downtime. Offered free as an open source solution, it drives down backup +costs while providing unique features for MySQL backups. + +Percona XtraBackup 8.0.12 now supports backup and restore processing for all versions of MySQL; previous versions of Percona XtraBackup will not work with MySQL 8.0.20 and higher. + +Bugs Fixed +================================================================================ + +* :jirabug:`PXB-2133`: Correct prtype stored for DECIMAL columns in .cfg file by --export +* :jirabug:`PXB-2146`: Amazon S3 session token support added to xbcloud +* :jirabug:`PXB-2179`: Modify 'xtrabackup prepare' to shut down keyring plugin when run with --generate-transition-key +* :jirabug:`PXB-2157`: Modify 'xtrabackup --prepare' to generate cfg files for partition tables when --export is used + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.13.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.13.rst new file mode 100644 index 000000000000..6af31321f693 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.13.rst @@ -0,0 +1,27 @@ +.. _PXB-8.0.13: + +================================================================================ +*Percona XtraBackup* 8.0.13 +================================================================================ + +:Date: June 17, 2020 +:Installation: `Installing Percona XtraBackup `_ + +Percona XtraBackup enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot tolerate +long periods of downtime. Offered free as an open source solution, it drives down backup +costs while providing unique features for MySQL backups. + +Percona XtraBackup 8.0.13 supports backup and restore processing for all versions of MySQL and has been tested with the latest MySQL 8.0.20. + +Bugs Fixed +================================================================================ + +* :jirabug:`PXB-2165`: Modify xbcloud to store backups using s3 access key parameters if AWS access key env variables are set +* :jirabug:`PXB-2164`: Modify xbcloud to return the error when the backup doesn't exist in s3 bucket +* :jirabug:`PXB-2127`: Modify xbcloud to upload backups with empty database to min.io storage +* :jirabug:`PXB-2198`: Modify xbcloud delete to return the error when the backup doesn't exist in s3 bucket +* :jirabug:`PXB-2155`: Correct corruption when redo logs are encrypted using xtrabackup --backup --compress=lz4 +* :jirabug:`PXB-2166`: Modify xbcloud to check for bucket existence and return 'ok' status when domain name can be resolved + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.14.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.14.rst new file mode 100644 index 000000000000..2521171cb9d4 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.14.rst @@ -0,0 +1,36 @@ +.. _PXB-8.0.14: + +================================================================================ +*Percona XtraBackup* 8.0.14 +================================================================================ + +:Date: August 31, 2020 +:Installation: `Installing Percona XtraBackup `_ + +Percona XtraBackup enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot tolerate +long periods of downtime. Offered free as an open source solution, it drives down backup +costs while providing unique features for MySQL backups. + +Percona XtraBackup 8.0.14 supports backup and restore processing for all versions of MySQL and has been tested with the latest MySQL 8.0.21. + +Improvements +================================================================================ + +* :jirabug:`PXB-1605`: Document how to use Percona Xtrabackup with Docker +* :jirabug:`PXB-2252`: Introduce debug option to print redo log records scanned and applied + + + +Bugs Fixed +================================================================================ + +* :jirabug:`PXB-2215`: Modify Import tablespace process to correctly calculate pack_length +* :jirabug:`PXB-2114`: Document when table is ignored by full backup it is not automatically ignored for incremental backup +* :jirabug:`PXB-2255`: Modify processing to Error out if undo truncation during backup +* :jirabug:`PXB-2249`: Verify perl binary exists before completing version check +* :jirabug:`PXB-2243`: Correct processing when undo truncation happens between full backup and incremental +* :jirabug:`PXB-2238`: Provide :ref:`binary tarball` with shared libs and glibc suffix & minimal tarballs +* :jirabug:`PXB-2202`: Modify Xbcloud to display an error when xtrabackup fails to create a backup + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.22-15.0.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.22-15.0.rst new file mode 100644 index 000000000000..3f0c7f2e40ab --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.22-15.0.rst @@ -0,0 +1,45 @@ +.. _PXB-8.0.22-15.0: + +================================================================================ +*Percona XtraBackup* 8.0.22-15.0 +================================================================================ + +:Date: December 14, 2020 +:Installation: `Installing Percona XtraBackup `_ + +Percona XtraBackup enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot tolerate +long periods of downtime. Offered free as an open source solution, it drives down backup +costs while providing unique features for MySQL backups. + +.. note:: The naming structure for the releases has changed. See the `aligning Percona XtraBackup versions with Percona Server for MySQL `_ blog post for more information. + +New Features +================================================================================ + +* :jirabug:`PXB-2112`: xbcloud: support storage_class option with --storage=s3 (Thanks to user rluisr for reporting this issue) +* :jirabug:`PXB-2242`: Prevent back up if Source system (DB) version is higher then current PXB version + + + +Improvements +================================================================================ + +* :jirabug:`PXB-2254`: Redesign --lock-ddl-per-table + + + +Bugs Fixed +================================================================================ + +* :jirabug:`PXB-793`: Fix syntax error when executing --lock-ddl-per-table queries +* :jirabug:`PXB-953`: Improve stdout for the end of usage of --lock-ddl-per-table +* :jirabug:`PXB-787`: Modify scan to provide correct status when finding corrupted tablespace +* :jirabug:`PXB-2314`: Handle Disk format changes introduced in MySQL 8.0.22 release +* :jirabug:`PXB-2279`: Modify to look for prefixes in xtrabackup_tablespaces* without extensions (Thanks to user mrmainnet for reporting this issue) +* :jirabug:`PXB-2336`: Modify to check to see if first block is an all-zero block and process accordingly +* :jirabug:`PXB-2275`: Modify backup processing to add validations if an encrypted table is created +* :jirabug:`PXB-2272`: Modify regexp to consider all #sql as temporary tables +* :jirabug:`PXB-2257`: Modify --lock-ddl-per-table to properly close database connection + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.23-16.0.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.23-16.0.rst new file mode 100644 index 000000000000..e1e402f56800 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.23-16.0.rst @@ -0,0 +1,38 @@ +.. _PXB-8.0.23-16: + +================================================================================ +*Percona XtraBackup* 8.0.23-16.0 +================================================================================ + +:Date: March 22, 2021 +:Installation: `Installing Percona XtraBackup `_ + +Percona XtraBackup enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot tolerate +long periods of downtime. Offered free as an open source solution, it drives down backup +costs while providing unique features for MySQL backups. + +This release fixes the security vulnerability `CVE-2020-29488 `_ + +Improvements +================================================================================ + +* :jirabug:`PXB-2280`: Provide SELinux and AppArmor default policies +* :jirabug:`PXB-1979`: Enable --lock-ddl by default to prevent corruption of the backup + + + +Bugs Fixed +================================================================================ + +* :jirabug:`PXB-2274`: Correct restore processing when there are DML statements running during backup stage by writing the last_checkpoint and LSN from ps.log_status instead of the redo log (Thanks to user Li Biao for reporting this issue) +* :jirabug:`PXB-2430`: Correct build failure by removing the dependency of no-server-version-check with version-check (Thanks to user agarner for reporting this issue) +* :jirabug:`PXB-2415`: Add build dependencies to correct Debian/Ubuntu packages in docker (Thanks to user Matt Cole for reporting this issue) +* :jirabug:`PXB-2429`: Correct Backup failure for encrypted tablespace by skipping the encryption reset operation during the redo scan phase +* :jirabug:`PXB-2418`: Remove PROTOBUF_LITE_LIBRARY - it is not used and is not needed +* :jirabug:`PXB-2395`: Update versions for xbstream and xbcrypt +* :jirabug:`PXB-2394`: Correct spellings in xbcloud help +* :jirabug:`PXB-2357`: Correct hang in backup with redo log archive by using block number instead of checksum (checksum of redo file and archive file can be different) +* :jirabug:`PXB-2180`: Correct incremental prepare failure with logical redo by skipping the apply of logical redos (MLOG_TABLE_DYNAMIC_META) during the incremental prepare (except the last prepare). + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.25-17.0.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.25-17.0.rst new file mode 100644 index 000000000000..87cf9f7b4d11 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.25-17.0.rst @@ -0,0 +1,40 @@ +.. _8.0.25-17: + + +================================================================================ +*Percona XtraBackup* 8.0.25-17.0 +================================================================================ + +:Date: June 3, 2021 +:Installation: `Installing Percona XtraBackup `_ + +Percona XtraBackup enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot tolerate +long periods of downtime. Offered free as an open source solution, it drives down backup +costs while providing unique features for MySQL backups. + +Bugs Fixed +================================================================================ + +* :jirabug:`PXB-2442` : Backup cannot be decompressed using the AppArmor profile + +* :jirabug:`PXB-2444` : The xbcloud binary fails to upload backup with enforcing SELinux mode + +* :jirabug:`PXB-2443` : Version check fails with AppArmor profile + +* :jirabug:`PXB-2445` : Initializing the libgcrypt in xbcloud + +* :jirabug:`PXB-2455` : XtraBackup prepare fails if the checkpoint LSN is greater than the last LSN + +* :jirabug:`PXB-2473` : SELinux errors in audit logs + +* :jirabug:`PXB-1462` : Long gtid_executed breaks —history functionality + +* :jirabug:`PXB-2369` : Issues with "Installing" page in XtraBackup documentation + +* :jirabug:`PXB-2457` : Incorrect binlog names if binlog name contains periods + +* :jirabug:`PXB-2106` : Copy-back creates wrong binlog.index + + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.26-18.0.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.26-18.0.rst new file mode 100644 index 000000000000..66cd5ca46d1f --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.26-18.0.rst @@ -0,0 +1,33 @@ +.. _PXB-8.0.26-18.0: + +================================================================================ +*Percona XtraBackup* 8.0.26-18.0 +================================================================================ + +:Date: September 2, 2021 +:Installation: `Installing Percona XtraBackup `_ + +Percona XtraBackup enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot tolerate +long periods of downtime. Offered free as an open source solution, it drives down backup +costs while providing unique features for MySQL backups. + +Improvements +================================================================================ + +* :jirabug:`PXB-2477`: The xbcloud should retry on error and utilize incremental backoff (Thanks to Baptiste Mille-Mathias for reporting this issue) +* :jirabug:`PXB-2580`: With the xbcloud binary, a chunk-upload on an SSL connect error to S3 was not retried (Thanks to Tim Vaillancourt for providing the patch) +* :jirabug:`PXB-2317`: Remove the obsolete LOCKLESS binary log functionality since the ``performance_schema.log_status`` table is now used to get the log information on all the storages without locking them + + + +Bugs Fixed +================================================================================ + +* :jirabug:`PXB-2101`: The Prepare step fails due to duplicate Serialized Dictionary Information (SDI) (Thanks to Fungo Wang for reporting this issue) +* :jirabug:`PXB-1504`: The FIND_GCRYPT macro is broken (Thanks to Maxim Bublis for reporting this issue) +* :jirabug:`PXB-1961`: The Prepare step of a full backup fails for encrypted tables with a generic error +* :jirabug:`PXB-2585`: XtraBackup fails to backup archive RocksDB Write-Ahead Log (WAL) files + + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.27-19.0.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.27-19.0.rst new file mode 100644 index 000000000000..2cb6597cc47f --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.27-19.0.rst @@ -0,0 +1,48 @@ +.. _PXB-8.0.27-19: + +================================================================================ +*Percona XtraBackup* 8.0.27-19 +================================================================================ + +:Date: February 2, 2022 +:Installation: `Installing Percona XtraBackup `_ + +Percona XtraBackup enables MySQL backups without blocking user queries, making it ideal for companies with large data sets and mission-critical applications that cannot tolerate long periods of downtime. Offered free as an open source solution, it drives down backup costs while providing unique features for MySQL backups. + +Release Highlights +================================================= + +The following list contains a number of the bug fixes for *MySQL* 8.0.27, provided by Oracle, and included in Percona Server for MySQL: + +* The ``default_authentication_plugin`` is deprecated. Support for this plugin may be removed in future versions. Use the ``authentication_policy`` variable. +* The ``binary`` operator is deprecated. Support for this operator may be removed in future versions. Use ``CAST(... AS BINARY)``. +* When a parent table updated or deleted a row, this operation initiated a cascading ``SET NULL`` operation on the child table. On the child table, a virtual column value could be set to NULL instead of the value derived from the base column value. + +Find the full list of bug fixes and changes in the `MySQL 8.0.27 Release Notes `__. + +New Features +================================================================================ + +* :jirabug:`PXB-1883`: Added support for Microsoft Azure Cloud Storage in the xbcloud binary. (Thanks to Ivan for reporting this issue) + + + +Improvements +================================================================================ + +* :jirabug:`PXB-2434`: Use MySQL page tracking for incremental backup + + + +Bugs Fixed +================================================================================ + +* :jirabug:`PXB-1741`: PS startup displays errors for databases excluded during partial backup +* :jirabug:`PXB-2614`: The ``xbstream`` binary was enhanced to support sparse files on the XFS file system. +* :jirabug:`PXB-2608`: Upgrade the Vault API to V2 (Thanks to Benedito Marques Magalhaes for reporting this issue) +* :jirabug:`PXB-2543`: Fix that adds ``IB_EXPORT_CFG_VERSION_V6`` when exporting a ``.cfg`` file for a table (Thanks to Peng Gao for reporting this issue) +* :jirabug:`PXB-2465`: Fix for querying the ``ps.log_status`` when group replication channels are items on that list. XtraBackup skips the name if it matches either ``group_replication_applier``or ``group_replication_recovery``.(Thanks to Galamb Gergő for reporting this issue) +* :jirabug:`PXB-2625`: The default version of CURL in Debian Buster failed to identify a TLS HTTP2 connection as closed and attempted to reuse the connection. (Thanks to Johan Andersson for reporting this issue) + + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.28-20.0.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.28-20.0.rst new file mode 100644 index 000000000000..ef8bdae1a4a5 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.28-20.0.rst @@ -0,0 +1,47 @@ +.. _PXB-8.0.28-20: + +================================================================================ +*Percona XtraBackup* 8.0.28-20 +================================================================================ + +:Date: April 26, 2022 + +.. include:: ../../_res/replace/pxb-blurb.txt + +.. contents:: + :local: + +Release Highlights +================================================= + +The log statements structure in Percona XtraBackup has been improved. Now, the error logs have a standard structure. The uniformity of the headers makes it easier to follow an operation's progress or review the log to diagnose issues. The improved log structure is displayed in the backup, prepare, move-back/copy-back error logs. + +Each log statement has the following attributes: + +* **Timestamp** - a timestamp for when the event occurred in a UTC format. + +* **Severity** - the severity level of a statement indicates the importance of an event. + +* **ID** - this identifier is currently not used but may be used in future versions. + +* **Context** - the name of the module that issued the log statement, such as **XtraBackup**, **InnoDB**, or **Server**. + +* **Message** - a description of the event generated by the module. + +New Features +================================================= + +* :jirabug:`PXB-2670`: Improves the error logging framework in Percona XtraBackup. + +Bugs Fixed +================================================== + +* :jirabug:`PXB-1676`: The error message after creating a backup was incorrect. +* :jirabug:`PXB-2716`: Fix for a compilation error on systems without fallocate. (Thanks to user Bo98 for providing the patch to fix this issue.) +* :jirabug:`PXB-2506`: During copy back and move back operations, added a check if the backup is fully prepared. Percona XtraBackup throws an error if the backup is not prepared or was prepared with --apply-log-only. +* :jirabug:`PXB-2662`: Percona XtraBackup exited during prepare when creating an incremental backup using page tracking. +* :jirabug:`PXB-2714`: Fix for a memory leak on the keyring component. +* :jirabug:`PXB-2697`: Undefined symbols in macOS resulted in an error when linked with Percona XtraBackup 8.0.27. +* :jirabug:`PXB-2722`: Fix for when via command line, a password, passed using the -p option, was written into the backup tool_command in xtrabackup_info. + +.. include:: ../../_res/replace/useful-links.txt diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.28-21.0.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.28-21.0.rst new file mode 100644 index 000000000000..c56f6aaedb1c --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.28-21.0.rst @@ -0,0 +1,28 @@ +.. _8.0.28-21: + +================================================================================ +*Percona XtraBackup* 8.0.28-21 (2022-05-25) +================================================================================ + +.. include:: ../../_res/replace/pxb-blurb.txt + +.. contents:: + :local: + +Release Highlights +================================================= + +Percona XtraBackup adds support for the `Amazon Key Management Service (KMS) `__ component. + +New Features +================================================= + +* :jirabug:`PXB-2721`: Implements support for the Amazon Key Management Service component in Percona XtraBackup. + +Bugs Fixed +================================================== + +* :jirabug:`PXB-2761`: Fix for a compilation error in GCC 11. (Thanks to user tcoyvwac for providing the patch to fix this issue.) +* :jirabug:`PXB-2422`: The extraction of files failed when a file was located in another directory. + +.. include:: ../../_res/replace/useful-links.txt \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.29-22.0.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.29-22.0.rst new file mode 100644 index 000000000000..baeada24c192 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.29-22.0.rst @@ -0,0 +1,24 @@ +.. _8.0.29-22: + +================================================================================ +*Percona XtraBackup* 8.0.29-22 (2022-07-19) +================================================================================ + +.. include:: ../../_res/replace/pxb-blurb.txt + +.. contents:: + :local: + +Release Highlights +================================================= + +*Percona XtraBackup* 8.0.29-22 adds new redo log types to support the changes in the ``INSTANT`` algorithm behavior. *MySQL* 8.0.29 extended the support for ``ALGORITHM=INSTANT`` to allow columns to be added to any position in a table and column drops. Older versions of *Percona XtraBackup* are incompatible with *MySQL* 8.0.29 because of this new functionality. + +.. note:: + + *MySQL* 8.0.29 extended the support of the ``ALTER TABLE … DROP COLUMNS`` statement to use ``ALGORITHM=INSTANT``. These operations only modify the metadata in the data directory and do not affect the physical structure. The + ``ALGORITHM=INSTANT`` is the default setting for supported ``DDL`` operations. Prior to *MySQL* 8.0.29, an ``ALGORITHM=INSTANT`` column could only be added as the last table column. As of *MySQL* 8.0.29, the column can be added to any table position. The ability to add or drop a column in any position increases the complexity of crash recovery since the redo log does not have the logical positions from the data dictionary. The redo log contains the physical order for the table. + + *Percona Server for MySQL* 8.0.29-21 contains fixes for these issues. *Percona XtraBackup* 8.0.29 can backup and restore tables that used the ``INSTANT`` algorithm in ADD/DROP in *Percona Server* for MySQL. However, *MySQL* 8.0.29, if the server contains tables modified by INSTANT ADD/DROP, is unsafe for backups at this time. *Percona XtraBackup* detects the tables modified by ``INSTANT`` ADD/DROP and generates an error. This error lists the affected tables and provides instructions to convert the modified tables to regular tables. + +.. include:: ../../_res/replace/useful-links.txt diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.4.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.4.rst new file mode 100644 index 000000000000..22a54fed16ac --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.4.rst @@ -0,0 +1,54 @@ +.. _rn.8-0-4: + +================================================================================ +*Percona XtraBackup* 8.0.4 +================================================================================ + +*Percona* is glad to announce the release of *Percona XtraBackup* 8.0.4 on December 10, 2018. +Downloads are available from our `download site +`_ and +from :ref:`apt ` and :ref:`yum ` repositories. + +*Percona XtraBackup* enables MySQL backups without blocking user queries, making +it ideal for companies with large data sets and mission-critical applications +that cannot tolerate long periods of downtime. Offered free as an open source +solution, it drives down backup costs while providing unique features for +*MySQL* backups. + +This release of Percona Xtrabackup is a **General Availability** release ready +for use in a production environment. + +.. rubric:: Please note the following about this release: + +- The deprecated innobackupex has been removed. Use the xtrabackup command to + back up your instances: ``$ xtrabackup --backup --target-dir=/data/backup`` +- When migrating from earlier database server versions, `backup and restore and + using Percona XtraBackup 2.4 + `_ + and then use ``mysql_upgrade`` from *MySQL* 8.0.x +- If using ``yum`` or ``apt`` repositories to install *Percona XtraBackup* 8.0.4, ensure + that you have enabled the new `tools` repository. You can do this with the + :program:`percona-release enable tools release` command and then install the + `percona-xtrabackup-80` package. + +All Percona software is open-source and free. We are grateful to the community +for the invaluable contributions to *Percona XtraBackup*. We would especially +like to highlight the input of *Alexey Kopytov* who has been actively offering +improvements and submitting bug reports for *Percona XtraBackup*. + + +New Features +================================================================================ + +- *Percona XtraBackup* 8.0.4 is based on *MySQL* 8.0.13 and fully supports + Percona Server for *MySQL* 8.0 series and *MySQL* 8.0 series. + +Bugs Fixed +================================================================================ + +- :jirabug:`PXB-1699`: `xtrabackup --prepare` could fail on backups of MySQL 8.0.13 databases +- :jirabug:`PXB-1704`: `xtrabackup --prepare` could hang while performing insert buffer merge +- :jirabug:`PXB-1668`: When the `--throttle` option was used, the applied value was different from the one specified by the user (off by one error) +- :jirabug:`PXB-1679`: PXB could crash when ``ALTER TABLE ... TRUNCATE PARTITION`` command was run during a backup without locking DDL + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.5.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.5.rst new file mode 100644 index 000000000000..fd8172ec850b --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.5.rst @@ -0,0 +1,88 @@ +.. _rn.8-0-5: + +================================================================================ +*Percona XtraBackup* 8.0.5 +================================================================================ + +*Percona* is glad to announce the release of *Percona XtraBackup* 8.0.5 on March 4, 2019. +Downloads are available from our `download site +`_ and +from :ref:`apt ` and :ref:`yum ` repositories. + +Percona XtraBackup enables MySQL backups without blocking user queries, making +it ideal for companies with large data sets and mission-critical applications +that cannot tolerate long periods of downtime. Offered free as an open source +solution, it drives down backup costs while providing unique features for +*MySQL* backups. + +*Percona XtraBackup* 8.0.5 introduces the support of undo tablespaces created using +the new syntax (``CREATE UNDO TABLESPACE``) `available since MySQL 8.0.14 +`_. *Percona XtraBackup* +also supports the binary log encryption introduced in *MySQL* 8.0.14. + +Two new options were added to *xbstream*. Use the +:option:`--decompress` option with *xbstream* to decompress individual qpress +files. With the :option:`--decompress-threads` option, specify the +number of threads to apply when decompressing. Thanks to `Rauli Ikonen +`_ for this contribution. + + + +This release of *Percona XtraBackup* is a **General Availability** release ready for use +in a production environment. + +All Percona software is open-source and free. + +.. rubric:: Please note the following about this release: + +- The deprecated innobackupex has been removed. Use the xtrabackup command to + back up your instances: ``$ xtrabackup --backup --target-dir=/data/backup`` +- When migrating from earlier database server versions, `backup and restore and + using Percona XtraBackup 2.4 + `_ + and then use ``mysql_upgrade`` from *MySQL* 8.0.x +- If using ``yum`` or ``apt`` repositories to install *Percona Xtrabackup* 8.0.5, ensure + that you have enabled the new `tools` repository. You can do this with the + :program:`percona-release enable tools release` command and then install the + `percona-xtrabackup-80` package. + + +New Features +================================================================================ + +- :jirabug:`PXB-1548`: *Percona XtraBackup* enables updating the :file:`ib_buffer_pool` file + with the latest pages present in the buffer pool using the + :option:`--dump-innodb-buffer-pool` option. Thanks to Marcelo Altmann for + contribution. +- :jirabug:`PXB-1768`: Added support for undo tablespaces created with the new + *MySQL* 8.0.14 syntax. +- :jirabug:`PXB-1781`: Added support for binary log encryption introduced + in *MySQL* 8.0.14. +- :jirabug:`PXB-1797`: For *xbstream*, two new options were added. The + :option:`--decompress` option enables *xbstream* to decompress + individual qpress files. The :option:`--decompress-threads` option + controls the number of threads to apply when decompressing. Thanks to + `Rauli Ikonen `_ for this contribution. + +Bugs Fixed +================================================================================ + +- Using ``--lock-ddl-per-table`` caused the server to scan all records of + partitioned tables which could lead to the "out of memory" error. Bugs fixed + :jirabug:`PXB-1691` and :jirabug:`PXB-1698`. +- When *Percona XtraBackup* was started run with the :option:`--slave-info`, incorrect + coordinates were written to the xtrabackup_slave_info file.. Bug fixed :jirabug:`PXB-1737` +- *Percona XtraBackup* could crash at the prepare stage when making an + incremental backup if the variable ``innodb-rollback-segments`` was + changed after starting the *MySQL* Server. Bug fixed + :jirabug:`PXB-1785`. +- The full backup could fail when *Percona Server for MySQL* was started with the ``--innodb-encrypt-tables`` + parameter. Bug fixed :jirabug:`PXB-1793`. + +Other bugs fixed: +:jirabug:`PXB-1632`, +:jirabug:`PXB-1715`, +:jirabug:`PXB-1770`, +:jirabug:`PXB-1771`, +:jirabug:`PXB-1773`. + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.6.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.6.rst new file mode 100644 index 000000000000..beabe1cadc91 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.6.rst @@ -0,0 +1,66 @@ +.. _rn.8-0-6: + +================================================================================ +*Percona XtraBackup* 8.0.6 +================================================================================ + +*Percona* is glad to announce the release of *Percona XtraBackup* 8.0.6 on May 9, 2019. +Downloads are available from our `download site +`_ and +from :ref:`apt ` and :ref:`yum ` repositories. + +*Percona XtraBackup* enables MySQL backups without blocking user queries, making +it ideal for companies with large data sets and mission-critical applications +that cannot tolerate long periods of downtime. Offered free as an open source +solution, it drives down backup costs while providing unique features for +*MySQL* backups. + +In version 8.0.6, *Percona XtraBackup* introduces the support of the MyRocks +storage engine with Percona Server for MySQL version 8.0.15-6 or +higher. + +*Percona XtraBackup* 8.0.6 enables saving backups to an Amazon S3, +MinIO, and Google Cloud Storage (using interoperability mode) when +using xbcloud. The following example demonstrates how to use an Amazon +S3 storage to make a full backup: + +.. code-block:: bash + + $ xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \ + xbcloud put --storage=s3 \ + --s3-endpoint='s3.amazonaws.com' \ + --s3-access-key='YOUR-ACCESSKEYID' \ + --s3-secret-key='YOUR-SECRETACCESSKEY' \ + --s3-bucket='mysql_backups' + --parallel=10 \ + ${date -I}-full_backup + + All *Percona* software is open-source and free + +New Features +================================================================================ + +- The MyRocks storage engine is now supported with *Percona XtraBackup*. More + information in :jirabug:`PXB-1754`. +- Amazon S3 is now supported in xbcloud. More information in :jirabug:`PXB-1813`. + +Bugs Fixed +================================================================================ + +- *Percona XtraBackup* could fail to restore the undo tablespace created during or before + incremental backup. Bug fixed :jirabug:`PXB-1780`. +- A backup could fail if ``log_bin_index`` was defined in :file:`my.cnf`. Bug + fixed :jirabug:`PXB-1801`. +- When the row format was changed during the backup, xtrabackup could crash + during the incremental prepare stage. Bug fixed :jirabug:`PXB-1824`. +- During the ``prepare`` phase, *Percona XtraBackup* could freeze and never finish + execution. Bug fixed :jirabug:`PXB-1819`. +- *Percona XtraBackup* could crash during the ``prepare`` stage when making a backup of a + host running MySQL Server v8.0.16. Bug fixed :jirabug:`PXB-1839`. + +Other bugs fixed: +:jirabug:`PXB-1809`, +:jirabug:`PXB-1810`, +:jirabug:`PXB-1832`, +:jirabug:`PXB-1837`. + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.7.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.7.rst new file mode 100644 index 000000000000..49a0b4e511b6 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.7.rst @@ -0,0 +1,63 @@ +.. _rn.8-0-7: + +================================================================================ +*Percona XtraBackup* 8.0.7 +================================================================================ + +*Percona* is glad to announce the release of *Percona XtraBackup* 8.0.7 on August 7, 2019. +Downloads are available from our `download site +`_ and from +:ref:`apt ` and :ref:`yum ` repositories. + +*Percona XtraBackup* enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot +tolerate long periods of downtime. Offered free as an open source solution, it +drives down backup costs while providing unique features for *MySQL* backups. + +In release 8.0.7, *Percona XtraBackup* enables making backups of databases +that contain the `encrypted system tablespace +`_. +Encrypted `mysql` tablespace is now also supported. + +*Percona XtraBackup* 8.0.7 implements the support of the ``lz4`` compression algorithm +so that you could make compressed backups using `lz4` +(`--compress=lz4`) in addition to the default `quicklz` method. + +All *Percona* software is open-source and free. + +New Features and Improvements +================================================================================ + +- Add support of the system tablespace encryption. More information in + :jirabug:`PXB-1649`. +- Implemented the support of the `lz4` compression algorithm. More information + in :jirabug:`PXB-1857`. + +Bugs Fixed +================================================================================ + +- When the *encrypted tablespaces* feature was enabled, encrypted and compressed + tables were not usable on the joiner node (Percona XtraDB Cluster) via SST + (State Snapshot Transfer) with the `xtrabackup-v2` method. Bug fixed + :jirabug:`PXB-1867`. +- ``xbcloud`` did not update date related fields of the HTTP header when + retrying a request. Bug fixed :jirabug:`PXB-1874`. +- ``xbcloud`` did not retry to send the request after receiving the HTTP 408 + error (request timeout). Bug fixed :jirabug:`PXB-1875`. +- ``xtrabackup`` did not accept decimal fractions as values of the + ``innodb_max_dirty_pages_pct`` option. Bug fixed :jirabug:`PXB-1807`. +- If the user tried to merge an already prepared incremental backup, a + misleading error was produced without informing that incremental backups may + not be used twice. Bug fixed :jirabug:`PXB-1862`. + +**Other bugs fixed:** +:jirabug:`PXB-1493`, +:jirabug:`PXB-1557`, +:jirabug:`PXB-1887`, +:jirabug:`PXB-1870`, +:jirabug:`PXB-1879`, +:jirabug:`PXB-1901`. + +.. *Percona* replace:: Percona +.. *Percona XtraBackup* replace:: Percona XtraBackup + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.8.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.8.rst new file mode 100644 index 000000000000..3afe62e42e6d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.8.rst @@ -0,0 +1,56 @@ +.. _rn.8-0-8: + +================================================================================ +Percona XtraBackup 8.0.8 +================================================================================ + +*Percona* is glad to announce the release of Percona XtraBackup 8.0.8 on November 21, 2019. +Downloads are available from our `download site +`_ and from +:ref:`apt ` and :ref:`yum ` repositories. + +Percona XtraBackup enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot +tolerate long periods of downtime. Offered free as an open source solution, it +drives down backup costs while providing unique features for *MySQL* backups. + +All *Percona* software is open-source and free. + +New Features and Improvements +================================================================================ + +- Support log archiving feature in PXB 8.0. More information in + :jirabug:`PXB-1912` and in the `Redo Log section of MySQL documentation + `_ +- For the MyRocks storage engine, support the creation of renewable checkpoints + (controlled via :option:`--rocksdb-checkpoint-max-age` and + :option:`--rocksdb-checkpoint-max-count`) to minimize the amount of binary + logs to apply after the backup was completed. Using renewable checkpoints, + Percona XtraBackup only copies the SST files that were created after the previous + checkpoint. More information in :jirabug:`PXB-1915`. +- Two options (`–-backup-lock-timeout` and `-–backup-lock-retry-count`) were + added to enable the configuring of the timeout for acquiring metadata locks in + ``FLUSH TABLES WITH READ LOCK``, ``LOCK TABLE FOR BACKUP``, and ``LOCK BINLOG + FOR BACKUP`` statements. More information in :jirabug:`PXB-1914` + +Bugs Fixed +================================================================================ + +- An encrypted table could not be restored when ``ADD INDEX`` or ``DROP INDEX`` + commands had been run on the table. Bug fixed :jirabug:`PXB-1905` +- In some cases ``xtrabackup --prepare`` could fail to decrypt a table but + reported that the operation completed ok. Bug fixed :jirabug:`PXB-1936` +- ``xtrabackup --move-back`` did not complete successfully when the encrypted + binlog file. Bug fixed :jirabug:`PXB-1937`. +- Percona XtraBackup could crash during the prepare stage when making an incremental + backup when a multi valued index was being added or dropped for JSON + data. Bug fixed :jirabug:`PXB-1913`. + +**Other bugs fixed:** +:jirabug:`PXB-1928`, +:jirabug:`PXB-1938`, +:jirabug:`PXB-1951`, +:jirabug:`PXB-1953`, +:jirabug:`PXB-1954`. + + diff --git a/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.9.rst b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.9.rst new file mode 100644 index 000000000000..cb3ba7e848cc --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/release-notes/8.0/8.0.9.rst @@ -0,0 +1,26 @@ +.. _rn.8-0-9: + +================================================================================ +*Percona XtraBackup* 8.0.9 +================================================================================ + +*Percona* is glad to announce the release of *Percona XtraBackup* 8.0.9 on December 16, 2019. +Downloads are available from our `download site +`_ and from +:ref:`apt ` and :ref:`yum ` repositories. + +*Percona XtraBackup* enables MySQL backups without blocking user queries, making it ideal +for companies with large data sets and mission-critical applications that cannot +tolerate long periods of downtime. Offered free as an open source solution, it +drives down backup costs while providing unique features for *MySQL* backups. + +All *Percona* software is open-source and free. + +Bugs Fixed +================================================================================ + +- Sometime between December 3rd and December 10th, a change was introduced in + :abbr:`AWS (Amazon Web Services)` that caused an incompatibility with our + *Percona XtraBackup* ``xbcloud`` utility. Bug fixed :jirabug:`PXB-1978`. + + diff --git a/storage/innobase/xtrabackup/doc/source/security/pxb-apparmor.rst b/storage/innobase/xtrabackup/doc/source/security/pxb-apparmor.rst new file mode 100644 index 000000000000..e6df86a66e0d --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/security/pxb-apparmor.rst @@ -0,0 +1,59 @@ +.. _pxb-apparmor: + +============================================= +Working with AppArmor +============================================= + +The Linux Security Module implements mandatory access controls (MAC) with AppArmor. Debian and Ubuntu systems install AppArmor by default. AppArmor uses profiles which define which files and permissions are needed for application. + +*Percona XtraBackup* does not have a profile and is not confined by AppArmor. + +For a list of common AppArmor commands, see `Percona Server for MySQL - AppArmor `_ + +Develop a profile +------------------- + +Download the profile from: + +https://github.com/percona/percona-xtrabackup/tree/8.0/packaging/percona/apparmor/apparmor.d + +The following profile sections should be updated with your system information, such as location of the backup destination directory. + +.. sourcecode:: text + + # enable storing backups only in /backups directory + # /backups/** rwk, + + # enable storing backups anywhere in caller user home directory + /@{HOME}/** rwk, + + + # enable storing backups only in /backups directory + # /backups/** rwk, + + # enable storing backups anywhere in caller user home directory + /@{HOME}/** rwk, + } + + # enable storing backups only in /backups directory + # /backups/** rwk, + + # enable storing backups anywhere in caller user home directory + /@{HOME}/** rwk, + } + +Move the updated file: + +.. sourcecode:: bash + + $ sudo mv usr.sbin.xtrabackup /etc/apparmor.d/ + +Install the profile with the following command: + + .. sourcecode:: bash + + $ sudo apparmor_parser -r -T -W /etc/apparmor.d/usr.sbin.xtrabackup + +Run the backup as usual. + +No additional AppArmor-related actions are required to restore a backup. diff --git a/storage/innobase/xtrabackup/doc/source/security/pxb-selinux.rst b/storage/innobase/xtrabackup/doc/source/security/pxb-selinux.rst new file mode 100644 index 000000000000..504c442dc16e --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/security/pxb-selinux.rst @@ -0,0 +1,119 @@ +.. _pxb-selinux: + +========================================= +Working with SELinux +========================================= + +*Percona XtraBackup* is installed as an unconfined process running in an undefined domain. SELinux allows unconfined processes almost all access and the processes only use Discretionary Access Control (DAC) rules. + +You find the current state of the *Percona XtraBackup* file with the following command: + +.. sourcecode:: bash + + $ ls -Z /usr/bin | grep xtrabackup + -rwxr-xr-x. root root system_u:object_r:bin_t:s0 xtrabackup + +The SELinux context is the following: + +* user (root) + +* role (object_r) + +* type (bin_t) + +* level (s0) + +The unconfined domain supports the network-facing services, which are protected by SELinux. These domains are not exposed. In this configuration, SELinux protects against remote intrusions but local intrusions, which require local access, are not confined. + +*Percona XtraBackup* works locally. The service is not network-facing and cannot be exploited externally. The service interacts only with the local user, who provides the parameters. *Percona XtraBackup* requires access to the ``target-dir`` location. + +Confine XtraBackup +-------------------- + +You can modify your security configuration to confine *Percona XtraBackup*. The first question is where to store the backup files. The service requires read and write access to the selected location. + +You can use either of the following methods: + +* Allow *Percona XtraBackup* to write to any location. The user provides any path to the ``target-dir`` parameter. + +* Allow *Percona XtraBackup* to write to a specific location, such as /backups or the user's home directory. + +The first option opens the entire system to read and write. Select the second option to harden your security. + +Install SELinux tools +---------------------- + +To work with policies, you must install the SELinux tools. To find which package provides the ``semanage`` command and install the package. The following is an example on CentOS 7. + + .. sourcecode:: bash + + $ yum provides *bin/semanage + ... + policycoreutils-python-2.5-34.el7.x86_64 : SELinux policy core python utilities + ... + $ sudo yum install -y policycoreutils-python + +The following is an example on CentOS 8: + + .. sourcecode:: bash + + $ yum provides *bin/semanage + ... + policycoreutils-python-utils-2.8-16.1.el8.noarch : SELinux policy core python utilities + ... + $ sudo yum install -y policycoreutils-python-utils + +Create a policy +----------------- + +Use a modular approach to create an SELinux policy. Create a policy module to manage XtraBackup. You must create a ``.te`` file for type enforcement, and an optional ``.fc`` file for the file contexts. + + +Use `ps -efZ | grep xtrabackup` to verify the service is not confined by SELinux. + +Create the ``xtrabackup.fc`` file and add content. This file defines the security contexts. + + .. sourcecode:: text + + /usr/bin/xtrabackup -- gen_context(system_u:object_r:xtrabackup_exec_t,s0) + /usr/bin/xbcrypt -- gen_context(system_u:object_r:xtrabackup_exec_t,s0) + /usr/bin/xbstream -- gen_context(system_u:object_r:xtrabackup_exec_t,s0) + /usr/bin/xbcloud -- gen_context(system_u:object_r:xtrabackup_exec_t,s0) + /backups(/.*)? system_u:object_r:xtrabackup_data_t:s0 + +.. note:: If you are using the ``/backups`` directory you must have the last line. If you are storing the backups in the user's home directory, you can omit this line. + +Download the ``xtrabackup.te`` file from the following location: + +https://github.com/percona/percona-xtrabackup/tree/8.0/packaging/percona/selinx + +.. note:: In the file, the sections in bold should be modified for your system. The fc file can also be downloaded from the same location. + +Complile the policy module: + + .. sourcecode:: bash + + $ make -f /usr/share/selinux/devel/Makefile xtrabackup.pp + +Install the module: + + .. sourcecode:: bash + + $ semodule -i xtrabackup.pp + +Tag the PXB binaries with the proper SELinux tags, such as ``xtrabackup_exec_t``. + + .. sourcecode:: bash + + $ restorecon -v /usr/bin/* + +If you store your backups at ``/backups``, restore the tag in that location: + + .. sourcecode:: bash + + $ restorecon -v /backups + +.. note:: Remember to add the standard Linux DAC permissions for this directory. + +Perform the backup in the standard way. + diff --git a/storage/innobase/xtrabackup/doc/source/trademark-policy.rst b/storage/innobase/xtrabackup/doc/source/trademark-policy.rst new file mode 100644 index 000000000000..a7096e2f9535 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/trademark-policy.rst @@ -0,0 +1,69 @@ +.. _trademark-policy: + +================ +Trademark Policy +================ + +This Trademark Policy is to ensure that users of Percona-branded products or +services know that what they receive has really been developed, approved, +tested and maintained by Percona. Trademarks help to prevent confusion in the +marketplace, by distinguishing one company's or person’s products and +services from another's. + +Percona owns a number of marks, including but not limited to Percona, XtraDB, +Percona XtraDB, XtraBackup, Percona XtraBackup, Percona Server, and Percona +Live, plus the distinctive visual icons and logos associated with these marks. +Both the unregistered and registered marks of Percona are protected. + +Use of any Percona trademark in the name, URL, or other identifying +characteristic of any product, service, website, or other use is not permitted +without Percona's written permission with the following three limited +exceptions. + +*First*, you may use the appropriate Percona mark when making a nominative fair +use reference to a bona fide Percona product. + +*Second*, when Percona has released a product under a version of the GNU +General Public License ("GPL"), you may use the appropriate Percona mark when +distributing a verbatim copy of that product in accordance with the terms and +conditions of the GPL. + +*Third*, you may use the appropriate Percona mark to refer to a distribution of +GPL-released Percona software that has been modified with minor changes for +the sole purpose of allowing the software to operate on an operating system or +hardware platform for which Percona has not yet released the software, provided +that those third party changes do not affect the behavior, functionality, +features, design or performance of the software. Users who acquire this +Percona-branded software receive substantially exact implementations of the +Percona software. + +Percona reserves the right to revoke this authorization at any time in its sole +discretion. For example, if Percona believes that your modification is beyond +the scope of the limited license granted in this Policy or that your use of the +Percona mark is detrimental to Percona, Percona will revoke this authorization. +Upon revocation, you must immediately cease using the applicable Percona mark. +If you do not immediately cease using the Percona mark upon revocation, Percona +may take action to protect its rights and interests in the Percona mark. +Percona does not grant any license to use any Percona mark for any other +modified versions of Percona software; such use will require our prior written +permission. + +Neither trademark law nor any of the exceptions set forth in this Trademark +Policy permit you to truncate, modify or otherwise use any Percona mark as part +of your own brand. For example, if XYZ creates a modified version of the +Percona Server, XYZ may not brand that modification as "XYZ Percona Server" or +"Percona XYZ Server", even if that modification otherwise complies with the +third exception noted above. + +In all cases, you must comply with applicable law, the underlying license, and +this Trademark Policy, as amended from time to time. For instance, any mention +of Percona trademarks should include the full trademarked name, with proper +spelling and capitalization, along with attribution of ownership to Percona LLC +and/or its affiliates. For example, the full proper name for XtraBackup is +Percona XtraBackup. However, it is acceptable to omit the word "Percona" for +brevity on the second and subsequent uses, where such omission does not cause +confusion. + +In the event of doubt as to any of the conditions or exceptions outlined in +this Trademark Policy, please contact trademarks@percona.com for assistance and +we will do our very best to be helpful. diff --git a/storage/innobase/xtrabackup/doc/source/using_xtrabackup/comparison.rst b/storage/innobase/xtrabackup/doc/source/using_xtrabackup/comparison.rst new file mode 100644 index 000000000000..aa186cd07043 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/using_xtrabackup/comparison.rst @@ -0,0 +1,37 @@ +.. _comparison: + +Server Version and Backup Version Comparison +============================================= + +A *MySQL* change to features, such as the structure of a redo log record, can cause older versions of **Percona XtraBackup** to fail. To ensure that you can backup and restore your data, use a **Percona XtraBackup** version that is equal to or above your source server version. + +.. seealso:: :ref:`how_xtrabackup_works` + +*Percona XtraBackup* 8.0.21 adds the ``--no-server-version-check`` option. Before the backup starts, XtraBackup compares the source system version to the *Percona XtraBackup* version. If the source system version is greater than the XtraBackup version, XtraBackup stops the backup and returns an error message. This comparison prevents a failed backup or a corrupted backup due to source system changes. + +The parameter checks for the following scenarios: + +* The source system and the PXB version are the same, the backup proceeds + +* The source system is less than the PXB version, the backup proceeds + +* The source system is greater than the PXB version, and the parameter is not overridden, the backup is stopped and returns an error message + +* The source system is greater than the PXB version, and the parameter is overridden, the backup proceeds + +Explicitly adding the ``--no-server-version-check`` parameter, like the example, overrides the parameter and the backup proceeds. + +.. code-block:: bash + + $ xtrabackup --backup --no-server-version-check --target-dir=$mysql/backup1 + +When you override the parameter, the following events can happen: + +* Backup fails + +* Creates a corrupted backup + +* Backup successful + + + diff --git a/storage/innobase/xtrabackup/doc/source/using_xtrabackup/configuring.rst b/storage/innobase/xtrabackup/doc/source/using_xtrabackup/configuring.rst new file mode 100644 index 000000000000..49d61bca3fe1 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/using_xtrabackup/configuring.rst @@ -0,0 +1,50 @@ +.. _configuring: + +Configuring xtrabackup +====================== + +All of the *xtrabackup* configuration is done through options, which behave +exactly like standard *MySQL* program options: they can be specified either at +the command-line, or through a file such as :file:`/etc/my.cnf`. + +The *xtrabackup* binary reads the ``[mysqld]`` and ``[xtrabackup]`` sections +from any configuration files, in that order. That is so that it can read its +options from your existing *MySQL* installation, such as the :term:`datadir` or +some of the *InnoDB* options. If you want to override these, just specify them +in the ``[xtrabackup]`` section, and because it is read later, it will take +precedence. + +You don't need to put any configuration in your :file:`my.cnf` if you don't +want to. You can simply specify the options on the command-line. Normally, the +only thing you might find convenient to place in the ``[xtrabackup]`` section +of your :file:`my.cnf` file is the ``target_dir`` option to default the +directory in which the backups will be placed, for example: + +.. code-block:: text + + [xtrabackup] + target_dir = /data/backups/mysql/ + +This manual will assume that you do not have any file-based configuration for +*xtrabackup*, so it will always show command-line options being used +explicitly. Please see the :ref:`option and variable reference +` for details on all of the configuration options. + +The *xtrabackup* binary does not accept exactly the same syntax in the +:file:`my.cnf` file as the :program:`mysqld` server binary does. For historical +reasons, the :program:`mysqld` server binary accepts parameters with a +``--set-variable==`` syntax, which *xtrabackup* does not +understand. If your :file:`my.cnf` file has such configuration directives, you +should rewrite them in the ``--variable=value`` syntax. + +System Configuration and NFS Volumes +------------------------------------ + +The *xtrabackup* tool requires no special configuration on most systems. +However, the storage where the :option:`--target-dir` is located +must behave properly when ``fsync()`` is called. In particular, we have noticed +that NFS volumes not mounted with the ``sync`` option might not really sync the +data. As a result, if you back up to an NFS volume mounted with the async +option, and then try to prepare the backup from a different server that also +mounts that volume, the data might appear to be corrupt. You can use the +``sync`` mount option to avoid this problem. diff --git a/storage/innobase/xtrabackup/doc/source/using_xtrabackup/privileges.rst b/storage/innobase/xtrabackup/doc/source/using_xtrabackup/privileges.rst new file mode 100644 index 000000000000..61b2939b7b71 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/using_xtrabackup/privileges.rst @@ -0,0 +1,147 @@ +.. _privileges: + +================================================================================ +Connection and Privileges Needed +================================================================================ + +*Percona XtraBackup* needs to be able to connect to the database server and +perform operations on the server and the :term:`datadir` when creating a +backup, when preparing in some scenarios and when restoring it. In order to do +so, there are privileges and permission requirements on its execution that +must be fulfilled. + +Privileges refers to the operations that a system user is permitted to do in +the database server. **They are set at the database server and only apply to +users in the database server**. + +Permissions are those which permits a user to perform operations on the system, +like reading, writing or executing on a certain directory or start/stop a +system service. **They are set at a system level and only apply to system +users**. + +When *xtrabackup* is used, there are two actors involved: the user invoking the +program - *a system user* - and the user performing action in the database +server - *a database user*. Note that these are different users in different +places, even though they may have the same username. + +All the invocations of *xtrabackup* in this documentation assume that the system +user has the appropriate permissions and you are providing the relevant options +for connecting the database server - besides the options for the action to be +performed - and the database user has adequate privileges. + +.. _pxb.privilege.server.connecting: + +Connecting to the server +================================================================================ + +The database user used to connect to the server and its password are specified +by the :option:`--user` and :option:`--password` option: + +.. code-block:: bash + + $ xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup \ + --target-dir=/data/bkps/ + +If you don't use the :option:`--user` option, *Percona XtraBackup* will assume +the database user whose name is the system user executing it. + +.. _pxb.privilege.server.option.connecting: + +Other Connection Options +-------------------------------------------------------------------------------- + +According to your system, you may need to specify one or more of the following +options to connect to the server: + +=========== ================================================================== +Option Description +=========== ================================================================== +--port The port to use when connecting to the database server with + TCP/IP. +--socket The socket to use when connecting to the local database. +--host The host to use when connecting to the database server with + TCP/IP. +=========== ================================================================== + +These options are passed to the :command:`mysql` child process without +alteration, see ``mysql --help`` for details. + +.. note:: + + In case of multiple server instances, the correct connection parameters + (port, socket, host) must be specified in order for *xtrabackup* to talk to + the correct server. + +.. _pxb.privilege: + +Permissions and Privileges Needed +================================================================================ + +Once connected to the server, in order to perform a backup you will need +``READ`` and ``EXECUTE`` permissions at a filesystem level in the +server's :term:`datadir`. + +The database user needs the following privileges on the tables or databases to be backed up: + +* ``RELOAD`` and ``LOCK TABLES`` (unless the :option:`--no-lock <--no-lock>` + option is specified) in order to run :mysql:`FLUSH TABLES WITH READ LOCK` and + :mysql:`FLUSH ENGINE LOGS` prior to start copying the files, and requires this + privilege when `Backup Locks + `_ + are used + +* ``BACKUP_ADMIN`` privilege is needed to query the + performance_schema.log_status table, and run :mysql:`LOCK INSTANCE FOR BACKUP`, + :mysql:`LOCK BINLOG FOR BACKUP`, or :mysql:`LOCK TABLES FOR BACKUP`. + +* ``REPLICATION CLIENT`` in order to obtain the binary log position, + +* ``CREATE TABLESPACE`` in order to import tables (see :ref:`pxb.xtrabackup.table.restoring`), + +* ``PROCESS`` in order to run ``SHOW ENGINE INNODB STATUS`` (which is + mandatory), and optionally to see all threads which are running on the + server (see :ref:`pxb.xtrabackup.flush-tables-with-read-lock`), + +* ``SUPER`` in order to start/stop the replication threads in a replication + environment, use `XtraDB Changed Page Tracking + `_ + for :ref:`xb_incremental` and for :ref:`handling FLUSH TABLES WITH READ LOCK `, + +* ``CREATE`` privilege in order to create the + :ref:`PERCONA_SCHEMA.xtrabackup_history ` database and + table, + +* ``ALTER`` privilege in order to upgrade the + :ref:`PERCONA_SCHEMA.xtrabackup_history ` database and + table, + +* ``INSERT`` privilege in order to add history records to the + :ref:`PERCONA_SCHEMA.xtrabackup_history ` table, + +* ``SELECT`` privilege in order to use + :option:`--incremental-history-name` or + :option:`--incremental-history-uuid` in order for the feature + to look up the ``innodb_to_lsn`` values in the + :ref:`PERCONA_SCHEMA.xtrabackup_history ` table. + +* ``SELECT`` privilege on the `keyring_component_status table `__ to view the attributes and status of the installed keyring component when in use. + +The explanation of when these are used can be found in +:ref:`how_xtrabackup_works`. + +An SQL example of creating a database user with the minimum privileges required +to full backups would be: + +.. code-block:: mysql + + mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cr%T'; + mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost'; + mysql> GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'localhost'; + mysql> GRANT SELECT ON performance_schema.keyring_component_status TO bkpuser@'localhost' + mysql> FLUSH PRIVILEGES; + + + + + + diff --git a/storage/innobase/xtrabackup/doc/source/version-check.rst b/storage/innobase/xtrabackup/doc/source/version-check.rst new file mode 100644 index 000000000000..92266b82871b --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/version-check.rst @@ -0,0 +1,121 @@ +.. _version-check: + +================================================================================ +Version Checking +================================================================================ + +Some Percona software contains “version checking” functionality which is a +feature that enables Percona software users to be notified of available software +updates to improve your environment security and performance. Alongside this, +the version check functionality also provides Percona with information relating +to which software versions you are running, coupled with the environment +confirmation which the software is running within. This helps enable Percona to +focus our development effort accordingly based on trends within our customer +community. + +The purpose of this document is to articulate the information that is collected, +as well as to provide guidance on how to disable this functionality if desired. + +Usage +================================================================================ + +*Version Check* was implemented in *Percona Toolkit* 2.1.4, and was enabled by default in +version 2.2.1. Currently it is supported as a ``--[no]version-check`` option +by `a number of tools in Percona Toolkit `_, +*Percona XtraBackup*, and *Percona Monitoring and Management* (PMM). + +When launched with Version Check enabled, the tool that supports this feature +connects to a Percona's *version check service* via a secure HTTPS channel. It +compares the locally installed version for possible updates, and also checks +versions of the following software: + +* Operating System +* Percona Monitoring and Management (PMM) +* MySQL +* Perl +* MySQL driver for Perl (DBD::mysql) +* Percona Toolkit + +Then it checks for and warns about versions with known problems if they are +identified as running in the environment. + +Each version check request is logged by the server. Stored information consists +of the checked system unique ID followed by the software name and version. The +ID is generated either at installation or when the *version checking* query is +submitted for the first time. + +.. note:: + + Prior to version 3.0.7 of *Percona Toolkit*, the system ID was calculated as an MD5 hash + of a hostname, and starting from *Percona Toolkit* 3.0.7 it is generated as an MD5 hash of + a random number. *Percona XtraBackup* continues to use hostname-based MD5 hash. + +As a result, the content of the sent query is as follows:: + + 85624f3fb5d2af8816178ea1493ed41a;DBD::mysql;4.044 + c2b6d625ef3409164cbf8af4985c48d3;MySQL;MySQL Community Server (GPL) 5.7.22-log + 85624f3fb5d2af8816178ea1493ed41a;OS;Manjaro Linux + 85624f3fb5d2af8816178ea1493ed41a;Percona::Toolkit;3.0.11-dev + 85624f3fb5d2af8816178ea1493ed41a;Perl;5.26.2 + +Disabling Version Check +================================================================================ + +Although the *version checking* feature does not collect any personal information, +you might prefer to disable this feature, either one time or permanently. To +disable it one time, use ``--no-version-check`` option when invoking the tool +from a Percona product which supports it. Here is a simple example which shows +running `pt-diskstats +`_ tool +from the *Percona Toolkit* with *version checking* turned off:: + + pt-diskstats --no-version-check + +Disabling *version checking* permanently can be done by placing +``no-version-check`` option into the configuration file of a Percona product +(see correspondent documentation for exact file name and syntax). For example, +in case of *Percona Toolkit* `this can be done +`_ +in a global configuration file ``/etc/percona-toolkit/percona-toolkit.conf``:: + + # Disable Version Check for all tools: + no-version-check + +In case of *Percona XtraBackup* this can be done `in its configuration file +`_ +in a similar way:: + + [xtrabackup] + no-version-check + +Frequently Asked Questions +================================================================================ + +.. contents:: + :local: + +Why is this functionality enabled by default? +-------------------------------------------------------------------------------- + +We believe having this functionality enabled improves security and performance +of environments running Percona Software and it is good choice for majority of +the users. + +Why not rely on Operating System's built in functionality for software updates? +-------------------------------------------------------------------------------- + +In many environments the Operating Systems repositories may not carry the latest +version of software and newer versions of software often installed manually, so +not being covered by operating system wide check for updates. + +Why do you send more information than just the version of software being run as a part of version check service? +----------------------------------------------------------------------------------------------------------------------- + +Compatibility problems can be caused by versions of various components in the +environment, for example problematic versions of Perl, DBD or MySQL could cause +operational problems with Percona Toolkit. + +.. *Percona Monitoring and Management* (PMM) replace:: PMM (Percona Monitoring and Management) +.. *Percona Toolkit* replace:: Percona Toolkit +.. *Percona XtraBackup* replace:: Percona XtraBackup +.. *version checking* replace:: *version checking* diff --git a/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud.rst b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud.rst new file mode 100644 index 000000000000..77da7b963681 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud.rst @@ -0,0 +1,316 @@ +.. _xbcloud_binary: + +================================================================================ +The xbcloud Binary +================================================================================ + +The purpose of *xbcloud* is to download from the cloud and upload to the cloud the full or part of an *xbstream* archive. *xbcloud* will not overwrite the backup with the same name. *xbcloud* accepts input via a pipe from *xbstream* so that it can be +invoked as a pipeline with *xtrabackup* to stream directly to the cloud without +needing a local storage. + +.. note:: + + In a Bash shell, the ``$?`` parameter returns the exit code from the last binary. If you use pipes, the ``${PIPESTATUS[x]}`` array parameter returns the exit codes for each binary in the pipe string. + + .. code-block:: + + $ xtrabackup --backup --stream=xbstream --target-dir=/storage/backups/ | xbcloud put [options] full_backup + ... + $ ${PIPESTATUS[x]} + 0 0 + $ true | false + $ echo $? + 1 + + # with PIPESTATUS + $ true | false + $ echo ${PIPESTATUS[0]} ${PIPESTATUS[1]} + 0 1 + +The *xbcloud* binary stores each chunk as a separate object with a name +``backup_name/database/table.ibd.NNNNNNNNNNNNNNNNNNNN``, where ``NNN...`` is a +0-padded serial number of chunk within a file. Size of chunk produced by +*xtrabackup* and *xbstream* changed to 10M. + +*xbcloud* has three essential operations: *put*, *get*, and *delete*. With these +operations, backups are created, stored, retrieved, restored, and +deleted. *xbcloud* operations clearly map to similar operations within the AWS +Amazon Amazon S3 API. + +The :ref:`xbcloud_exbackoff` feature was implemented in Percona XtraBackup 8.0.26-18. Suppose a chunk fails to upload or download. In that case, this feature adds an exponential backoff, or sleep, time and then retries the upload or download, which increases the chances of completing a backup or a restore operation. + +Supported Cloud Storage Types +================================================================================ + +The following cloud storage types are supported: + +* OpenStack Object Storage (Swift) - see :ref:`xbcloud_swift` + +* Amazon Simple Storage (S3) - see :ref:`xbcloud_s3` + +* Azure Cloud Storage - see :ref:`xbcloud_azure` + +* Google Cloud Storage (gcs) - see :ref:`xbcloud_gcs` + +* MinIO - see :ref:`xbcloud_minio` + +In addition to OpenStack Object Storage (Swift), which has been the only option for storing backups in a cloud storage until Percona XtraBackup 2.4.14, *xbcloud* supports Amazon S3, MinIO, and Google Cloud Storage. Other Amazon S3-compatible storages, such as Wasabi or Digital Ocean Spaces, are also supported. + +.. seealso:: + + OpenStack Object Storage ("Swift") + https://wiki.openstack.org/wiki/Swift + Amazon Simple Storage Service + https://aws.amazon.com/s3/ + MinIO + https://min.io/ + Google Cloud Storage + https://cloud.google.com/storage/ + Wasabi + https://wasabi.com/ + Digital Ocean Spaces + https://www.digitalocean.com/products/spaces/ + +Usage +================================================================================ + +The following sample command creates a full backup: + +.. code-block:: bash + + xtrabackup --backup --stream=xbstream --target-dir=/storage/backups/ --extra-lsndirk=/storage/backups/| xbcloud \ + put [options] full_backup + +An incremental backup only includes the changes since the last backup. The last backup can be either a full or incremental backup. + +The following sample command creates an incremental backup: + +.. sourcecode:: bash + + xtrabackup --backup --stream=xbstream --incremental-basedir=/storage/backups \ + --target-dir=/storage/inc-backup | xbcloud put [options] inc_backup + +To prepare an incremental backup, you must first download the full backup with the following command: + +.. sourcecode:: bash + + xtrabackup get [options] full_backup | xbstream -xv -C /tmp/full-backup + +You must prepare the full backup: + +.. sourcecode:: bash + + xtrabackup --prepare --apply-log-only --target-dir=/tmp/full-backup + +After the full backup has been prepared, download the incremental backup: + +.. sourcecode:: bash + + xbcloud get [options] inc_backup | xbstream -xv -C /tmp/inc-backup + +The downloaded backup is prepared by running the following command: + +.. sourcecode:: bash + + xtrabackup --prepare --target-dir=/tmp/full-backup --incremental-dir=/tmp/inc-backup + +You do not need the full backup to restore only a specific database. You can specify only the tables to be restored: + +.. sourcecode:: bash + + xbcloud get [options] ibdata1 sakila/payment.ibd /tmp/partial/partial.xbs + + xbstream -xv -C /tmp/partial < /tmp/partial/partial.xbs + + + +Supplying parameters +================================================================================ + +Each storage type has mandatory parameters that you can supply on the command +line, in a configuration file, and via environment variables. + +Configuration files +-------------------------------------------------------------------------------- + +The parameters the values of which do not change frequently can be stored in +:file:`my.cnf` or in a custom configuration file. The following example is a +template of configuration options under the ``[xbcloud]`` group: + +.. code-block:: text + + [xbcloud] + storage=s3 + s3-endpoint=http://localhost:9000/ + s3-access-key=minio + s3-secret-key=minio123 + s3-bucket=backupsx + s3-bucket-lookup=path + s3-api-version=4 + +.. note:: + + If you explicitly use a parameter on the command line and in a configuration + file, *xbcloud* uses the the value provided on the command line. + +Environment variables +-------------------------------------------------------------------------------- + +If you explicitly use a parameter on the command line, in a configuration +file, and the corresponding environment variable contains a value, *xbcloud* +uses the the value provided on the command line or in the configuration file. + +Shortcuts +-------------------------------------------------------------------------------- + +For all operations (put, get, and delete), you can use a shortcut to specify the +storage type, bucket name, and backup name as one parameter instead of using +three distinct parameters (--storage, --s3-bucket, and backup name per se). + +.. admonition:: Using a shortcut syntax to provide a storage type, bucket, and backup name + + Use the following format: ``storage-type://bucket-name/backup-name`` + + .. code-block:: bash + + $ xbcloud get s3://operator-testing/bak22 ... + + In this example, **s3** refers to a storage type, **operator-testing** is a + bucket name, and **bak22** is the backup name. This shortcut expands as + follows: + + .. code-block:: bash + + $ xbcloud get --storage=s3 --s3-bucket=operator-testing bak22 ... + +You can supply the mandatory parameters not only on the command line. You may use +configuration files and environment variables. + +Additional parameters +-------------------------------------------------------------------------------- + +*xbcloud* accepts additional parameters that you can use with any storage +type. The ``--md5`` parameter computes the MD5 hash value of the backup +chunks. The result is stored in files that following the ``backup_name.md5`` +pattern. + +.. code-block:: bash + + $ xtrabackup --backup --stream=xbstream \ + --parallel=8 2>backup.log | xbcloud put s3://operator-testing/bak22 \ + --parallel=8 --md5 2>upload.log + +You may use the ``--header`` parameter to pass an additional HTTP +header with the server side encryption while specifying a customer key. + +.. admonition:: Example of using ``--header`` for AES256 encryption + + .. code-block:: bash + + $ xtrabackup --backup --stream=xbstream --parallel=4 | \ + xbcloud put s3://operator-testing/bak-enc/ \ + --header="X-Amz-Server-Side-Encryption-Customer-Algorithm: AES256" \ + --header="X-Amz-Server-Side-Encryption-Customer-Key: CuStoMerKey=" \ + --header="X-Amz-Server-Side-Encryption-Customer-Key-MD5: CuStoMerKeyMd5==" \ + --parallel=8 + +The ``--header`` parameter is also useful to set the access control list (ACL) +permissions: ``--header="x-amz-acl: bucket-owner-full-control`` + + + + + +Incremental backups +================================================================================ + +First, you need to make the full backup on which the incremental one is going to +be based: + +.. code-block:: bash + + xtrabackup --backup --stream=xbstream --extra-lsndir=/storage/backups/ \ + --target-dir=/storage/backups/ | xbcloud put \ + --storage=swift --swift-container=test_backup \ + --swift-auth-version=2.0 --swift-user=admin \ + --swift-tenant=admin --swift-password=xoxoxoxo \ + --swift-auth-url=http://127.0.0.1:35357/ --parallel=10 \ + full_backup + +Then you can make the incremental backup: + +.. code-block:: bash + + $ xtrabackup --backup --incremental-basedir=/storage/backups \ + --stream=xbstream --target-dir=/storage/inc_backup | xbcloud put \ + --storage=swift --swift-container=test_backup \ + --swift-auth-version=2.0 --swift-user=admin \ + --swift-tenant=admin --swift-password=xoxoxoxo \ + --swift-auth-url=http://127.0.0.1:35357/ --parallel=10 \ + inc_backup + +Preparing incremental backups +-------------------------------------------------------------------------------- + +To prepare a backup you first need to download the full backup: + +.. code-block:: bash + + $ xbcloud get --swift-container=test_backup \ + --swift-auth-version=2.0 --swift-user=admin \ + --swift-tenant=admin --swift-password=xoxoxoxo \ + --swift-auth-url=http://127.0.0.1:35357/ --parallel=10 \ + full_backup | xbstream -xv -C /storage/downloaded_full + +Once you download the full backup it should be prepared: + +.. code-block:: bash + + $ xtrabackup --prepare --apply-log-only --target-dir=/storage/downloaded_full + +After the full backup has been prepared you can download the incremental +backup: + +.. code-block:: bash + + $ xbcloud get --swift-container=test_backup \ + --swift-auth-version=2.0 --swift-user=admin \ + --swift-tenant=admin --swift-password=xoxoxoxo \ + --swift-auth-url=http://127.0.0.1:35357/ --parallel=10 \ + inc_backup | xbstream -xv -C /storage/downloaded_inc + +Once the incremental backup has been downloaded you can prepare it by running: + +.. code-block:: bash + + $ xtrabackup --prepare --apply-log-only \ + --target-dir=/storage/downloaded_full \ + --incremental-dir=/storage/downloaded_inc + + $ xtrabackup --prepare --target-dir=/storage/downloaded_full + +Partial download of the cloud backup +-------------------------------------------------------------------------------- + +If you do not want to download the entire backup to restore the specific +database you can specify only the tables you want to restore: + +.. code-block:: bash + + $ xbcloud get --swift-container=test_backup + --swift-auth-version=2.0 --swift-user=admin \ + --swift-tenant=admin --swift-password=xoxoxoxo \ + --swift-auth-url=http://127.0.0.1:35357/ full_backup \ + ibdata1 sakila/payment.ibd \ + > /storage/partial/partial.xbs + + $ xbstream -xv -C /storage/partial < /storage/partial/partial.xbs + + + + + + + + + diff --git a/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_azure.rst b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_azure.rst new file mode 100644 index 000000000000..0d912d09a917 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_azure.rst @@ -0,0 +1,77 @@ +.. _xbcloud_azure: + +============================================================= +Using the xbcloud binary with Microsoft Azure Cloud Storage +============================================================= + +This feature is *technical preview* quality. + +Implemented in Percona XtraBackup 8.0.27-19, the **xbcloud** binary adds support for the Microsoft Azure Cloud Storage using the REST API. + +Options +---------------- + +The following are the options, environment variables, and descriptions for uploading a backup to Azure using the REST API. The environment variables are recognized by **xbcloud**, which maps them automatically to the corresponding parameters: + +.. list-table:: + :widths: 40 40 40 + :header-rows: 1 + + * - Option name + - Environment variables + - Description + * - ``--azure-storage-account=name`` + - AZURE_STORAGE_ACCOUNT + - An Azure storage account is a unique namespace to access and store your Azure data objects. + * - ``--azure-container-name=name`` + - AZURE_CONTAINER_NAME + - A container name is a valid DNS name that conforms to the `Azure naming rules `__ + * - ``--azure-access-key=name`` + - AZURE_ACCESS_KEY + - A generated key that can be used to authorize access to data in your account using the Shared Key authorization. + * - ``--azure-endpoint=name`` + - AZURE_ENDPOINT + - The endpoint allows clients to securely access data + * - ``--azure-tier-class=name`` + - AZURE_STORAGE_CLASS + - Cloud tier can decrease the local storage required while maintaining the performance. When enabled, this feature has the following categories: + + - Hot - Frequently accessed or modified data + + - Cool - Infrequently accessed or modified data + + - Archive - Rarely accessed or modified data + +Test your Azure applications with the `Azurite open-source emulator `__. For testing purposes, the **xbcloud** binary adds the ``--azure-development-storage`` option that uses the default ``access_key`` and ``storage account`` of azurite and ``testcontainer`` for the container. You can overwrite these options, if needed. + +Usage +---------------- + +All of the available options for **xbcloud**, such as parallel, max-retries, and others, can be used. For more information, :ref:`xbcloud_binary`. + +Examples +------------- + +An example of an **xbcloud** backup. + +.. sourcecode:: bash + + xtrabackup --backup --stream=xbstream --target-dir= $TARGET_DIR | xbcloud put backup_name --azure-storage-account=pxbtesting --azure-access-key=$AZURE_KEY --azure-container-name=test --storage=azure + +An example of restoring a backup from **xbcloud**. + +.. sourcecode:: bash + + xbcloud get backup_name --azure-storage-account=pxbtesting --azure-access-key=$AZURE_KEY --azure-container-name=test --storage=azure --parallel=10 2>download.log | xbstream -x -C restore + +An example of deleting a backup from **xbcloud**. + +.. sourcecode:: bash + + xbcloud delete backup_name --azure-storage-account=pxbtesting --azure-access-key=$AZURE_KEY --azure-container-name=test --storage=azure + +An example of using a shortcut restore. + +.. sourcecode:: bash + + xbcloud get azure://operator-testing/bak22 ... diff --git a/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_exbackoff.rst b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_exbackoff.rst new file mode 100644 index 000000000000..aeaec0920cf6 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_exbackoff.rst @@ -0,0 +1,105 @@ +.. _xbcloud_exbackoff: + +========================================== +Exponential Backoff +========================================== + +This feature was implemented in :ref:`PXB-8.0.26-18.0` in the xbcloud binary. + +Exponential backoff increases the chances for the completion of a backup or a restore operation. For example, a chunk upload or download may fail if you have an unstable network connection or other network issues. This feature adds an exponential backoff, or sleep, time and then retries the upload or download. + +When a chunk upload or download operation fails, xbcloud checks the reason for the failure. This failure can be a CURL error or an HTTP error, or a client-specific error. If the error is listed in the :ref:`retriable` list, xbcloud pauses for a calculated time before retrying the operation until that time reaches the ``--max-backoff`` value. + +The operation is retried until the ``--max-retries`` value is reached. If the chunk operation fails on the last retry, xbcloud aborts the process. + +The default values are the following: + +* --max-backoff = 300000 (5 minutes) + +* --max-retries = 10 + + +You can adjust the number of retries by adding the ``--max-retries`` parameter and adjust the maximum length of time between retries by adding the ``--max-backoff`` parameter to an xbcloud command. + +Since xbcloud does multiple asynchronous requests in parallel, a calculated value, measured in milliseconds, is used for ``max-backoff``. This algorithm calculates how many milliseconds to sleep before the next retry. A number generated is based on the combining the power of two (2), the number of retries already attempted and adds a random number between 1 and 1000. This number avoids network congestion if multiple chunks have the same backoff value. If the default values are used, the final retry attempt to be approximately 17 minutes after the first try. The number is no longer calculated when the milliseconds reach the ``--max-backoff`` setting. At that point, the retries continue by using the ``--max-backoff`` setting until the ``max-retries`` parameter is reached. + +.. _retriable: + +Retriable errors +------------------ + +We retry for the following CURL operations: + +* CURLE_GOT_NOTHING + +* CURLE_OPERATION_TIMEOUT + +* CURLE_RECV_ERROR + +* CURLE_SEND_ERROR + +* CURLE_SEND_FAIL_REWIND + +* CURLE_PARTIAL_FILE + +* CURLE_SSL_CONNECT_ERROR + +We retry for the following HTTP operation status codes: + +* 503 + +* 500 + +* 504 + +* 408 + +Each cloud provider may return a different CURL error or an HTTP error, depending on the issue. Add new errors by setting the following variables ``--curl-retriable-errors`` or ``--http-retriable-errors`` on the command line or in ``my.cnf`` or in a custom configuration file under the [xbcloud] section. + +The error handling is enhanced when using the ``--verbose`` output. This output specifies which error caused xbcloud to fail and what parameter a user must add to retry on this error. + +The following is an example of a verbose output: + +.. sourcecode:: bash + + 210701 14:34:23 /work/pxb/ins/8.0/bin/xbcloud: Operation failed. Error: Server returned nothing (no headers, no data) + 210701 14:34:23 /work/pxb/ins/8.0/bin/xbcloud: Curl error (52) Server returned nothing (no headers, no data) is not configured as retriable. You can allow it by adding --curl-retriable-errors=52 parameter + +Example +-------- +The following example adjusts the maximum number of retries and the maximum time between retries. + +.. sourcecode:: bash + + xbcloud [options] --max-retries=5 --max-backoff=10000 + +The following text is an example of the exponential backoff used with the command: + +.. sourcecode:: bash + + 210702 10:07:05 /work/pxb/ins/8.0/bin/xbcloud: Operation failed. Error: Server returned nothing (no headers, no data) + 210702 10:07:05 /work/pxb/ins/8.0/bin/xbcloud: Sleeping for 2384 ms before retrying backup3/xtrabackup_logfile.00000000000000000006 [1] + . . . + 210702 10:07:23 /work/pxb/ins/8.0/bin/xbcloud: Operation failed. Error: Server returned nothing (no headers, no data) + 210702 10:07:23 /work/pxb/ins/8.0/bin/xbcloud: Sleeping for 4387 ms before retrying backup3/xtrabackup_logfile.00000000000000000006 [2] + . . . + 210702 10:07:52 /work/pxb/ins/8.0/bin/xbcloud: Operation failed. Error: Failed sending data to the peer + 210702 10:07:52 /work/pxb/ins/8.0/bin/xbcloud: Sleeping for 8691 ms before retrying backup3/xtrabackup_logfile.00000000000000000006 [3] + . . . + 210702 10:08:47 /work/pxb/ins/8.0/bin/xbcloud: Operation failed. Error: Failed sending data to the peer + 210702 10:08:47 /work/pxb/ins/8.0/bin/xbcloud: Sleeping for 10000 ms before retrying backup3/xtrabackup_logfile.00000000000000000006 [4] + . . . + 210702 10:10:12 /work/pxb/ins/8.0/bin/xbcloud: successfully uploaded chunk: backup3/xtrabackup_logfile.00000000000000000006, size: 8388660 + +The following list details the example output: + + [1.] Chunk ``xtrabackup_logfile.00000000000000000006`` fails to upload _ the first time and slept for 2384 milliseconds. + + [2.] The same chunk fails for the second time and the time is increased to 4387 milliseconds. + + [3.] The same chunk fails for the third time and the time is increased to 8691 milliseconds. + + [4.] The same chunk fails for the fourth time. The ``max-backoff`` parameter has been reached. All retries sleep the same amount of time after reaching the parameter. + + [5.] The same chunk is successfully uploaded. + diff --git a/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_gcs.rst b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_gcs.rst new file mode 100644 index 000000000000..c601cc656a76 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_gcs.rst @@ -0,0 +1,50 @@ +.. _xbcloud_gcs: + +=================================================== +Using the xbcloud with Google Cloud Storage +=================================================== + +Creating a full backup with Google Cloud Storage +================================================================================ + +The support for Google Cloud Storage is implemented using the interoperability +mode. This mode was especially designed to interact with cloud services +compatible with Amazon S3. + +.. seealso:: + + Cloud Storage Interoperability + https://cloud.google.com/storage/docs/interoperability + +.. code-block:: bash + + $ xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \ + xbcloud put --storage=google \ + --google-endpoint=`storage.googleapis.com` \ + --google-access-key='YOUR-ACCESSKEYID' \ + --google-secret-key='YOUR-SECRETACCESSKEY' \ + --google-bucket='mysql_backups' + --parallel=10 \ + $(date -I)-full_backup + +The following options are available when using Google Cloud Storage: + +- --google-access-key = +- --google-secret-key = +- --google-bucket = +- --google-storage-class=name + +.. note:: + + The Google storage class name options are the following: + + * STANDARD + * NEARLINE + * COLDLINE + * ARCHIVE + + .. seealso:: + + `Google storage classes `_ + `The default Google storage class depends on the storage class of the bucket `_ + \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_minio.rst b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_minio.rst new file mode 100644 index 000000000000..7b7e299e922c --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_minio.rst @@ -0,0 +1,19 @@ +.. _xbcloud_minio: + +================================================= +Using the xbcloud Binary with MinIO +================================================= + +Creating a full backup with MinIO +================================== + +.. code-block:: bash + + $ xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \ + xbcloud put --storage=s3 \ + --s3-endpoint='play.minio.io:9000' \ + --s3-access-key='YOUR-ACCESSKEYID' \ + --s3-secret-key='YOUR-SECRETACCESSKEY' \ + --s3-bucket='mysql_backups' + --parallel=10 \ + $(date -I)-full_backup \ No newline at end of file diff --git a/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_s3.rst b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_s3.rst new file mode 100644 index 000000000000..eef5f17839d6 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_s3.rst @@ -0,0 +1,73 @@ +.. _xbcloud_s3: + +==================================================== +Using xbcloud Binary with Amazon S3 +==================================================== + +Creating a full backup with Amazon S3 +================================================================================ + +.. code-block:: bash + + $ xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \ + xbcloud put --storage=s3 \ + --s3-endpoint='s3.amazonaws.com' \ + --s3-access-key='YOUR-ACCESSKEYID' \ + --s3-secret-key='YOUR-SECRETACCESSKEY' \ + --s3-bucket='mysql_backups' + --parallel=10 \ + $(date -I)-full_backup + + +The following options are available when using Amazon S3: + +.. list-table:: + :header-rows: 1 + + * - Option + - Details + * - --s3-access-key + - Use to supply the AWS access key ID + * - --s3-secret-key + - Use to supply the AWS secret access key + * - --s3-bucket + - Use supply the AWS bucket name + * - --s3-region + - Use to specify the AWS region. The default value is **us-east-1** + * - --s3-api-version = + - Select the signing algorithm. The default value is AUTO. In this case, *xbcloud* will probe. + * - --s3-bucket-lookup = + - Specify whether to use **bucket.endpoint.com** or *endpoint.com/bucket** + style requests. The default value is AUTO. In this case, *xbcloud* will probe. + * - --s3-storage-class= + - Specify the `S3 storage class `__. The default storage class depends on the provider. The name options are the following: + + * STANDARD + * STANDARD_IA + * GLACIER + + .. note:: + + If you use the GLACIER storage class, the object must be `restored to S3 `__ before restoring the backup. Also supports using custom S3 implementations such as MinIO or CephRadosGW. + + +Environment variables +========================= + +The following environment variables are recognized. xbcloud maps them +automatically to corresponding parameters applicable to the selected storage. + +- AWS_ACCESS_KEY_ID (or ACCESS_KEY_ID) +- AWS_SECRET_ACCESS_KEY (or SECRET_ACCESS_KEY) +- AWS_DEFAULT_REGION (or DEFAULT_REGION) +- AWS_ENDPOINT (or ENDPOINT) +- AWS_CA_BUNDLE + +Restoring with S3 +================================================================================ + +.. code-block:: bash + + $ xbcloud get s3://operator-testing/bak22 \ + --s3-endpoint=https://storage.googleapis.com/ \ + --parallel=10 2>download.log | xbstream -x -C restore --parallel=8 diff --git a/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_swift.rst b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_swift.rst new file mode 100644 index 000000000000..3af6c94efe35 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xbcloud/xbcloud_swift.rst @@ -0,0 +1,161 @@ +.. _xbcloud_swift: + +====================================== +Using the xbcloud Binary with Swift +====================================== + +Creating a full backup with Swift +================================================================================ + +The following example shows how to make a full backup and upload it to Swift. + +.. code-block:: bash + + $ xtrabackup --backup --stream=xbstream --extra-lsndir=/tmp --target-dir=/tmp | \ + xbcloud put --storage=swift \ + --swift-container=test \ + --swift-user=test:tester \ + --swift-auth-url=http://192.168.8.80:8080/ \ + --swift-key=testing \ + --parallel=10 \ + full_backup + +The following OpenStack environment variables are also recognized and mapped automatically to the corresponding **swift** parameters (``--storage=swift``): + + * OS_AUTH_URL + * OS_TENANT_NAME + * OS_TENANT_ID + * OS_USERNAME + * OS_PASSWORD + * OS_USER_DOMAIN + * OS_USER_DOMAIN_ID + * OS_PROJECT_DOMAIN + * OS_PROJECT_DOMAIN_ID + * OS_REGION_NAME + * OS_STORAGE_URL + * OS_CACERT + +Restoring with Swift +================================================================================ + +.. code-block:: bash + + $ xbcloud get [options] [] | xbstream -x + +The following example shows how to fetch and restore the backup from Swift: + +.. code-block:: bash + + $ xbcloud get --storage=swift \ + --swift-container=test \ + --swift-user=test:tester \ + --swift-auth-url=http://192.168.8.80:8080/ \ + --swift-key=testing \ + full_backup | xbstream -xv -C /tmp/downloaded_full + + $ xbcloud delete --storage=swift --swift-user=xtrabackup \ + --swift-password=xtrabackup123! --swift-auth-version=3 \ + --swift-auth-url=http://openstack.ci.percona.com:5000/ \ + --swift-container=mybackup1 --swift-domain=Default + + +Command-line options +================================================================================ + +*xbcloud* has the following command line options: + +.. program:: xbcloud + +.. option:: --storage=[swift|s3|google] + + Cloud storage option. *xbcloud* supports Swift, MinIO, and AWS S3. + The default value is ``swift``. + +.. option:: --swift-auth-url + + URL of Swift cluster. + +.. option:: --swift-storage-url + + xbcloud will try to get object-store URL for given region (if any specified) + from the keystone response. One can override that URL by passing + --swift-storage-url=URL argument. + +.. option:: --swift-user + + Swift username (X-Auth-User, specific to Swift) + +.. option:: --swift-key + + Swift key/password (X-Auth-Key, specific to Swift) + +.. option:: --swift-container + + Container to backup into (specific to Swift) + +.. option:: --parallel=N + + Maximum number of concurrent upload/download requests. Default is ``1``. + +.. option:: --cacert + + Path to the file with CA certificates + +.. option:: --insecure + + Do not verify servers certificate + +.. _swift_auth: + +Swift authentication options +---------------------------- + +Swift specification describes several `authentication options +`_. *xbcloud* can +authenticate against keystone with API version 2 and 3. + +.. option:: --swift-auth-version + + Specifies the swift authentication version. Possible values are: ``1.0`` - + TempAuth, ``2.0`` - Keystone v2.0, and ``3`` - Keystone v3. Default value is + ``1.0``. + +For v2 additional options are: + +.. option:: --swift-tenant + + Swift tenant name. + +.. option:: --swift-tenant-id + + Swift tenant ID. + +.. option:: --swift-region + + Swift endpoint region. + +.. option:: --swift-password + + Swift password for the user. + +For v3 additional options are: + +.. option:: --swift-user-id + + Swift user ID. + +.. option:: --swift-project + + Swift project name. + +.. option:: --swift-project-id + + Swift project ID. + +.. option:: --swift-domain + + Swift domain name. + +.. option:: --swift-domain-id + + Swift domain ID. diff --git a/storage/innobase/xtrabackup/doc/source/xbcrypt/xbcrypt.rst b/storage/innobase/xtrabackup/doc/source/xbcrypt/xbcrypt.rst new file mode 100644 index 000000000000..e367787d0255 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xbcrypt/xbcrypt.rst @@ -0,0 +1,53 @@ +.. _xbcrypt: + +================== +The xbcrypt binary +================== + +To support encryption and decryption of the backups, a new tool ``xbcrypt`` was +introduced to *Percona XtraBackup*. + +**Percona XtraBackup** 8.0.28-20 implements the XBCRYPT_ENCRYPTION_KEY environment variable. The variable is only used in place of the ``--encrypt_key=name`` option. You can use the environment variable or command line option. If you use both, the command line option takes precedence over the value specified in the environment variable. + +This utility has been modeled after :ref:`xbstream_binary` to perform +encryption and decryption outside of *Percona XtraBackup*. ``xbcrypt`` has +following command line options: + +.. option:: -d, --decrypt + + Decrypt data input to output. + +.. option:: -i, --input=name + + Optional input file. If not specified, input will be read from standard + input. + +.. option:: -o, --output=name + + Optional output file. If not specified, output will be written to standard + output. + +.. option:: -a, --encrypt-algo=name + + Encryption algorithm. + +.. option:: -k, --encrypt-key=name + + Encryption key. + +.. option:: -f, --encrypt-key-file=name + + File which contains encryption key. + +.. option:: -s, --encrypt-chunk-size=# + + Size of working buffer for encryption in bytes. The default value is 64K. + +.. option:: --encrypt-threads=# + + This option specifies the number of worker threads that will be used for + parallel encryption/decryption. + +.. option:: -v, --verbose + + Display verbose status output. diff --git a/storage/innobase/xtrabackup/doc/source/xbstream/xbstream.rst b/storage/innobase/xtrabackup/doc/source/xbstream/xbstream.rst new file mode 100644 index 000000000000..2d2cc9a5470a --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xbstream/xbstream.rst @@ -0,0 +1,67 @@ +.. _xbstream_binary: + +=================== +The xbstream binary +=================== + +To support simultaneous compression and streaming, a new custom streaming +format called xbstream was introduced to *Percona XtraBackup* in addition to +the TAR format. That was required to overcome some limitations of traditional +archive formats such as tar, cpio and others which did not allow streaming +dynamically generated files, for example dynamically compressed files. Other +advantages of xbstream over traditional streaming/archive format include +ability to stream multiple files concurrently (so it is possible to use +streaming in the xbstream format together with the --parallel option) and more +compact data storage. + +This utility has a tar-like interface: + + - with the ``-x`` option it extracts files from the stream read from its + standard input to the current directory unless specified otherwise with the + ``-c`` option. Support for parallel extraction with the ``--parallel`` + option has been implemented in *Percona XtraBackup* 2.4.7. + + - with the ``-c`` option it streams files specified on the command line to its + standard output. + + - with the ``--decrypt=ALGO`` option specified xbstream will automatically + decrypt encrypted files when extracting input stream. Supported values for + this option are: ``AES128``, ``AES192``, and ``AES256``. Either + ``--encrypt-key`` or ``--encrypt-key-file`` options must be specified to + provide encryption key, but not both. This option has been implemented in + *Percona XtraBackup* 2.4.7. + + - with the ``--encrypt-threads`` option you can specify the number of threads + for parallel data encryption. The default value is ``1``. This option has + been implemented in *Percona XtraBackup* 2.4.7. + + - the ``--encrypt-key`` option is used to specify the encryption key that will + be used. It can't be used with ``--encrypt-key-file`` option because they + are mutually exclusive. This option has been implemented in *Percona + XtraBackup* 2.4.7. + + - the ``--encrypt-key-file`` option is used to specify the file that contains + the encryption key. It can't be used with ``--encrypt-key`` option. + because they are mutually exclusive. This option has been implemented in + *Percona XtraBackup* 2.4.7. + +The utility also tries to minimize its impact on the OS page cache by using the +appropriate ``posix_fadvise()`` calls when available. + +When compression is enabled with *xtrabackup* all data is being compressed, +including the transaction log file and meta data files, using the specified +compression algorithm. The only currently supported algorithm is ``quicklz``. + +The resulting files have the qpress archive format, i.e., every ``*.qp`` file +produced by *xtrabackup* is essentially a one-file qpress archive and can be +extracted and uncompressed by the `qpress file archiver +`_. This means that there is no need to decompress +entire backup to restore a single table as with :file:`tar.gz`. + +To decompress individual files, run *xbstream* with the +:option:`--decompress` option. You may control the number of threads +used for decompressing by passing the :option:`--decompress-threads` +option. + +Also, files can be decompressed using the **qpress** tool that can be downloaded from +`here `_. Qpress supports multi-threaded decompression. diff --git a/storage/innobase/xtrabackup/doc/source/xbstream/xbstream_format.md b/storage/innobase/xtrabackup/doc/source/xbstream/xbstream_format.md new file mode 100644 index 000000000000..20f287c7157a --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xbstream/xbstream_format.md @@ -0,0 +1,219 @@ +# xbstream file format +This page defines the file format layout of xbstream chunks + +Chunks +------ +An xbstream file is composed by two or more chunks. We always have one or +more chunks of either a payload or sparse map chunk followed by a last chunk of +type EOF to inform this is the End Of File and no more chunks for this file +will be sent. + +The structure of a chunk is: + +| Magic Number | Flag | Type | Path Length | Path | [Sparse Map Size] | Payload size | Payload offset | Checksum | [ Sparse Map ] | Payload | +| ------------ | ------ |--------| ----------- | ----------------- | ----------------- | ------------ | -------------- | ---------| ------------------------- | ------------------ | +| 8 bytes | 1 byte | 1 byte | 4 bytes | Path Length Bytes | 4 bytes | 8 bytes | 8 bytes | 4 bytes | 8 bytes * Sparse Map Size | Payload Size Bytes | + + +`Magic Number` + +8 Bytes - Value: **XBSTCK01** + +`Flag` + +1 Byte - Chunk flags. Currently Only used for the lowest bit. If bit is set a chunk of type **Unknown (\0)** can be ignored. + +`Type` + +1 Byte - Type of chunk. It can be 4 type: + * **XB_CHUNK_TYPE_UNKNOWN = '\0'** - This is a unknown type of chunk. + * **XB_CHUNK_TYPE_PAYLOAD = 'P'** - This is payload chunk. It contains plain data that can be written directly to disk. Payload chunks do not have the optional [Sparse Map Size] nor [Sparse Map]. + * **XB_CHUNK_TYPE_SPARSE = 'S'** - This is a Sparse map chunk. Those chunks have data and a mapping where data should be skipped. + * **XB_CHUNK_TYPE_EOF = 'E'** - This is an End Of File chunk. Those chunks indicate that all the data for this particular file have been received and the file can be closed. + +`Path Length` + +4 Bytes - Indicates the length of file path. + +`Path` + +Variable Bytes - Stores the path of the file in which payload and/or sparse map should be written to + +`Sparse Map Size` + +4 bytes - Indicates the size of Sparse Map. Only present on **XB_CHUNK_TYPE_SPARSE**. + +`Payload size` + +8 bytes - Indicates the size of payload field. + +`Payload offset` + +8 bytes - Indicates the offset in which payload needs to be applied on the file. + +`Checksum` + +4 bytes - a CRC32 ISO 3309 calculation of sparse map and payload. + +`Sparse map` + +Variable bytes - mapping of offset and size where wholes should be inserted on files. + +`Payload` + +Variable bytes - Payload of `Payload size` to be written at `Payload offset` on `Path` file. + + +Sparse Map +------ +Sparse consists in a mapping of skip and len, and work aligned with Payload. We should iterate through all the sparse map and: + +1. Advance file position by `Skip` bytes +2. Write `Len` bytes from Payload +3. Advance payload by `Len` + +In some systems, such as XFS, is advised to punch a hole via fallocate. + +Examples +------ +Here are a few examples of manually reading xbstream file. +### XB_CHUNK_TYPE_SPARSE + +``` +# Magic +$ xxd -b -l8 -c8 sparse.xbs +00000000: 01011000 01000010 01010011 01010100 01000011 01001011 00110000 00110001 XBSTCK01 + +# Flags +$ xxd -b -l1 -s 8 sparse.xbs +00000008: 00000000 + +# Type +$ xxd -b -l1 -s 9 sparse.xbs +00000009: 01010011 S + +# Path length - Result 11 bytes +$ xxd -b -l4 -s 10 sparse.xbs +0000000a: 00001011 00000000 00000000 00000000 .... + +# Path +$ xxd -b -l11 -s 14 sparse.xbs +0000000e: 01110100 01100101 01110011 01110100 00101111 01110100 test/t +00000014: 00110001 00101110 01101001 01100010 01100100 1.ibd + +# Sparse Map Size - Result 5 +$ xxd -b -l4 -s 25 sparse.xbs +00000019: 00000101 00000000 00000000 00000000 .... + +# Payload size - Result 50991 bytes +$ xxd -b -l8 -s 29 sparse.xbs +0000001d: 00101111 11000111 00000000 00000000 00000000 00000000 /..... +00000023: 00000000 00000000 .. + +# Payload offset - Result 0 +$ xxd -b -l8 -s 37 sparse.xbs +00000025: 00000000 00000000 00000000 00000000 00000000 00000000 ...... +0000002b: 00000000 00000000 .. + +# Checksum +$ xxd -b -l4 -s 45 sparse.xbs +0000002d: 10010111 11101111 11011111 10010010 .... + +# Sparse Map +## 1 (skip 0, len 16474) +$ xxd -b -l8 -s 49 sparse.xbs +00000031: 00000000 00000000 00000000 00000000 01011010 01000000 ....Z@ +00000037: 00000000 00000000 .. + +## 2 (skip 16294, len 152) +$ xxd -b -l8 -s 57 sparse.xbs +00000039: 10100110 00111111 00000000 00000000 10011000 00000000 .?.... +0000003f: 00000000 00000000 .. + +## 3 (skip 16232, len 1450) +$ xxd -b -l8 -s 65 sparse.xbs +00000041: 01101000 00111111 00000000 00000000 10101010 00000101 h?.... +00000047: 00000000 00000000 + +## 4 (skip 14934, len 147) +$ xxd -b -l8 -s 73 sparse.xbs +00000049: 01010110 00111010 00000000 00000000 10010011 00000000 V:.... +0000004f: 00000000 00000000 + +## 5 (skip 16237, len 32768) +$ xxd -b -l8 -s 81 sparse.xbs +00000051: 01101101 00111111 00000000 00000000 00000000 10000000 m?.... +00000057: 00000000 00000000 + +# Payload +xxd -b -l50991 -s 89 sparse.xbs +``` + +### XB_CHUNK_TYPE_PAYLOAD + +``` +# Magic +$ xxd -b -l8 -c8 file.xbs +00000000: 01011000 01000010 01010011 01010100 01000011 01001011 00110000 00110001 XBSTCK01 + +# Flags +$ xxd -b -l1 -s8 file.xbs +00000008: 00000000 . + +# Type +$ xxd -b -l1 -s9 file.xbs +00000009: 01010000 P + +# Path length - Result 7 bytes +$ xxd -b -l4 -s10 file.xbs +0000000a: 00000111 00000000 00000000 00000000 .... + +# Path +$ xxd -b -l7 -s14 file.xbs +0000000e: 01101001 01100010 01100100 01100001 01110100 01100001 ibdata +00000014: 00110001 1 + +# Payload size - Result 10485760 bytes +$ xxd -b -l8 -s21 file.xbs +00000015: 00000000 00000000 10100000 00000000 00000000 00000000 ...... +0000001b: 00000000 00000000 .. + +# Payload offset - Result 0 +$ xxd -b -l8 -s29 file.xbs +0000001d: 00000000 00000000 00000000 00000000 00000000 00000000 ...... +00000023: 00000000 00000000 .. + +# Checksum +$ xxd -b -l4 -s37 file.xbs +00000025: 10000011 01000110 11010110 00100000 .F. + +# Payload +$ xxd -b -l10485760 -s41 file.xbs +``` + +### XB_CHUNK_TYPE_EOF + +``` +# Magic +$ xxd -b -l8 -s 12582994 file.xbs +00c00052: 01011000 01000010 01010011 01010100 01000011 01001011 XBSTCK +00c00058: 00110000 00110001 01 + +# Flags +$ xxd -b -l1 -s 12583002 file.xbs +00c0005a: 00000000 . + +# Type +$ xxd -b -l1 -s 12583003 file.xbs +00c0005b: 01000101 E + +# Path length - Result 7 bytes +$ xxd -b -l4 -s 12583004 file.xbs +00c0005c: 00000111 00000000 00000000 00000000 .... + +# Path +$ xxd -b -l7 -s 12583008 file.xbs +00c00060: 01101001 01100010 01100100 01100001 01110100 01100001 ibdata +00c00066: 00110001 1 +``` + diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup-files.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup-files.rst new file mode 100644 index 000000000000..d17a8b238727 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup-files.rst @@ -0,0 +1,86 @@ +.. _xtrabackup_files : + +============================================ +Index of files created by Percona XtraBackup +============================================ + +* Information related to the backup and the server + + * :file:`backup-my.cnf` + This file contains information to start the mini instance of InnoDB + during the :option:`--prepare`. This is **NOT** a backup of + original :file:`my.cnf`. The InnoDB configuration is read from the file + :file:`backup-my.cnf` created by *xtrabackup* when the backup was + made. :option:`--prepare` uses InnoDB configuration from + ``backup-my.cnf`` by default, or from + :option:`--defaults-file`, if specified. InnoDB + configuration in this context means server variables that affect data + format, i.e. ``innodb_page_size`` option, + ``innodb_log_block_size``, etc. Location-related variables, like + ``innodb_log_group_home_dir`` or ``innodb_data_file_path`` + are always ignored by :option:`--prepare`, so preparing + a backup always works with data files from the backup directory, rather + than any external ones. + + * :file:`xtrabackup_checkpoints` + The type of the backup (e.g. full or incremental), its state (e.g. + prepared) and the LSN range contained in it. This information is used + for incremental backups. + Example of the :file:`xtrabackup_checkpoints` after taking a full + backup: + + .. code-block:: text + + backup_type = full-backuped + from_lsn = 0 + to_lsn = 15188961605 + last_lsn = 15188961605 + + Example of the :file:`xtrabackup_checkpoints` after taking an incremental + backup: + + .. code-block:: text + + backup_type = incremental + from_lsn = 15188961605 + to_lsn = 15189350111 + last_lsn = 15189350111 + + * :file:`xtrabackup_binlog_info` + The binary log file used by the server and its position at the moment of the backup. A result of the following query: + .. sourcecode:: mysql + + SELECT server_uuid, local, replication, storage_engines FROM performance_schema.log_status; + + * :file:`xtrabackup_binary` + The *xtrabackup* binary used in the process. + + * :file:`xtrabackup_logfile` + Contains data needed for running the: :option:`--prepare`. + The bigger this file is the :option:`--prepare` process + will take longer to finish. + + * :file:`.delta.meta` + This file is going to be created when performing the incremental backup. + It contains the per-table delta metadata: page size, size of compressed + page (if the value is 0 it means the tablespace isn't compressed) and + space id. Example of this file could looks like this: + + .. code-block:: text + + page_size = 16384 + zip_size = 0 + space_id = 0 + +* Information related to the replication environment (if using the + :option:`--slave-info` option): + + * :file:`xtrabackup_slave_info` + The ``CHANGE MASTER`` statement needed for setting up a replica. + +* Information related to the *Galera* and *Percona XtraDB Cluster* (if using + the :option:`--galera-info` option): + + * :file:`xtrabackup_galera_info` + Contains the values of ``wsrep_local_state_uuid`` and + ``wsrep_last_committed`` status variables diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/analyzing_table_statistics.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/analyzing_table_statistics.rst new file mode 100644 index 000000000000..91889854c4ec --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/analyzing_table_statistics.rst @@ -0,0 +1,137 @@ +.. _pxb.xtrabackup.table-statistics.analyzing: + +================================================================================ + Analyzing Table Statistics +================================================================================ + +The *xtrabackup* binary can analyze InnoDB data files in read-only mode to give +statistics about them. To do this, you should use the :option:`--stats` +option. You can combine this with the :option:`--tables` option to limit the +files to examine. It also uses the :option:`--use-memory` option. + +You can perform the analysis on a running server, with some chance of errors due +to the data being changed during analysis. Or, you can analyze a backup copy of +the database. Either way, to use the statistics feature, you need a clean copy +of the database including correctly sized log files, so you need to execute with +:option:`--prepare` twice to use this functionality on a backup. + +The result of running on a backup might look like the following: :: + + + table: test/table1, index: PRIMARY, space id: 12, root page 3 + estimated statistics in dictionary: + key vals: 25265338, leaf pages 497839, size pages 498304 + real statistics: + level 2 pages: pages=1, data=5395 bytes, data/pages=32% + level 1 pages: pages=415, data=6471907 bytes, data/pages=95% + leaf pages: recs=25958413, pages=497839, data=7492026403 bytes, data/pages=91% + +This can be interpreted as follows: + +* The first line simply shows the table and index name and its internal + identifiers. If you see an index named ``GEN_CLUST_INDEX``, that is the + table's clustered index, automatically created because you did not explicitly + create a ``PRIMARY KEY``. +* The estimated statistics in dictionary information is similar to the data + that's gathered through ``ANALYZE TABLE`` inside of *InnoDB* to be stored as + estimated cardinality statistics and passed to the query optimizer. +* The real statistics information is the result of scanning the data pages and + computing exact information about the index. +* ``The level pages``: output means that the line shows information about + pages at that level in the index tree. The larger ```` is, the farther it + is from the leaf pages, which are level 0. The first line is the root page. +* The ``leaf pages`` output shows the leaf pages, of course. This is where the + table's data is stored. +* The ``external pages``: output (not shown) shows large external pages that + hold values too long to fit in the row itself, such as long ``BLOB`` and + ``TEXT`` values. +* The ``recs`` is the real number of records (rows) in leaf pages. +* The ``pages`` is the page count. +* The ``data`` is the total size of the data in the pages, in bytes. +* The ``data/pages`` is calculated as (``data`` / (``pages`` * ``PAGE_SIZE``)) * + 100%. It will never reach 100% because of space reserved for page headers and + footers. + +A more detailed example is posted as a MySQL Performance Blog `post +`_. + +Script to Format Output +================================================================================ + +The following script can be used to summarize and tabulate the output of the +statistics information: :: + + tabulate-xtrabackup-stats.pl + + #!/usr/bin/env perl + use strict; + use warnings FATAL => 'all'; + my $script_version = "0.1"; + + my $PG_SIZE = 16_384; # InnoDB defaults to 16k pages, change if needed. + my ($cur_idx, $cur_tbl); + my (%idx_stats, %tbl_stats); + my ($max_tbl_len, $max_idx_len) = (0, 0); + while ( my $line = <> ) { + if ( my ($t, $i) = $line =~ m/table: (.*), index: (.*), space id:/ ) { + $t =~ s!/!.!; + $cur_tbl = $t; + $cur_idx = $i; + if ( length($i) > $max_idx_len ) { + $max_idx_len = length($i); + } + if ( length($t) > $max_tbl_len ) { + $max_tbl_len = length($t); + } + } + elsif ( my ($kv, $lp, $sp) = $line =~ m/key vals: (\d+), \D*(\d+), \D*(\d+)/ ) { + @{$idx_stats{$cur_tbl}->{$cur_idx}}{qw(est_kv est_lp est_sp)} = ($kv, $lp, $sp); + $tbl_stats{$cur_tbl}->{est_kv} += $kv; + $tbl_stats{$cur_tbl}->{est_lp} += $lp; + $tbl_stats{$cur_tbl}->{est_sp} += $sp; + } + elsif ( my ($l, $pages, $bytes) = $line =~ m/(?:level (\d+)|leaf) pages:.*pages=(\d+), data=(\d+) bytes/ ) { + $l ||= 0; + $idx_stats{$cur_tbl}->{$cur_idx}->{real_pages} += $pages; + $idx_stats{$cur_tbl}->{$cur_idx}->{real_bytes} += $bytes; + $tbl_stats{$cur_tbl}->{real_pages} += $pages; + $tbl_stats{$cur_tbl}->{real_bytes} += $bytes; + } + } + + my $hdr_fmt = "%${max_tbl_len}s %${max_idx_len}s %9s %10s %10s\n"; + my @headers = qw(TABLE INDEX TOT_PAGES FREE_PAGES PCT_FULL); + printf $hdr_fmt, @headers; + + my $row_fmt = "%${max_tbl_len}s %${max_idx_len}s %9d %10d %9.1f%%\n"; + foreach my $t ( sort keys %tbl_stats ) { + my $tbl = $tbl_stats{$t}; + printf $row_fmt, $t, "", $tbl->{est_sp}, $tbl->{est_sp} - $tbl->{real_pages}, + $tbl->{real_bytes} / ($tbl->{real_pages} * $PG_SIZE) * 100; + foreach my $i ( sort keys %{$idx_stats{$t}} ) { + my $idx = $idx_stats{$t}->{$i}; + printf $row_fmt, $t, $i, $idx->{est_sp}, $idx->{est_sp} - $idx->{real_pages}, + $idx->{real_bytes} / ($idx->{real_pages} * $PG_SIZE) * 100; + } + } + +.. rubric:: Sample Script Output + +The output of the above Perl script, when run against the sample shown in the +previously mentioned blog post, will appear as follows: :: + + TABLE INDEX TOT_PAGES FREE_PAGES PCT_FULL + art.link_out104 832383 38561 86.8% + art.link_out104 PRIMARY 498304 49 91.9% + art.link_out104 domain_id 49600 6230 76.9% + art.link_out104 domain_id_2 26495 3339 89.1% + art.link_out104 from_message_id 28160 142 96.3% + art.link_out104 from_site_id 38848 4874 79.4% + art.link_out104 revert_domain 153984 19276 71.4% + art.link_out104 site_message 36992 4651 83.4% + +The columns are the table and index, followed by the total number of pages in +that index, the number of pages not actually occupied by data, and the number of +bytes of real data as a percentage of the total size of the pages of real +data. The first line in the above output, in which the ``INDEX`` column is +empty, is a summary of the entire table. diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.accelerating.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.accelerating.rst new file mode 100644 index 000000000000..86ce5e549f48 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.accelerating.rst @@ -0,0 +1,69 @@ +.. _pxb.xtrabackup.accelerating: + +================================================================================ +Accelerating the backup process +================================================================================ + +.. rubric:: Copying with the :option:`--parallel` and `--compress-threads` Options + +When making a local or streaming backup with *xbstream* option, multiple files +can be copied at the same time when using the :option:`--parallel` option. This +option specifies the number of threads created by *xtrabackup* to copy data +files. + +To take advantage of this option either the multiple tablespaces option must be +enabled (:term:`innodb_file_per_table`) or the shared tablespace must be stored +in multiple :term:`ibdata` files with the :term:`innodb_data_file_path` option. +Having multiple files for the database (or splitting one into many) doesn't have +a measurable impact on performance. + +As this feature is implemented **at the file level**, concurrent file transfer +can sometimes increase I/O throughput when doing a backup on highly fragmented +data files, due to the overlap of a greater number of random read requests. You +should consider tuning the filesystem also to obtain the maximum performance +(e.g. checking fragmentation). + +If the data is stored on a single file, this option will have no effect. + +To use this feature, simply add the option to a local backup, for example: + +.. code-block:: bash + + $ xtrabackup --backup --parallel=4 --target-dir=/path/to/backup + +By using the *xbstream* in streaming backups, you can additionally speed up the +compression process with the :option:`--compress-threads` option. This option +specifies the number of threads created by *xtrabackup* for for parallel data +compression. The default value for this option is 1. + +To use this feature, simply add the option to a local backup, for example: + +.. code-block:: bash + + $ xtrabackup --backup --stream=xbstream --compress --compress-threads=4 --target-dir=./ > backup.xbstream + +Before applying logs, compressed files will need to be uncompressed. + +.. rubric:: The :option:`--rsync` Option + +In order to speed up the backup process and to minimize the time ``FLUSH TABLES +WITH READ LOCK`` is blocking the writes, the option :option:`--rsync` should be +used. When this option is specified, *xtrabackup* uses ``rsync`` to copy all +non-InnoDB files instead of spawning a separate ``cp`` for each file, which can +be much faster for servers with a large number of databases or +tables. *xtrabackup* will call the ``rsync`` twice, once before the ``FLUSH +TABLES WITH READ LOCK`` and once during to minimize the time the read lock is +being held. During the second ``rsync`` call, it will only synchronize the +changes to non-transactional data (if any) since the first call performed before +the ``FLUSH TABLES WITH READ LOCK``. Note that *Percona XtraBackup* will use +`Backup locks +`_ +where available as a lightweight alternative to ``FLUSH TABLES WITH READ +LOCK``. This feature is available in *Percona Server for MySQL* 5.6+. *Percona XtraBackup* +uses this automatically to copy non-InnoDB data to avoid blocking DML queries +that modify InnoDB tables. + +.. note:: + + This option cannot be used together with the :option:`--stream` option. + diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.encrypting.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.encrypting.rst new file mode 100644 index 000000000000..8453a21ee432 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.encrypting.rst @@ -0,0 +1,127 @@ +.. _pxb.xtrabackup.encrypting: + +================================================================================ + Encrypting Backups +================================================================================ + +*Percona XtraBackup* supports encrypting and decrypting local and streaming +backups with *xbstream* option adding another layer of protection. The +encryption is implemented using the ``libgcrypt`` library from GnuPG. + +Creating Encrypted Backups +================================================================================ + +To make an encrypted backup the following options need to be specified (options +:option:`--encrypt-key` and :option:`--encrypt-key-file` are mutually exclusive, +i.e. just one of them needs to be provided): + +- :option:`--encrypt` +- :option:` --encrypt-key` +- :option:` --encrypt-key-file` + +Both the :option:`--encrypt-key` option and +:option:`--encrypt-key-file` option can be used to specify the +encryption key. An encryption key can be generated with a command like +:bash:`openssl rand -base64 32` + +Example output of that command should look like this: :: + + U2FsdGVkX19VPN7VM+lwNI0fePhjgnhgqmDBqbF3Bvs= + +This value then can be used as the encryption key + +The :option:`--encrypt-key` Option +-------------------------------------------------------------------------------- + +Example of the *xtrabackup* command using the :option:`--encrypt-key` should +look like this: + +.. code-block:: bash + + $ xtrabackup --backup --encrypt=AES256 --encrypt-key="U2FsdGVkX19VPN7VM+lwNI0fePhjgnhgqmDBqbF3Bvs=" --target-dir=/data/backup + + +The :option:`--encrypt-key-file` Option +-------------------------------------------------------------------------------- + +Use the :option:`--encrypt-key-file` option as follows: + +.. code-block:: bash + + $ xtrabackup --backup --encrypt=AES256 --encrypt-key-file=/data/backups/keyfile --target-dir=/data/backup + +.. note:: + + Depending on the text editor that you use to make the ``KEYFILE``, + the editor can automatically insert the CRLF (end of line) + character. This will cause the key size to grow and thus making it + invalid. The suggested way to create the file is by using the + command line: :bash:`echo -n "U2FsdGVkX19VPN7VM+lwNI0fePhjgnhgqmDBqbF3Bvs=" > /data/backups/keyfile`. + +Optimizing the encryption process +================================================================================ + +Two new options are available for encrypted backups that can be used to speed up +the encryption process. These are :option:`--encrypt-threads` and +:option:`--encrypt-chunk-size`. By using the :option:`--encrypt-threads` option +multiple threads can be specified to be used for encryption in parallel. Option +:option:`--encrypt-chunk-size` can be used to specify the size (in bytes) of the +working encryption buffer for each encryption thread (default is 64K). + +Decrypting Encrypted Backups +================================================================================ + +Backups can be decrypted with :ref:`xbcrypt`. The following one-liner can be +used to encrypt the whole folder: :: + + $ for i in `find . -iname "*\.xbcrypt"`; do xbcrypt -d --encrypt-key-file=/root/secret_key --encrypt-algo=AES256 < $i > $(dirname $i)/$(basename $i .xbcrypt) && rm $i; done + +*Percona XtraBackup* :option:`--decrypt` option has been implemented that can be +used to decrypt the backups: + +.. code-block:: bash + + $ xtrabackup --decrypt=AES256 --encrypt-key="U2FsdGVkX19VPN7VM+lwNI0fePhjgnhgqmDBqbF3Bvs=" --target-dir=/data/backup/ + +*Percona XtraBackup* doesn't automatically remove the encrypted files. In order +to clean up the backup directory users should remove the :file:`*.xbcrypt` +files. + +.. note:: + + :option:`--parallel` can be used with :option:`--decrypt` option to decrypt + multiple files simultaneously. + +When the files are decrypted, the backup can be prepared. + +Preparing Encrypted Backups +================================================================================ + +After the backups have been decrypted, they can be prepared in the same way as +the standard full backups with the :option:`--prepare` option: + +.. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/backup/ + +Restoring Encrypted Backups +================================================================================ + +*xtrabackup* offers the :option:`--copy-back` option to restore a backup to the +server's :term:`datadir`: + +.. code-block:: bash + + $ xtrabackup --copy-back --target-dir=/data/backup/ + +It will copy all the data-related files back to the server's :term:`datadir`, +determined by the server's :file:`my.cnf` configuration file. You should check +the last line of the output for a success message:: + + 150318 11:08:13 xtrabackup: completed OK! + +.. seealso:: + + GnuPG Documentation: ``libgcrypt`` library + http://www.gnupg.org/documentation/manuals/gcrypt/ + diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.history.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.history.rst new file mode 100644 index 000000000000..9b04921dc474 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.history.rst @@ -0,0 +1,108 @@ +.. _pxb.xtrabackup.history.storing: + +================================================================================ +Store backup history on the server +================================================================================ + +*Percona XtraBackup* supports storing the backups history on the server. This +feature was implemented in *Percona XtraBackup* 2.2. Storing backup history on +the server was implemented to provide users with additional information about +backups that are being taken. Backup history information will be stored in the +:ref:`PERCONA_SCHEMA.XTRABACKUP_HISTORY ` table. + +To use this feature the following options are available: + +* :option:`--history` = : This option enables the history + feature and allows the user to specify a backup series name that will be + placed within the history record. +* :option:`--incremental-history-name` = : This option allows an + incremental backup to be made based on a specific history series by + name. *xtrabackup* will search the history table looking for the most recent + (highest ``to_lsn``) backup in the series and take the ``to_lsn`` value to use + as it's starting lsn. This is mutually exclusive with + :option:`--incremental-history-uuid`, :option:`--incremental-basedir` and + :option:`--incremental-lsn` options. If no valid LSN can be found + (no series by that name) *xtrabackup* will return with an error. +* :option:`--incremental-history-uuid` = : Allows an incremental backup to + be made based on a specific history record identified by UUID. *xtrabackup* + will search the history table looking for the record matching UUID and take + the ``to_lsn`` value to use as it's starting LSN. This options is mutually + exclusive with :option:`--incremental-basedir`, :option:`--incremental-lsn` + and :option:`--incremental-history-name` options. If no valid LSN can be found + (no record by that UUID or missing ``to_lsn``), *xtrabackup* will return + with an error. + +.. note:: + + Backup that's currently being performed will **NOT** exist in the + xtrabackup_history table within the resulting backup set as the record will + not be added to that table until after the backup has been taken. + +If you want access to backup history outside of your backup set in the case of +some catastrophic event, you will need to either perform a ``mysqldump``, +partial backup or ``SELECT`` * on the history table after *xtrabackup* +completes and store the results with you backup set. + +For the necessary privileges, see :ref:`pxb.privilege`. + +.. _xtrabackup_history: + +.. rubric:: PERCONA_SCHEMA.XTRABACKUP_HISTORY table + + +This table contains the information about the previous server +backups. Information about the backups will only be written if the backup was +taken with :option:`--history` option. + +.. list-table:: + :header-rows: 1 + :widths: 20 40 + + * - Column Name + - Description + * - uuid + - Unique backup id + * - name + - User provided name of backup series. There may be multiple entries with the same name used to identify related backups in a series. + * - tool_name + - Name of tool used to take backup + * - tool_command + - Exact command line given to the tool with --password and --encryption_key obfuscated + * - tool_version + - Version of tool used to take backup + * - ibbackup_version + - Version of the xtrabackup binary used to take backup + * - server_version + - Server version on which backup was taken + * - start_time + - Time at the start of the backup + * - end_time + - Time at the end of the backup + * - lock_time + - Amount of time, in seconds, spent calling and holding locks for ``FLUSH TABLES WITH READ LOCK`` + * - binlog_pos + - Binlog file and position at end of ``FLUSH TABLES WITH READ LOCK`` + * - innodb_from_lsn + - LSN at beginning of backup which can be used to determine prior backups + * - innodb_to_lsn + - LSN at end of backup which can be used as the starting lsn for the next incremental + * - partial + - Is this a partial backup, if ``N`` that means that it's the full backup + * - incremental + - Is this an incremental backup + * - format + - Description of result format (``xbstream``) + * - compact + - Is this a compact backup + * - compressed + - Is this a compressed backup + * - encrypted + - Is this an encrypted backup + +.. rubric:: Limitations + +* :option:`--history` option must be specified only on the command + line and not within a configuration file in order to be effective. +* :option:`--incremental-history-name` and :option:`--incremental-history-uuid` + options must be specified only on the command line and not within + a configuration file in order to be effective. diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.streaming.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.streaming.rst new file mode 100644 index 000000000000..eb18ffa791a1 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/backup.streaming.rst @@ -0,0 +1,46 @@ +.. _pxb.xtrabackup.streaming: + +================================================================================ +Streaming Backups +================================================================================ + +**Percona XtraBackup** supports streaming mode. Streaming mode sends a backup to ``STDOUT`` in the *xbstream* format instead of copying the files to the backup directory. + +This method allows you to use other programs to filter the output of the backup, +providing greater flexibility for storage of the backup. For example, +compression is achieved by piping the output to a compression utility. One of +the benefits of streaming backups and using Unix pipes is that the backups can +be automatically encrypted. + +To use the streaming feature, you must use the :option:`--stream`, +providing the format of the stream (``xbstream`` ) and where to store +the temporary files:: + + $ xtrabackup --stream=xbstream --target-dir=/tmp + +*xtrabackup* uses *xbstream* to stream all of the data files to ``STDOUT``, in a +special ``xbstream`` format. After it finishes streaming all of the data files +to ``STDOUT``, it stops xtrabackup and streams the saved log file too. + +.. seealso:: + + More information about *xbstream* + :ref:`xbstream_binary` + +When compression is enabled, *xtrabackup* compresses the output data, except for the meta and non-InnoDB files which are not compressed, using the specified +compression algorithm. The only currently supported algorithm is +``quicklz``. The resulting files have the ``qpress`` archive format, i.e. every +\*.qp file produced by xtrabackup is essentially a one-file qpress archive and +can be extracted and uncompressed by the `qpress file archiver +`_ which is available from :ref:`Percona Software +repositories `. + +Using *xbstream* as a stream option, backups can be copied and compressed in +parallel. This option can significantly improve the speed of the backup process. In case backups +were both compressed and encrypted, they must be decrypted before they are uncompressed. + +.. include:: ../.res/contents/example.xbstream.txt + +Note that the streamed backup will need to be prepared before +restoration. Streaming mode does not prepare the backup. + diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/flush-tables-with-read-lock.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/flush-tables-with-read-lock.rst new file mode 100644 index 000000000000..43cf23a00890 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/flush-tables-with-read-lock.rst @@ -0,0 +1,117 @@ +.. _pxb.xtrabackup.flush-tables-with-read-lock: + +================================================================================ +``FLUSH TABLES WITH READ LOCK`` option +================================================================================ + +The ``FLUSH TABLES WITH READ LOCK`` option does the following with a global read lock: + +* Closes all open tables + +* Locks all tables for all databases + +Release the lock with ``UNLOCK TABLES``. + +.. note:: + + ``FLUSH TABLES WITH READ LOCK`` does not prevent inserting rows into the log tables. + + +To ensure consistent backups, use the ``FLUSH TABLES WITH READ LOCK`` option before taking a non-InnoDB file backup. The option does not affect long-running queries. + +Long-running queries with ``FLUSH TABLES WITH READ LOCK`` enabled can leave the server in a read-only mode until the queries finish. Killing the ``FLUSH TABLES WITH READ LOCK`` does not help if the database is in either the ``Waiting for table flush`` or ``Waiting for master to send event`` state. To return to normal operation, you must kill any long-running queries. + +.. note:: + + All described in this section has no effect when backup locks are + used. *Percona XtraBackup* will use `Backup locks + `_ + where available as a lightweight alternative to ``FLUSH TABLES WITH READ + LOCK``. This feature is available in *Percona Server for MySQL* 5.6+. + *Percona XtraBackup* uses this automatically to copy non-InnoDB data to avoid blocking + DML queries that modify InnoDB tables. + +In order to prevent this from happening two things have been implemented: + +* *xtrabackup* waits for a good moment to issue the global lock +* *xtrabackup* kills all queries or only the SELECT queries which prevent the + global lock from being acquired + +Waiting for queries to finish +================================================================================ + +You should issue a global lock when no long queries are running. Waiting to issue the global lock for extended period of time is not a good method. The wait can extend the time needed for +backup to take place. The `--ftwrl-wait-timeout` option can limit the +waiting time. If it cannot issue the lock during this +time, *xtrabackup* stops the option, exits with an error message, and backup is +not be taken. + +The default value for this option is zero (0) value which turns off the option. + +Another possibility is to specify the type of query to wait on. In this case +:option:`--ftwrl-wait-query-type`. Possible values are ``all`` and +``update``. When ``all`` is used *xtrabackup* will wait for all long running +queries (execution time longer than allowed by :option:`--ftwrl-wait-threshold`) +to finish before running the ``FLUSH TABLES WITH READ LOCK``. When ``update`` is +used *xtrabackup* will wait on ``UPDATE/ALTER/REPLACE/INSERT`` queries to +finish. + +The time needed for a specific query to complete is hard to predict. We assume that the long-running queries will not finish in a timely manner. Other queries which run for a short time finish quickly. *xtrabackup* uses the value of +`--ftwrl-wait-threshold` option to specify the long-running queries +and will block a global lock. In order to use this option +xtrabackup user should have ``PROCESS`` and ``SUPER`` privileges. + +Killing the blocking queries +================================================================================ + +The second option is to kill all the queries which prevent from acquiring the +global lock. In this case, all queries which run longer than ``FLUSH TABLES WITH +READ LOCK`` are potential blockers. Although all queries can be killed, +additional time can be specified for the short running queries to finish using +the :option:`--kill-long-queries-timeout` option. This option +specifies the time for queries to complete, after the value is reached, all the +running queries will be killed. The default value is zero, which turns this +feature off. + +The :option:`--kill-long-query-type` option can be used to specify all or only +``SELECT`` queries that are preventing global lock from being acquired. In order +to use this option xtrabackup user should have ``PROCESS`` and ``SUPER`` +privileges. + +Options summary +================================================================================ + +* :option:`--ftwrl-wait-timeout` (seconds) - how long to wait for a + good moment. Default is 0, not to wait. +* :option:`--ftwrl-wait-query-type` - which long queries + should be finished before ``FLUSH TABLES WITH READ LOCK`` is run. Default is + all. +* :option:`--ftwrl-wait-threshold` (seconds) - how long query + should be running before we consider it long running and potential blocker of + global lock. +* :option:`--kill-long-queries-timeout` (seconds) - how many time + we give for queries to complete after ``FLUSH TABLES WITH READ LOCK`` is + issued before start to kill. Default if ``0``, not to kill. +* :option:`--kill-long-query-type` - which queries should be killed once + ``kill-long-queries-timeout`` has expired. + +Example +-------------------------------------------------------------------------------- + +Running the *xtrabackup* with the following options will cause *xtrabackup* +to spend no longer than 3 minutes waiting for all queries older than 40 seconds +to complete. + +.. code-block:: bash + + $ xtrabackup --backup --ftwrl-wait-threshold=40 \ + --ftwrl-wait-query-type=all --ftwrl-wait-timeout=180 \ + --kill-long-queries-timeout=20 --kill-long-query-type=all \ + --target-dir=/data/backups/ + + +After ``FLUSH TABLES WITH READ LOCK`` is issued, *xtrabackup* will wait for 20 +seconds for lock to be acquired. If lock is still not acquired after 20 seconds, +it will kill all queries which are running longer that the ``FLUSH TABLES WITH +READ LOCK``. + diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/implementation_details.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/implementation_details.rst new file mode 100644 index 000000000000..3748e06ce9de --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/implementation_details.rst @@ -0,0 +1,53 @@ +.. _pxb.xtrabackup.implementation: + +================================================================================ + Implementation Details +================================================================================ + +This page contains notes on various internal aspects of the *xtrabackup* tool\'s +operation. + +File Permissions +================================================================================ + +*xtrabackup* opens the source data files in read-write mode, although it does +not modify the files. This means that you must run *xtrabackup* as a user who +has permission to write the data files. The reason for opening the files in +read-write mode is that *xtrabackup* uses the embedded *InnoDB* libraries to +open and read the files, and *InnoDB* opens them in read-write mode because it +normally assumes it is going to write to them. + +Tuning the OS Buffers +================================================================================ + +Because *xtrabackup* reads large amounts of data from the filesystem, it uses +``posix_fadvise()`` where possible, to instruct the operating system not to try +to cache the blocks it reads from disk. Without this hint, the operating system +would prefer to cache the blocks, assuming that ``xtrabackup`` is likely to need +them again, which is not the case. Caching such large files can place pressure +on the operating system's virtual memory and cause other processes, such as the +database server, to be swapped out. The ``xtrabackup`` tool avoids this with the +following hint on both the source and destination files: :: + + posix_fadvise(file, 0, 0, POSIX_FADV_DONTNEED) + +In addition, xtrabackup asks the operating system to perform more aggressive +read-ahead optimizations on the source files: :: + + posix_fadvise(file, 0, 0, POSIX_FADV_SEQUENTIAL) + +Copying Data Files +================================================================================ + +When copying the data files to the target directory, *xtrabackup* reads and +writes 1 MB of data at a time. This is not configurable. When copying the log +file, *xtrabackup* reads and writes 512 bytes at a time. This is also not +possible to configure, and matches InnoDB's behavior (workaround exists in +*Percona Server for MySQL* because it has an option to tune +``innodb_log_block_size`` for *XtraDB*, and in that case *Percona XtraBackup* will match the tuning). + +After reading from the files, ``xtrabackup`` iterates over the 1MB buffer a page +at a time, and checks for page corruption on each page with InnoDB's +``buf_page_is_corrupted()`` function. If the page is corrupt, it re-reads and +retries up to 10 times for each page. It skips this check on the doublewrite +buffer. diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/incremental_backups.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/incremental_backups.rst new file mode 100644 index 000000000000..e45c3bf99419 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/incremental_backups.rst @@ -0,0 +1,218 @@ +.. _xb_incremental: + +================================================================================ +Incremental Backups +================================================================================ + +*xtrabackup* supports incremental backups. It copies only the data that has +changed since the last full backup. You can perform many incremental backups +between each full backup, so you can set up a backup process such as a full +backup once a week and an incremental backup every day, or full backups every +day and incremental backups every hour. + +.. note:: Incremental backups on the MyRocks storage engine do not determine if an earlier full backup or incremental backup contains the same files. **Percona XtraBackup** copies all of the MyRocks files each time it takes a backup. + +Incremental backups work because each InnoDB page (usually 16kb in size) +contains a log sequence number, or :term:`LSN`. The :term:`LSN` is the system +version number for the entire database. Each page's :term:`LSN` shows how +recently it was changed. An incremental backup copies each page whose +:term:`LSN` is newer than the previous incremental or full backup's +:term:`LSN`. There are two algorithms in use to find the set of such pages to be +copied. The first one, available with all the server types and versions, is to +check the page :term:`LSN` directly by reading all the data pages. The second +one, available with *Percona Server for MySQL*, is to enable the `changed page tracking +`_ +feature on the server, which will note the pages as they are being changed. This +information will be then written out in a compact separate so-called bitmap +file. The *xtrabackup* binary will use that file to read only the data pages it +needs for the incremental backup, potentially saving many read requests. The +latter algorithm is enabled by default if the *xtrabackup* binary finds the +bitmap file. It is possible to specify :option:`--incremental-force-scan` to +read all the pages even if the bitmap data is available. + +Incremental backups do not actually compare the data files to the previous +backup's data files. In fact, you can use :option:`--incremental-lsn` to perform +an incremental backup without even having the previous backup, if you know its +:term:`LSN`. Incremental backups simply read the pages and compare their +:term:`LSN` to the last backup's :term:`LSN`. You still need a full backup to +recover the incremental changes, however; without a full backup to act as a +base, the incremental backups are useless. + +Creating an Incremental Backup +================================================================================ + +To make an incremental backup, begin with a full backup as usual. The +*xtrabackup* binary writes a file called :file:`xtrabackup_checkpoints` into the +backup's target directory. This file contains a line showing the ``to_lsn``, +which is the database's :term:`LSN` at the end of the backup. :ref:`Create the +full backup ` with a command such as the following: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups/base --datadir=/var/lib/mysql/ + +If you look at the :file:`xtrabackup_checkpoints` file, you should see contents +similar to the following: :: + + backup_type = full-backuped + from_lsn = 0 + to_lsn = 1291135 + +Now that you have a full backup, you can make an incremental backup based on +it. Use a command such as the following: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups/inc1 \ + --incremental-basedir=/data/backups/base --datadir=/var/lib/mysql/ + +The :file:`/data/backups/inc1/` directory should now contain delta files, such +as :file:`ibdata1.delta` and :file:`test/table1.ibd.delta`. These represent the +changes since the ``LSN 1291135``. If you examine the +:file:`xtrabackup_checkpoints` file in this directory, you should see something +similar to the following: :: + + backup_type = incremental + from_lsn = 1291135 + to_lsn = 1291340 + +The meaning should be self-evident. It's now possible to use this directory as +the base for yet another incremental backup: + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups/inc2 \ + --incremental-basedir=/data/backups/inc1 --datadir=/var/lib/mysql/ + +Preparing the Incremental Backups +================================================================================ + +The :option:`--prepare` step for incremental backups is not the same as for +normal backups. In normal backups, two types of operations are performed to make +the database consistent: committed transactions are replayed from the log file +against the data files, and uncommitted transactions are rolled back. You must +skip the rollback of uncommitted transactions when preparing a backup, because +transactions that were uncommitted at the time of your backup may be in +progress, and it is likely that they will be committed in the next incremental +backup. You should use the :option:`--apply-log-only` option to prevent the +rollback phase. + +.. note:: + + If you do not use the :option:`--apply-log-only` option to prevent the + rollback phase, then your incremental backups will be useless. After + transactions have been rolled back, further incremental backups cannot be + applied. + +Beginning with the full backup you created, you can prepare it, and then apply +the incremental differences to it. Recall that you have the following backups: +:: + + /data/backups/base + /data/backups/inc1 + /data/backups/inc2 + +To prepare the base backup, you need to run :option:`--prepare` as usual, but +prevent the rollback phase: :: + + xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base + +The output should end with some text such as the following: :: + + 101107 20:49:43 InnoDB: Shutdown completed; log sequence number 1291135 + +The log sequence number should match the ``to_lsn`` of the base backup, which +you saw previously. + +This backup is actually safe to :ref:`restore ` as-is now, +even though the rollback phase has been skipped. If you restore it and start +*MySQL*, *InnoDB* will detect that the rollback phase was not performed, and it +will do that in the background, as it usually does for a crash recovery upon +start. It will notify you that the database was not shut down normally. + +To apply the first incremental backup to the full backup, you should use the +following command: :: + + xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base \ + --incremental-dir=/data/backups/inc1 + +This applies the delta files to the files in :file:`/data/backups/base`, which +rolls them forward in time to the time of the incremental backup. It then +applies the redo log as usual to the result. The final data is in +:file:`/data/backups/base`, not in the incremental directory. You should see +some output such as the following: :: + + incremental backup from 1291135 is enabled. + xtrabackup: cd to /data/backups/base/ + xtrabackup: This target seems to be already prepared. + xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(1291340) + Applying /data/backups/inc1/ibdata1.delta ... + Applying /data/backups/inc1/test/table1.ibd.delta ... + .... snip + 101107 20:56:30 InnoDB: Shutdown completed; log sequence number 1291340 + +Again, the LSN should match what you saw from your earlier inspection of the +first incremental backup. If you restore the files from +:file:`/data/backups/base`, you should see the state of the database as of the +first incremental backup. + +Preparing the second incremental backup is a similar process: apply the deltas +to the (modified) base backup, and you will roll its data forward in time to the +point of the second incremental backup: :: + + xtrabackup --prepare --target-dir=/data/backups/base \ + --incremental-dir=/data/backups/inc2 + +.. note:: + + :option:`--apply-log-only` should be used when merging all incrementals + except the last one. That's why the previous line doesn't contain the + :option:`--apply-log-only` option. Even if the :option:`--apply-log-only` was + used on the last step, backup would still be consistent but in that case + server would perform the rollback phase. + +If you wish to avoid the notice that *InnoDB* was not shut down normally, when +you applied the desired deltas to the base backup, you can run +:option:`--prepare` again without disabling the rollback phase. + +Restoring Incremental Backups +================================================================================ + +After preparing the incremental backups, the base directory contains the same +data as the full backup. To restoring this backup, you can use this command: +:bash:`xtrabackup --copy-back --target-dir=BASE-DIR` + +You may have to change the ownership as detailed on +:ref:`restoring_a_backup`. + +Incremental Streaming Backups Using xbstream +================================================================================ + +Incremental streaming backups can be performed with the *xbstream* streaming +option. Currently backups are packed in custom **xbstream** format. With this +feature, you need to take a BASE backup as well. + +.. rubric:: Making a base backup + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/data/backups + +.. rubric:: Taking a local backup + +.. code-block:: bash + + $ xtrabackup --backup --incremental-lsn=LSN-number --stream=xbstream --target-dir=./ > incremental.xbstream + +.. rubric:: Unpacking the backup + +.. code-block:: bash + + $ xbstream -x < incremental.xbstream + +.. rubric:: Taking a local backup and streaming it to the remote server and unpacking it + +.. code-block:: bash + + $ xtrabackup --backup --incremental-lsn=LSN-number --stream=xbstream --target-dir=./ + $ ssh user@hostname " cat - | xbstream -x -C > /backup-dir/" diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/lru_dump.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/lru_dump.rst new file mode 100644 index 000000000000..5ecfb7a487ae --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/lru_dump.rst @@ -0,0 +1,27 @@ +================================================================================ +LRU dump backup +================================================================================ + +.. There is a MySQL feature + https://dev.mysql.com/doc/refman/8.0/en/innodb-preload-buffer-pool.html, it + allows to save and restore buffer pool dump. xtrabackup includes saved buffer + pool dump into a backup + + ib_lru_dump should be renamed to ib_buffer_pool and reference is given on mysql docs + on how to enable it + + +*Percona XtraBackup* includes a saved buffer pool dump into a backup to enable +reducing the warm up time. It restores the buffer pool state from +:file:`ib_buffer_pool` file after restart. *Percona XtraBackup* discovers +:file:`ib_buffer_pool` and backs it up automatically. + +.. image:: /_static/lru_dump.png + +If the buffer restore option is enabled in :file:`my.cnf` buffer pool will be in +the warm state after backup is restored. + +.. seealso:: + + *MySQL* Documentation: Saving and Restoring the Buffer Pool State + https://dev.mysql.com/doc/refman/8.0/en/innodb-preload-buffer-pool.html diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/partial_backups.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/partial_backups.rst new file mode 100644 index 000000000000..ebdf15628a14 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/partial_backups.rst @@ -0,0 +1,180 @@ +.. _pxb.partial-backup: + +================================================================================ +Partial Backups +================================================================================ + +*xtrabackup* supports taking partial backups when the +:term:`innodb_file_per_table` option is enabled. There are three ways to create +partial backups: + +1. matching the tables names with a regular expression +2. providing a list of table names in a file +3. providing a list of databases + +.. warning:: + + Do not copy back the prepared backup. + + Restoring partial backups should be done by importing the tables, + not by using the `--copy-back` option. It is not + recommended to run incremental backups after running a partial + backup. + + Although there are some scenarios where restoring can be done by + copying back the files, this may lead to database + inconsistencies in many cases and it is not a recommended way to + do it. + +For the purposes of this manual page, we will assume that there is a database +named ``test`` which contains tables named ``t1`` and ``t2``. + +.. warning:: + + If any of the matched or listed tables is deleted during the backup, + *xtrabackup* will fail. + +Creating Partial Backups +================================================================================ + +There are multiple ways of specifying which part of the whole data is backed up: + +* Use the :option:`--tables` option to list the table names + +* Use the :option:`--tables-file` option to list the tables in a file + +* Use the :option:`--databases` option to list the databases + +* Use the :option:`--databases-file` option to list the databases + +The `--tables` Option +================================================================================ + + +The first method involves the xtrabackup `--tables` option. The option's +value is a regular expression that is matched against the fully-qualified database name and table name using the ``databasename.tablename`` format. + +To back up only tables in the ``test`` database, use the following +command: + +.. code-block:: bash + + $ xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ \ + --tables="^test[.].*" + +To back up only the ``test.t1`` table, use the following command: + +.. code-block:: bash + + $ xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/data/backups/ \ + --tables="^test[.]t1" + +The `--tables-file` Option +================================================================================ + +The ``--tables-file`` option specifies a file that can contain multiple table +names, one table name per line in the file. Only the tables named in the file +will be backed up. Names are matched exactly, case-sensitive, with no pattern or +regular expression matching. The table names must be fully-qualified in +``databasename.tablename`` format. + +.. code-block:: bash + + $ echo "mydatabase.mytable" > /tmp/tables.txt + $ xtrabackup --backup --tables-file=/tmp/tables.txt + +The `--databases` and `--databases-file` options +================================================================================ + +The ` --databases` option accepts a space-separated list of the databases +and tables to backup in the ``databasename[.tablename]`` format. In addition to +this list, make sure to specify the ``mysql``, ``sys``, and + +``performance_schema`` databases. These databases are required when restoring +the databases using `xtrabackup --copy-back`. + +.. note:: + + Tables processed during the --prepare step may also be added to the backup + even if they are not explicitly listed by the parameter if they were created + after the backup started. + +.. code-block:: bash + + $ xtrabackup --databases='mysql sys performance_schema test ...' + +The :option:`--databases-file` Option +====================================================== + +The `--databases-file` option specifies a file that can contain multiple +databases and tables in the ``databasename[.tablename]`` format, one element name per line in the file. Names are matched exactly, case-sensitive, with no pattern or regular expression matching. + + +.. note:: + + Tables processed during the --prepare step may also be added to the backup + even if they are not explicitly listed by the parameter if they were created + after the backup started. + +Preparing Partial Backups +================================================================================ + +The procedure is analogous to :ref:`restoring individual tables +` : apply the logs and use the +`--export` option: + +.. code-block:: bash + + $ xtrabackup --prepare --export --target-dir=/path/to/partial/backup + +When you use the `--prepare` option on a partial backup, you +will see warnings about tables that don't exist. This is because these tables +exist in the data dictionary inside InnoDB, but the corresponding :term:`.ibd` +files don't exist. They were not copied into the backup directory. These tables +will be removed from the data dictionary, and when you restore the backup and +start InnoDB, they will no longer exist and will not cause any errors or +warnings to be printed to the log file. + + + Could not find any file associated with the tablespace ID: 5 + + Use --innodb-directories to find the tablespace files. If that fails then use --innodb-force-recovery=1 to ignore this and to permanently lose all changes to the missing tablespace(s). + + +Restoring Partial Backups +================================================================================ + +Restoring should be done by :ref:`restoring individual tables +` in the partial backup to the server. + +It can also be done by copying back the prepared backup to a "clean" +:term:`datadir` (in that case, make sure to include the ``mysql`` +database) to the datadir you are moving the backup to. A system database can be created with the following: + +.. code-block:: bash + + $ sudo mysql --initialize --user=mysql + +Once you start the server, you may see mysql complaining about missing tablespaces: + +.. sourcecode:: mysql + + 2021-07-19T12:42:11.077200Z 1 [Warning] [MY-012351] [InnoDB] Tablespace 4, name 'test1/t1', file './d2/test1.ibd' is missing! + 2021-07-19T12:42:11.077300Z 1 [Warning] [MY-012351] [InnoDB] Tablespace 4, name 'test1/t1', file './d2/test1.ibd' is missing! + +In order to clean the orphan database from the data dictionary, you must manually create the missing database directory and then ``DROP`` this database from the server. + +Example of creating the missing database: + +.. sourcecode:: bash + + $ mkdir /var/lib/mysql/test1/d2 + +Example of dropping the database from the server: + +.. sourcecode:: mysql + + mysql> DROP DATABASE d2; + Query OK, 2 rows affected (0.5 sec) + + diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/point-in-time-recovery.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/point-in-time-recovery.rst new file mode 100644 index 000000000000..98604d0a3492 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/point-in-time-recovery.rst @@ -0,0 +1,84 @@ +.. _pxb.xtrabackup.point-in-time-recovery: + +================================================================================ +Point-In-Time recovery +================================================================================ + +Recovering up to particular moment in database's history can be done with +*xtrabackup* and the binary logs of the server. + +Note that the binary log contains the operations that modified the database from +a point in the past. You need a full :term:`datadir` as a base, and then you can +apply a series of operations from the binary log to make the data match what it +was at the point in time you want. + +.. code-block:: bash + + $ xtrabackup --backup --target-dir=/path/to/backup + $ xtrabackup --prepare --target-dir=/path/to/backup + +For more details on these procedures, see :ref:`creating_a_backup` and :ref:`preparing_a_backup`. + +Now, suppose that some time has passed, and you want to restore the database to a +certain point in the past, having in mind that there is the constraint of the +point where the snapshot was taken. + +To find out what is the situation of binary logging in the server, execute the +following queries: :: + + mysql> SHOW BINARY LOGS; + +------------------+-----------+ + | Log_name | File_size | + +------------------+-----------+ + | mysql-bin.000001 | 126 | + | mysql-bin.000002 | 1306 | + | mysql-bin.000003 | 126 | + | mysql-bin.000004 | 497 | + +------------------+-----------+ + +and :: + + mysql> SHOW MASTER STATUS; + +------------------+----------+--------------+------------------+ + | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | + +------------------+----------+--------------+------------------+ + | mysql-bin.000004 | 497 | | | + +------------------+----------+--------------+------------------+ + +The first query will tell you which files contain the binary log and the second +one which file is currently being used to record changes, and the current +position within it. Those files are stored usually in the :term:`datadir` +(unless other location is specified when the server is started with the +``--log-bin=`` option). + +To find out the position of the snapshot taken, see the +:file:`xtrabackup_binlog_info` at the backup's directory: :: + + $ cat /path/to/backup/xtrabackup_binlog_info + mysql-bin.000003 57 + +This will tell you which file was used at moment of the backup for the binary +log and its position. That position will be the effective one when you restore +the backup: :: + + $ xtrabackup --copy-back --target-dir=/path/to/backup + +As the restoration will not affect the binary log files (you may need to adjust +file permissions, see :ref:`restoring_a_backup`), the next step is +extracting the queries from the binary log with :command:`mysqlbinlog` starting +from the position of the snapshot and redirecting it to a file :: + + $ mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 \ + --start-position=57 > mybinlog.sql + +Note that if you have multiple files for the binary log, as in the example, you +have to extract the queries with one process, as shown above. + +Inspect the file with the queries to determine which position or date +corresponds to the point-in-time wanted. Once determined, pipe it to the +server. Assuming the point is ``11-12-25 01:00:00``:: + + $ mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 \ + --start-position=57 --stop-datetime="11-12-25 01:00:00" | mysql -u root -p + +and the database will be rolled forward up to that Point-In-Time. diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/replication.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/replication.rst new file mode 100644 index 000000000000..7bf869eb741a --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/replication.rst @@ -0,0 +1,40 @@ +.. _pxb.xtrabackup.relication: + +================================================================================ +Making Backups in Replication Environments +================================================================================ + +There are options specific to back up from a replication replica. + +The :option:`--slave-info` Option +================================================================================ + +This option is useful when backing up a replication replica server. It prints the +binary log position and name of the source server. It also writes this +information to the :file:`xtrabackup_slave_info` file as a ``CHANGE MASTER`` +statement. + +This option is useful for setting up a new replica for this source. +You can start a replica server with this backup and issue the statement saved in the +:file:`xtrabackup_slave_info` file. More details of this procedure can be found +in :ref:`replication_howto`. + +The :option:`--safe-slave-backup` Option +================================================================================ + +In order to assure a consistent replication state, this option stops the replication +SQL thread and waits to start backing up until ``Slave_open_temp_tables`` in +``SHOW STATUS`` is zero. If there are no open temporary tables, the backup will +take place, otherwise the SQL thread will be started and stopped until there are +no open temporary tables. The backup will fail if ``Slave_open_temp_tables`` +does not become zero after :option:`--safe-slave-backup-timeout` +seconds (defaults to 300 seconds). The replication SQL thread will be restarted when +the backup finishes. + +Using this option is always recommended when taking backups from a replica server. + +.. warning:: + + Make sure your replica is a true replica of the source before using it as a + source for backup. A good tool to validate a replica is `pt-table-checksum + `_. diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/restoring_individual_tables.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/restoring_individual_tables.rst new file mode 100644 index 000000000000..6ef4c2eeb549 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/restoring_individual_tables.rst @@ -0,0 +1,94 @@ +.. _export_import_tables: +.. _restoring_individual_tables: +.. _pxb.xtrabackup.table.restoring: + +============================= + Restoring Individual Tables +============================= + +*Percona XtraBackup* can export a table that is contained in its own `.ibd` file. With *Percona XtraBackup*, you can export individual tables from any *InnoDB* database, and import them into *Percona Server for MySQL* with *XtraDB* or *MySQL* 8.0. The source doesn't have to be *XtraDB* or *MySQL* 8.0, but the destination does. This method only works on individual `.ibd` files. + +The following example exports and imports the following table: + +.. code-block:: mysql + + CREATE TABLE export_test ( + a int(11) DEFAULT NULL + ) ENGINE=InnoDB DEFAULT CHARSET=latin1; + +Exporting the Table +================================================================================ + +Created the table in `innodb_file_per_table` mode, so +after taking a backup as usual with the `--backup` option, the +`.ibd` file exists in the target directory: + +.. code-block:: bash + + $ find /data/backups/mysql/ -name export_test.* + /data/backups/mysql/test/export_test.ibd + +when you prepare the backup, add the `--export` option to the +command. Here is an example: + +.. code-block:: bash + + $ xtrabackup --prepare --export --target-dir=/data/backups/mysql/ + +.. note:: + + If you restore an :ref:`encrypted InnoDB tablespace + ` table, add the + keyring file: + + .. code-block:: bash + + $ xtrabackup --prepare --export --target-dir=/tmp/table \ + --keyring-file-data=/var/lib/mysql-keyring/keyring + +Now you should see an `.exp` file in the target directory: + +.. code-block:: bash + + $ find /data/backups/mysql/ -name export_test.* + /data/backups/mysql/test/export_test.exp + /data/backups/mysql/test/export_test.ibd + /data/backups/mysql/test/export_test.cfg + +These three files are the only files required to import the table into a server running +*Percona Server for MySQL* with *XtraDB* or *MySQL* 8.0. In case the server uses `InnoDB +Tablespace Encryption +`_ +adds an additional `.cfp` file which contains the transfer key and an encrypted tablespace key. + +.. note:: + + The `.cfg` metadata file contains an *InnoDB* dictionary dump in a special format. This format is different from the `.exp` one which is + used in *XtraDB* for the same purpose. A `.cfg`` file is not required to import a tablespace to *MySQL* 8.0 or Percona + Server for MySQL 8.0. + + A tablespace is imported successfully even if the table is from + another server, but *InnoDB* performs a schema validation if the corresponding `.cfg` file is located in the same directory. + +Importing the Table +================================================================================ + +On the destination server running *Percona Server for MySQL* with *XtraDB* and +`innodb_import_table_from_xtrabackup +`_ +option enabled, or *MySQL* 8.0, create a table with the same +structure, and then perform the following steps: + +#. Run the :mysql:`ALTER TABLE test.export_test DISCARD TABLESPACE;` + command. If you see the following error, enable + `innodb_file_per_table` and create the table again. + + .. admonition:: Error + + ERROR 1030 (HY000): Got error -1 from storage engine + +#. Copy the exported files to the :dir:`test/` subdirectory of the destination server's data directory + +#. Run :mysql:`ALTER TABLE test.export_test IMPORT TABLESPACE;` + +The table is imported, and you can run a ``SELECT`` to see the imported data. diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/working_with_binary_logs.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/working_with_binary_logs.rst new file mode 100644 index 000000000000..02dabb23d315 --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/working_with_binary_logs.rst @@ -0,0 +1,41 @@ +.. _working_with_binlogs: + +Working with Binary Logs +======================== + +The ``xtrabackup`` binary integrates with the ``log_status table``. This integration enables ``xtrabackup`` to print out the backup's corresponding binary log position, so that you can use this binary log position to provision a new replica or perform point-in-time recovery. + +Finding the Binary Log Position +-------------------------------- + +You can find the binary log position corresponding to a backup after the backup has been taken. If your backup is from a server with binary logging enabled, ``xtrabackup`` creates a file named ``xtrabackup_binlog_info`` in the target directory. This file contains the binary log file name and position of the exact point when the backup was taken. + +The output is similar to the following during the backup stage: + +.. sourcecode:: text + + 210715 14:14:59 Backup created in directory '/backup/' + MySQL binlog position: filename 'binlog.000002', position '156' + . . . + 210715 14:15:00 completed OK! + +.. note:: + + As of Percona XtraBackup 8.0.26-18.0, xtrabackup no longer creates the ``xtrabackup_binlog_pos_innodb`` file. This change is because MySQL and Percona Server no longer update the binary log information on global transaction system section of ``ibdata``. You should rely on ``xtrabackup_binlog_info`` regardless of the storage engine in use. + +Point-In-Time Recovery +----------------------- + +To perform a point-in-time recovery from an ``xtrabackup`` backup, you should prepare and restore the backup, and then replay binary logs from the point shown in the :file:`xtrabackup_binlog_info` file. + +A more detailed procedure is found :ref:`here `. + + +Setting Up a New Replication Replica +------------------------------------- + +To set up a new replica, you should prepare the backup, and restore it to the data directory of your new replication replica. If you are using version 8.0.22 or earlier, in your ``CHANGE MASTER TO`` command, use the binary log filename and position shown in the :file:`xtrabackup_binlog_info` file to start replication. + +If you are using 8.0.23 or later, use the `CHANGE_REPLICATION_SOURCE_TO and the appropriate options `__. ``CHANGE_MASTER_TO`` is deprecated. + +A more detailed procedure is found in :doc:`../howtos/setting_up_replication`. diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xbk_option_reference.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xbk_option_reference.rst new file mode 100644 index 000000000000..8a2bf9e12fcf --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xbk_option_reference.rst @@ -0,0 +1,1066 @@ +.. _xbk_option_reference: + +============================================ + The :program:`xtrabackup` Option Reference +============================================ + +.. .. program:: xtrabackup + +This page documents all of the command-line options for the +:program:`xtrabackup` binary. + +Modes of operation +================================================================================ + +You invoke *xtrabackup* in one of the following modes: + +- :option:`--backup` mode to make a backup in a target directory +- :option:`--prepare` mode to restore data from a backup (created in :option:`--backup` mode) +- :option:`--copy-back` to copy data from a backup to the location + that contained the original data; to move data instead of copying use + the alternate :option:`--move-back` mode. +- :option:`--stats` mode to scan the specified data files and print out index statistics. + +When you intend to run *xtrabackup* in any of these modes, use the following syntax: + +.. code-block:: bash + + $ xtrabackup [--defaults-file=#] --backup|--prepare|--copy-back|--stats [OPTIONS] + +For example, the :option:`--prepare` mode is applied as follows: + +.. code-block:: bash + + $ xtrabackup --prepare --target-dir=/data/backup/mysql/ + +For all modes, the default options are read from the **xtrabackup** and +**mysqld** configuration groups from the following files in the given order: + +1. :file:`/etc/my.cnf` +#. :file:`/etc/mysql/my.cnf` +#. :file:`/usr/etc/my.cnf` +#. :file:`~/.my.cnf`. + +As the first parameter to *xtrabackup* (in place of the :option:`--defaults-file`, +you may supply one of the following: + +- :option:`--print-defaults` to have *xtrabackup* print the argument list and exit. +- :option:`--no-defaults` to forbid reading options from any file but the login file. +- :option:`--defaults-file` to read the default options from the given file. +- :option:`--defaults-extra-file` to read the specified additional file after + the global files have been read. +- :option:`--defaults-group-suffix` to read the configuration groups with the + given suffix. The effective group name is constructed by concatenating the default + configuration groups (**xtrabackup** and **mysqld**) with the given suffix. +- :option:`--login-path` to read the given path from the login file. + +.. rubric:: InnoDB Options + +There is a large group of InnoDB options that are normally read from the +:file:`my.cnf` configuration file, so that *xtrabackup* boots up its embedded +InnoDB in the same configuration as your current server. You normally do not +need to specify them explicitly. These options have the same behavior in InnoDB +and XtraDB. See :option:`--innodb-miscellaneous` for more information. + +Options +======= + +.. option:: --apply-log-only + + This option causes only the redo stage to be performed when preparing a + backup. It is very important for incremental backups. + +.. option:: --backup + + Make a backup and place it in :option:`--target-dir`. See + :ref:`Creating a backup `. + +.. option:: --backup-lock-timeout + + The timeout in seconds for attempts to acquire metadata locks. + +.. option:: --backup-lock-retry-count + + The number of attempts to acquire metadata locks. + +.. option:: --backup-locks + + This option controls if backup locks should be used instead of ``FLUSH TABLES + WITH READ LOCK`` on the backup stage. The option has no effect when backup + locks are not supported by the server. This option is enabled by default, + disable with :option:`--no-backup-locks`. + +.. option:: --check-privileges + + This option checks if *Percona XtraBackup* has all required privileges. + If a missing privilege is required for the current operation, + it will terminate and print out an error message. + If a missing privilege is not required for the current operation, + but may be necessary for some other XtraBackup operation, + the process is not aborted and a warning is printed. + + .. code-block:: bash + + xtrabackup: Error: missing required privilege LOCK TABLES on *.* + xtrabackup: Warning: missing required privilege REPLICATION CLIENT on *.* + +.. option:: --close-files + + Do not keep files opened. When *xtrabackup* opens tablespace it normally + doesn't close its file handle in order to handle the DDL operations + correctly. However, if the number of tablespaces is really huge and can not + fit into any limit, there is an option to close file handles once they are + no longer accessed. *Percona XtraBackup* can produce inconsistent backups + with this option enabled. Use at your own risk. + +.. option:: --compress + + This option tells *xtrabackup* to compress all output data, including the + transaction log file and meta data files, using either the ``quicklz`` or + ``lz4`` compression algorithm. ``quicklz`` is chosen by default. + + When using ``--compress=quicklz`` or ``--compress``, the resulting files have + the qpress archive format, i.e. every ``*.qp`` file produced by *xtrabackup* is + essentially a one-file qpress archive and can be extracted and uncompressed + by the `qpress `_ file archiver. + + ``--compress=lz4`` produces ``*.lz4`` files. You can extract the contents of + these files by using a program such as ``lz4``. + + .. seealso:: + + QuickLZ + http://www.quicklz.com + LZ4 + https://lz4.github.io/lz4/ + +.. option:: --compress-chunk-size=# + + Size of working buffer(s) for compression threads in bytes. The default + value is 64K. + +.. option:: --compress-threads=# + + This option specifies the number of worker threads used by *xtrabackup* for + parallel data compression. This option defaults to ``1``. Parallel + compression (:option:`--compress-threads`) can be used together + with parallel file copying (:option:`--parallel`). For example, + ``--parallel=4 --compress --compress-threads=2`` will create 4 I/O threads + that will read the data and pipe it to 2 compression threads. + +.. option:: --copy-back + + Copy all the files in a previously made backup from the backup directory to + their original locations. This option will not copy over existing files + unless :option:`--force-non-empty-directories` option is + specified. + +.. option:: --core-file + + Write core on fatal signals. + +.. option:: --databases=# + + This option specifies a list of databases and tables that should be backed + up. The option accepts the list of the form ``"databasename1[.table_name1] + databasename2[.table_name2] . . ."``. + +.. option:: --databases-exclude=name + + Excluding databases based on name, Operates the same way + as :option:`--databases`, but matched names are excluded from + backup. Note that this option has a higher priority than + :option:`--databases`. + +.. option:: --databases-file=# + + This option specifies the path to the file containing the list of databases + and tables that should be backed up. The file can contain the list elements + of the form ``databasename1[.table_name1]``, one element per line. + +.. option:: --datadir=DIRECTORY + + The source directory for the backup. This should be the same as the datadir + for your *MySQL* server, so it should be read from :file:`my.cnf` if that + exists; otherwise you must specify it on the command line. + + When combined with the :option:`--copy-back` or + :option:`--move-back` option, :option:`--datadir` + refers to the destination directory. + + Once connected to the server, in order to perform a backup you will need + ``READ`` and ``EXECUTE`` permissions at a filesystem level in the + server's :term:`datadir`. + + +.. option:: --debug-sleep-before-unlock=# + + This is a debug-only option used by the *xtrabackup* test suite. + +.. option:: --debug-sync=name + + The debug sync point. This option is only used by the *xtrabackup* test suite. + +.. option:: --decompress + + Decompresses all files with the :file:`.qp` extension in a backup previously + made with the :option:`--compress` option. The + :option:`--parallel` option will allow multiple files to be + decrypted simultaneously. In order to decompress, the qpress utility MUST be + installed and accessible within the path. *Percona XtraBackup* does not + automatically remove the compressed files. In order to clean up the backup + directory users should use :option:`--remove-original` option. + + The :option:`--decompress` option may be used with *xbstream* to + decompress individual qpress files. + + If you used the ``lz4`` compression algorithm to compress the files + (``--compress=lz4``), change the :option:`--decompress` parameter + accordingly: ``--decompress=lz4``. + +.. option:: --decompress-threads=# + + Force *xbstream* to use the specified number of threads for + decompressing. + +.. option:: --decrypt=ENCRYPTION-ALGORITHM + + Decrypts all files with the :file:`.xbcrypt` extension in a backup + previously made with :option:`--encrypt` option. The + :option:`--parallel` option will allow multiple files to be + decrypted simultaneously. *Percona XtraBackup* doesn't + automatically remove the encrypted files. In order to clean up the backup + directory users should use :option:`--remove-original` option. + +.. option:: --defaults-extra-file=[MY.CNF] + + Read this file after the global files are read. Must be given as the first + option on the command-line. + +.. option:: --defaults-file=[MY.CNF] + + Only read default options from the given file. Must be given as the first + option on the command-line. Must be a real file; it cannot be a symbolic + link. + +.. option:: --defaults-group=GROUP-NAME + + This option is to set the group which should be read from the configuration + file. This is used by *xtrabackup* if you use the + :option:`--defaults-group` option. It is needed for + ``mysqld_multi`` deployments. + +.. option:: --defaults-group-suffix=# + + Also reads groups with concat(group, suffix). + +.. option:: --dump-innodb-buffer-pool + + This option controls whether or not a new dump of buffer pool + content should be done. + + With ``--dump-innodb-buffer-pool``, *xtrabackup* + makes a request to the server to start the buffer pool dump (it + takes some time to complete and is done in background) at the + beginning of a backup provided the status variable + ``innodb_buffer_pool_dump_status`` reports that the dump has been + completed. + + .. code-block:: bash + + $ xtrabackup --backup --dump-innodb-buffer-pool --target-dir=/home/user/backup + + By default, this option is set to `OFF`. + + If ``innodb_buffer_pool_dump_status`` reports that there is running + dump of buffer pool, *xtrabackup* waits for the dump to complete + using the value of :option:`--dump-innodb-buffer-pool-timeout` + + The file :file:`ib_buffer_pool` stores tablespace ID and page ID + data used to warm up the buffer pool sooner. + + .. seealso:: + + *MySQL* Documentation: Saving and Restoring the Buffer Pool State + https://dev.mysql.com/doc/refman/5.7/en/innodb-preload-buffer-pool.html + +.. option:: --dump-innodb-buffer-pool-timeout + + This option contains the number of seconds that *xtrabackup* should + monitor the value of ``innodb_buffer_pool_dump_status`` to + determine if buffer pool dump has completed. + + This option is used in combination with + :option:`--dump-innodb-buffer-pool`. By default, it is set to `10` + seconds. + +.. option:: --dump-innodb-buffer-pool-pct + + This option contains the percentage of the most recently used buffer pool + pages to dump. + + This option is effective if :option:`--dump-innodb-buffer-pool` option is set + to `ON`. If this option contains a value, *xtrabackup* sets the *MySQL* + system variable ``innodb_buffer_pool_dump_pct``. As soon as the buffer pool + dump completes or it is stopped (see + :option:`--dump-innodb-buffer-pool-timeout`), the value of the *MySQL* system + variable is restored. + + .. seealso:: + + Changing the timeout for buffer pool dump + :option:`--dump-innodb-buffer-pool-timeout` + *MySQL* Documentation: innodb_buffer_pool_dump_pct system variable + https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_dump_pct + +.. option:: --encrypt=ENCRYPTION_ALGORITHM + + This option instructs xtrabackup to encrypt backup copies of InnoDB data + files using the algorithm specified in the ENCRYPTION_ALGORITHM. Currently + supported algorithms are: ``AES128``, ``AES192`` and ``AES256`` + +.. option:: --encrypt-key=ENCRYPTION_KEY + + A proper length encryption key to use. It is not recommended to use this + option where there is uncontrolled access to the machine as the command line + and thus the key can be viewed as part of the process info. + +.. option:: --encrypt-key-file=ENCRYPTION_KEY_FILE + + The name of a file where the raw key of the appropriate length can be read + from. The file must be a simple binary (or text) file that contains exactly + the key to be used. + + It is passed directly to the xtrabackup child process. See the + :program:`xtrabackup` :doc:`documentation + <../xtrabackup_bin/xtrabackup_binary>` for more details. + +.. option:: --encrypt-threads=# + + This option specifies the number of worker threads that will be used for + parallel encryption/decryption. + See the :program:`xtrabackup` :doc:`documentation + <../xtrabackup_bin/xtrabackup_binary>` for more details. + +.. option:: --encrypt-chunk-size=# + + This option specifies the size of the internal working buffer for each + encryption thread, measured in bytes. It is passed directly to the + xtrabackup child process. See the :program:`xtrabackup` :doc:`documentation + <../xtrabackup_bin/xtrabackup_binary>` for more details. + +.. option:: --export + + Create files necessary for exporting tables. See :doc:`Restoring Individual + Tables `. + +.. option:: --extra-lsndir=DIRECTORY + + (for --backup): save an extra copy of the :file:`xtrabackup_checkpoints` + and :file:`xtrabackup_info` files in this directory. + +.. option:: --force-non-empty-directories + + When specified, it makes :option:`--copy-back` and + :option:`--move-back` option transfer files to non-empty + directories. No existing files will be overwritten. If files that need to + be copied/moved from the backup directory already exist in the destination + directory, it will still fail with an error. + +.. option:: --ftwrl-wait-timeout=SECONDS + + This option specifies time in seconds that xtrabackup should wait for + queries that would block ``FLUSH TABLES WITH READ LOCK`` before running it. + If there are still such queries when the timeout expires, xtrabackup + terminates with an error. Default is ``0``, in which case it does not wait + for queries to complete and starts ``FLUSH TABLES WITH READ LOCK`` + immediately. Where supported *xtrabackup* will + automatically use `Backup Locks + `_ + as a lightweight alternative to ``FLUSH TABLES WITH READ LOCK`` to copy + non-InnoDB data to avoid blocking DML queries that modify InnoDB tables. + +.. option:: --ftwrl-wait-threshold=SECONDS + + This option specifies the query run time threshold which is used by + xtrabackup to detect long-running queries with a non-zero value of + :option:`--ftwrl-wait-timeout`. ``FLUSH TABLES WITH READ LOCK`` + is not started until such long-running queries exist. This option has no + effect if :option:`--ftwrl-wait-timeout` is ``0``. Default value + is ``60`` seconds. Where supported xtrabackup will + automatically use `Backup Locks + `_ + as a lightweight alternative to ``FLUSH TABLES WITH READ LOCK`` to copy + non-InnoDB data to avoid blocking DML queries that modify InnoDB tables. + +.. option:: --ftwrl-wait-query-type=all|update + + This option specifies which types of queries are allowed to complete before + xtrabackup will issue the global lock. Default is ``all``. + +.. option:: --galera-info + + This option creates the :file:`xtrabackup_galera_info` file which contains + the local node state at the time of the backup. Option should be used when + performing the backup of *Percona XtraDB Cluster*. It has no effect when + backup locks are used to create the backup. + +.. option:: --generate-new-master-key + + Generate a new master key when doing a copy-back. + +.. option:: --generate-transition-key + + *xtrabackup* needs to access the same keyring file or vault server + during `prepare` and `copy-back` but it should not depend on whether the + server keys have been purged. + + :option:`--generate-transition-key` creates and adds to the keyring + a transition key for *xtrabackup* to use if the master key used for + encryption is not found because it has been rotated and purged. + +.. option:: --get-server-public-key + + Get the server public key + + .. seealso:: + + *MySQL* Documentation: The --get-server-public-key Option + + https://dev.mysql.com/doc/refman/5.7/en/connection-options.html#option_general_get-server-public-key + +.. option:: --help + + When run with this option or without any options *xtrabackup* displays + information about how to run the program on the command line along with all + supported options and variables with default values where appropriate. + +.. option:: --history=NAME + + This option enables the tracking of backup history in the + ``PERCONA_SCHEMA.xtrabackup_history`` table. An optional history series name + may be specified that will be placed with the history record for the current + backup being taken. + +.. option:: --host=HOST + + This option accepts a string argument that specifies the host to use when + connecting to the database server with TCP/IP. It is passed to the mysql + child process without alteration. See :command:`mysql --help` for details. + +.. option:: --incremental + + This option tells *xtrabackup* to create an incremental backup. It is passed + to the *xtrabackup* child process. When this option is specified, either + :option:`--incremental-lsn` or :option:`--incremental-basedir` can also be + given. If neither option is given, option :option:`--incremental-basedir` is + passed to :program:`xtrabackup` by default, set to the first timestamped + backup directory in the backup base directory. + + .. seealso:: + + More information about incremental backups + See section :ref:`xb_incremental` + +.. option:: --incremental-basedir=DIRECTORY + + When creating an incremental backup, this is the directory containing the + full backup that is the base dataset for the incremental backups. + +.. option:: --incremental-dir=DIRECTORY + + When preparing an incremental backup, this is the directory where the + incremental backup is combined with the full backup to make a new full + backup. + +.. option:: --incremental-force-scan + + When creating an incremental backup, force a full scan of the data pages in + the instance being backuped even if the complete changed page bitmap data is + available. + +.. option:: --incremental-history-name=name + + This option specifies the name of the backup series stored in the + ``PERCONA_SCHEMA.xtrabackup_history`` history record to base an incremental + backup on. *xtrabackup* will search the history table looking for the most + recent (highest ``innodb_to_lsn``), successful backup in the series and take + the to_lsn value to use as the starting ``lsn`` for the incremental + backup. This will be mutually exclusive with + :option:`--incremental-history-uuid`, :option:`--incremental-basedir` and + :option:`--incremental-lsn`. If no valid lsn can be found (no series by that + name, no successful backups by that name) *xtrabackup* will return with an + error. It is used with the :option:`--incremental` option. + +.. option:: --incremental-history-uuid=name + + This option specifies the *UUID* of the specific history record stored in the + ``PERCONA_SCHEMA.xtrabackup_history`` to base an incremental backup on. + :option:`--incremental-history-name`, :option:`--incremental-basedir` and + :option:`--incremental-lsn`. If no valid lsn can be found (no success record + with that *UUID*) *xtrabackup* will return with an error. It is used with + the --incremental option. + +.. option:: --incremental-lsn=LSN + + When creating an incremental backup, you can specify the log sequence number + (:term:`LSN`) instead of specifying + :option:`--incremental-basedir`. For databases created in 5.1 and + later, specify the :term:`LSN` as a single 64-bit integer. **ATTENTION**: If + a wrong LSN value is specified (a user error which *Percona XtraBackup* is + unable to detect), the backup will be unusable. Be careful! + +.. option:: --innodb[=name] + + This option is ignored for MySQL option compatibility. + +.. option:: --innodb-miscellaneous + + There is a large group of InnoDB options that are normally read from the + :file:`my.cnf` configuration file, so that *xtrabackup* boots up its + embedded InnoDB in the same configuration as your current server. You + normally do not need to specify these explicitly. These options have the + same behavior in InnoDB and XtraDB: + + .. hlist:: + :columns: 2 + + - --innodb-adaptive-hash-index + - --innodb-additional-mem-pool-size + - --innodb-autoextend-increment + - --innodb-buffer-pool-size + - --innodb-buffer-pool-filename + - --innodb-checksum-algorithm + - --innodb-checksums + - --innodb-data-file-path + - --innodb-data-home-dir + - --innodb-directories + - --innodb-doublewrite-file + - --innodb-doublewrite + - --innodb-extra-undoslots + - --innodb-fast-checksum + - --innodb-file-io-threads + - --innodb-file-per-table + - --innodb-flush-log-at-trx-commit + - --innodb-flush-method + - --innodb-io-capacity + - --innodb-lock-wait-timeout + - --innodb-log-block-size + - --innodb-log-buffer-size + - --innodb-log-checksums + - --innodb-log-files-in-group + - --innodb-log-file-size + - --innodb-log-group-home-dir + - --innodb-max-dirty-pages-pct + - --innodb-open-files + - --innodb-page-size + - --innodb-read-io-threads + - --innodb-redo-log-encrypt + - --innodb-undo-directory + - --innodb-undo-log-encrypt + - --innodb-undo-tablespaces` + - --innodb-use-native-aio + - --innodb-write-io-threads + +.. option:: --keyring-file-data=FILENAME + + The path to the keyring file. Combine this option with + :option:`--xtrabackup-plugin-dir`. + +.. option:: --kill-long-queries-timeout=SECONDS + + This option specifies the number of seconds *xtrabackup* waits between + starting ``FLUSH TABLES WITH READ LOCK`` and killing those queries that block + it. Default is 0 seconds, which means *xtrabackup* will not attempt to kill + any queries. In order to use this option xtrabackup user should have the + ``PROCESS`` and ``SUPER`` privileges. Where supported, *xtrabackup* + automatically uses `Backup Locks + `_ + as a lightweight alternative to ``FLUSH TABLES WITH READ LOCK`` to copy + non-InnoDB data to avoid blocking DML queries that modify InnoDB tables. + +.. option:: --kill-long-query-type=all|select + + This option specifies which types of queries should be killed to unblock the + global lock. Default is "select". + +.. option:: --lock-ddl + + Issue ``LOCK TABLES FOR BACKUP`` if it is supported by server (otherwise use + ``LOCK INSTANCE FOR BACKUP``) at the beginning of the backup to block all DDL + operations. + + .. note:: + + Prior to *Percona XtraBackup* 8.0.22-15.0, using a `safe-slave-backup` stops the SQL replica thread + after the InnoDB tables and before the non-InnoDB tables are backed up. + + As of *Percona XtraBackup* 8.0.22-15.0, using a `safe-slave-backup` option stops the SQL + replica thread before copying the InnoDB files. + +.. option:: --lock-ddl-per-table + + Lock DDL for each table before xtrabackup starts to copy + it and until the backup is completed. + + .. note:: + + + As of *Percona XtraBackup* 8.0.15, the `--lock-ddl-per-table` option is deprecated. Use the `--lock-ddl` option instead. + + +.. option:: --lock-ddl-timeout + + If ``LOCK TABLES FOR BACKUP`` or ``LOCK INSTANCE FOR BACKUP`` does not return + within given timeout, abort the backup. + +.. option:: --log + + This option is ignored for *MySQL* + +.. option:: --log-bin + + The base name for the log sequence. + +.. option:: --log-bin-index=name + + File that holds the names for binary log files. + +.. option:: --log-copy-interval=# + + This option specifies the time interval between checks done by the log + copying thread in milliseconds (default is 1 second). + +.. option:: --login-path + + Read the given path from the login file. + +.. option:: --move-back + + Move all the files in a previously made backup from the backup directory to + their original locations. As this option removes backup files, it must be + used with caution. + +.. option:: --no-backup-locks + + Explicity disables the :option:`--backup-locks` option which is enabled by + default. + +.. option:: --no-defaults + + The default options are only read from the login file. + +.. option:: --no-lock + + Use this option to disable table lock with ``FLUSH TABLES WITH READ + LOCK``. Use it only if ALL your tables are InnoDB and you **DO NOT CARE** + about the binary log position of the backup. This option shouldn't be used if + there are any ``DDL`` statements being executed or if any updates are + happening on non-InnoDB tables (this includes the system MyISAM tables in the + *mysql* database), otherwise it could lead to an inconsistent backup. Where + supported *xtrabackup* will automatically use `Backup Locks + `_ + as a lightweight alternative to ``FLUSH TABLES WITH READ LOCK`` to copy + non-InnoDB data to avoid blocking DML queries that modify InnoDB tables. If + you are considering to use this because your backups are failing to acquire + the lock, this could be because of incoming replication events are preventing + the lock from succeeding. Please try using :option:`--safe-slave-backup` to + momentarily stop the replication replica thread, this may help the backup to + succeed and you do not need to use this option. + +.. option:: --no-server-version-check + + Implemented in *Percona XtraBackup* 8.0.21. + + The ``--no-server-version-check`` option disables the server version check. + + The default behavior runs a check that compares the source system version to the *Percona XtraBackup* version. If the source system version is higher than the XtraBackup version, the backup is aborted with a message. + + Adding the option overrides this check, and the backup proceeds, but there may be issues with the backup. + + See :ref:`comparison` for more information. + +.. option:: --no-version-check + + This option disables the version check. If you do not pass this option, the + automatic version check is enabled implicitly when *xtrabackup* runs + in the ``--backup`` mode. To disable the version check, you should pass + explicitly the ``--no-version-check`` option when invoking *xtrabackup*. + + When the automatic version check is enabled, *xtrabackup* performs a + version check against the server on the backup stage after creating a server + connection. *xtrabackup* sends the following information to the server: + + - MySQL flavour and version + - Operating system name + - Percona Toolkit version + - Perl version + + Each piece of information has a unique identifier. This is a MD5 hash value + that Percona Toolkit uses to obtain statistics about how it is used. This is + a random UUID; no client information is either collected or stored. + + +.. option:: --open-files-limit=# + + The maximum number of file descriptors to reserve with setrlimit(). + +.. option:: --parallel=# + + This option specifies the number of threads to use to copy multiple data + files concurrently when creating a backup. The default value is 1 (i.e., no + concurrent transfer). In *Percona XtraBackup* 2.3.10 and newer, this option + can be used with the :option:`--copy-back` option to copy the user + data files in parallel (redo logs and system tablespaces are copied in the + main thread). + +.. option:: --password=PASSWORD + + This option specifies the password to use when connecting to the database. + It accepts a string argument. See :command:`mysql --help` for details. + +.. option:: --plugin-load + + List of plugins to load. + +.. option:: --port=PORT + + This option accepts a string argument that specifies the port to use when + connecting to the database server with TCP/IP. It is passed to the + :command:`mysql` child process without alteration. See :command:`mysql + --help` for details. + +.. option:: --prepare + + Makes :program:`xtrabackup` perform a recovery on a backup created with + :option:`--backup`, so that it is ready to use. See + :ref:`preparing a backup `. + +.. option:: --print-defaults + + Print the program argument list and exit. Must be given as the first option + on the command-line. + +.. option:: --print-param + + Makes :program:`xtrabackup` print out parameters that can be used for + copying the data files back to their original locations to restore them. + +.. option:: --read-buffer-size + + Set the datafile read buffer size, given value is scaled up to page size. Default + is 10Mb. + + +.. option:: --rebuild-indexes + + Rebuilds indexes in a compact backup. This option only has effect when the + :option:`--prepare` and :option:`--rebuild-threads` options are provided. + +.. option:: --rebuild-threads=# + + Uses the given number of threads to rebuild indexes in a compact backup. This + option only has effect with the :option:`--prepare` and + :option:`--rebuild-indexes` options. + +.. option:: --remove-original + + Implemented in *Percona XtraBackup* 2.4.6, this option when specified will + remove :file:`.qp`, :file:`.xbcrypt` and :file:`.qp.xbcrypt` files after + decryption and decompression. + +.. option:: --rocksdb-datadir + + RocksDB data directory + +.. option:: --rocksdb-wal-dir + + RocksDB WAL directory. + +.. option:: --rocksdb-checkpoint-max-age + + The checkpoint cannot be older than this number of seconds when the backup + completes. + +.. option:: --rocksdb-checkpoint-max-count + + Complete the backup even if the checkpoint age requirement has not been met after + this number of checkpoints. + +.. option:: --rollback-prepared-trx + + Force rollback prepared InnoDB transactions. + +.. option:: --rsync + + Uses the :program:`rsync` utility to optimize local file transfers. When this + option is specified, *xtrabackup* uses :program:`rsync` to copy + all non-InnoDB files instead of spawning a separate :program:`cp` for each + file, which can be much faster for servers with a large number of databases + or tables. This option cannot be used together with :option:`--stream`. + +.. option:: --safe-slave-backup + + When specified, xtrabackup will stop the replica SQL thread just before + running ``FLUSH TABLES WITH READ LOCK`` and wait to start backup until + ``Slave_open_temp_tables`` in ``SHOW STATUS`` is zero. If there are no open + temporary tables, the backup will take place, otherwise the SQL thread will + be started and stopped until there are no open temporary tables. The backup + will fail if ``Slave_open_temp_tables`` does not become zero after + :option:`--safe-slave-backup-timeout` seconds. The replication SQL + thread will be restarted when the backup finishes. This option is + implemented in order to deal with `replicating temporary tables + `_ + and isn't neccessary with Row-Based-Replication. + +.. option:: --safe-slave-backup-timeout=SECONDS + + How many seconds :option:`--safe-slave-backup` should wait for + ``Slave_open_temp_tables`` to become zero. Defaults to 300 seconds. + +.. option:: --secure-auth + + Refuse client connecting to server if it uses old (pre-4.1.1) protocol. + (Enabled by default; use --skip-secure-auth to disable.) + +.. option:: --server-id=# + + The server instance being backed up. + +.. option:: --server-public-key-path + + The file path to the server public RSA key in the PEM format. + + .. seealso:: + + *MySQL* Documentation: The --server-public-key-path Option + https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_server-public-key-path + +.. option:: --skip-tables-compatibility-check + + See :option:`--tables-compatibility-check`. + +.. option:: --slave-info + + This option is useful when backing up a replication replica server. It prints + the binary log position of the source server. It also writes the binary log + coordinates to the :file:`xtrabackup_slave_info` file as a ``CHANGE MASTER`` + command. A new replica for this source can be set up by starting a replica server + on this backup and issuing a ``CHANGE MASTER`` command with the binary log + position saved in the :file:`xtrabackup_slave_info` file. + +.. option:: --socket + + This option accepts a string argument that specifies the socket to use when + connecting to the local database server with a UNIX domain socket. It is + passed to the mysql child process without alteration. See :command:`mysql + --help` for details. + +.. option:: --ssl + + Enable secure connection. More information can be found in `--ssl + `_ + MySQL server documentation. + +.. option:: --ssl-ca + + Path of the file which contains list of trusted SSL CAs. More information + can be found in `--ssl-ca + `_ + MySQL server documentation. + +.. option:: --ssl-capath + + Directory path that contains trusted SSL CA certificates in PEM format. More + information can be found in `--ssl-capath + `_ + MySQL server documentation. + +.. option:: --ssl-cert + + Path of the file which contains X509 certificate in PEM format. More + information can be found in `--ssl-cert + `_ + MySQL server documentation. + +.. option:: --ssl-cipher + + List of permitted ciphers to use for connection encryption. More information + can be found in `--ssl-cipher + `_ + MySQL server documentation. + +.. option:: --ssl-crl + + Path of the file that contains certificate revocation lists. More + information can be found in `--ssl-crl + `_ + MySQL server documentation. + +.. option:: --ssl-crlpath + + Path of directory that contains certificate revocation list files. More + information can be found in `--ssl-crlpath + `_ + MySQL server documentation. + +.. option:: --ssl-fips-mode + + SSL FIPS mode (applies only for OpenSSL); permitted values are: *OFF*, *ON*, + *STRICT*. + +.. option:: --ssl-key + + Path of file that contains X509 key in PEM format. More information can be + found in `--ssl-key + `_ + MySQL server documentation. + +.. option:: --ssl-mode + + Security state of connection to server. More information can be found in + `--ssl-mode + `_ + MySQL server documentation. + +.. option:: --ssl-verify-server-cert + + Verify server certificate Common Name value against host name used when + connecting to server. More information can be found in + `--ssl-verify-server-cert + `_ + MySQL server documentation. + +.. option:: --stats + + Causes :program:`xtrabackup` to scan the specified data files and print out + index statistics. + +.. option:: --stream=FORMAT + + Stream all backup files to the standard output in the specified format. + Currently, this option only supports the `xbstream` format. + +.. option:: --strict + + If this option is specified, *xtrabackup* fails with an error when invalid + parameters are passed. + +.. option:: --tables=name + + A regular expression against which the full tablename, in + ``databasename.tablename`` format, is matched. If the name matches, the + table is backed up. See :doc:`partial backups `. + +.. option:: --tables-compatibility-check + + Enables the engine compatibility warning. The default value is + ON. To disable the engine compatibility warning use + :option:`--skip-tables-compatibility-check`. + + +.. option:: --tables-exclude=name + + Filtering by regexp for table names. Operates the same + way as :option:`--tables`, but matched names are excluded from + backup. Note that this option has a higher priority than + :option:`--tables`. + +.. option:: --tables-file=name + + A file containing one table name per line, in databasename.tablename format. + The backup will be limited to the specified tables. + +.. option:: --target-dir=DIRECTORY + + This option specifies the destination directory for the backup. If the + directory does not exist, :program:`xtrabackup` creates it. If the directory + does exist and is empty, :program:`xtrabackup` will succeed. + :program:`xtrabackup` will not overwrite existing files, however; it will + fail with operating system error 17, ``file exists``. + + If this option is a relative path, it is interpreted as being relative to + the current working directory from which :program:`xtrabackup` is executed. + + In order to perform a backup, you need ``READ``, ``WRITE``, and ``EXECUTE`` + permissions at a filesystem level for the directory that you supply as the + value of :option:`--target-dir`. + + +.. option:: --innodb-temp-tablespaces-dir=DIRECTORY + + Directory where temp tablespace files live, this path can be absolute. + +.. option:: --throttle=# + + This option limits the number of chunks copied per second. The chunk size is + *10 MB*. To limit the bandwidth to *10 MB/s*, set the option to *1*: + `--throttle=1`. + + .. seealso:: + + More information about how to throttle a backup + :ref:`throttling_backups` + +.. option:: --tls-ciphersuites + + TLS v1.3 cipher to use. + +.. option:: --tls-version + + TLS version to use, permitted values are: *TLSv1*, *TLSv1.1*, + *TLSv1.2*, *TLSv1.3*. + +.. option:: --tmpdir=name + + Specify the directory that will be used to store temporary files during the + backup + +.. option:: --transition-key=name + + This option is used to enable processing the backup without accessing the + keyring vault server. In this case, :program:`xtrabackup` derives the AES + encryption key from the specified passphrase and uses it to encrypt + tablespace keys of tablespaces being backed up. + + If :option:`--transition-key` does not have any + value, :program:`xtrabackup` will ask for it. The same passphrase should be + specified for the :option:`--prepare` command. + +.. option:: --use-memory + + This option affects how much memory is allocated for preparing a backup with + :option:`--prepare`, or analyzing statistics with + :option:`--stats`. Its purpose is similar + to :term:`innodb_buffer_pool_size`. It does not do the same thing as the + similarly named option in Oracle's InnoDB Hot Backup tool. + The default value is 100MB, and if you have enough available memory, 1GB to + 2GB is a good recommended value. Multiples are supported providing the unit + (e.g. 1MB, 1M, 1GB, 1G). + +.. option:: --user=USERNAME + + This option specifies the MySQL username used when connecting to the server, + if that's not the current user. The option accepts a string argument. See + mysql --help for details. + +.. option:: -v + + See :option:`--version` + +.. option:: --version + + This option prints *xtrabackup* version and exits. + +.. option:: --xtrabackup-plugin-dir=DIRNAME + + The absolute path to the directory that contains the ``keyring`` plugin. + + .. seealso:: + + *Percona Server for MySQL* Documentation: keyring_vault plugin with Data at Rest Encryption + https://www.percona.com/doc/percona-server/LATEST/management/data_at_rest_encryption.html#keyring-vault-plugin + *MySQL* Documentation: Using the keyring_file File-Based Plugin + https://dev.mysql.com/doc/refman/5.7/en/keyring-file-plugin.html + +.. *xtrabackup* replace:: :program:`xtrabackup` diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xtrabackup_binary.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xtrabackup_binary.rst new file mode 100644 index 000000000000..198db5eabe3e --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xtrabackup_binary.rst @@ -0,0 +1,70 @@ +.. _xtrabackup-binary: + +================================================================================ + The xtrabackup Binary +================================================================================ + +The *xtrabackup* binary is a compiled C program that is linked with the *InnoDB* +libraries and the standard *MySQL* client libraries. + +*xtrabackup* enables point-in-time backups of *InnoDB* / *XtraDB* tables +together with the schema definitions, *MyISAM* tables, and other portions of the +server. + +The *InnoDB* libraries provide the functionality to apply a log to data +files. The *MySQL* client libraries are used to parse command-line options and +configuration file. + +The tool runs in either :option:`--backup` or :option:`--prepare` mode, +corresponding to the two main functions it performs. There are several +variations on these functions to accomplish different tasks, and there are two +less commonly used modes, :option:`--stats` and :option:`--print-param`. + +Other Types of Backups +================================================================================ + +.. toctree:: + :maxdepth: 1 + + incremental_backups + partial_backups + +Advanced Features +================================================================================ + +.. NB: the following section has been removed because it is a + duplicate of a section in source/advanced: + + throttling_backups + +.. toctree:: + :maxdepth: 1 + + analyzing_table_statistics + working_with_binary_logs + restoring_individual_tables + lru_dump + backup.streaming + backup.encrypting + flush-tables-with-read-lock + backup.accelerating + point-in-time-recovery + replication + backup.history + +Implementation +================================================================================ + +.. toctree:: + :maxdepth: 1 + + implementation_details + xtrabackup_exit_codes + +References +================================================================================ + +.. toctree:: + :maxdepth: 1 + + xbk_option_reference diff --git a/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xtrabackup_exit_codes.rst b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xtrabackup_exit_codes.rst new file mode 100644 index 000000000000..cd5c80ea0f5b --- /dev/null +++ b/storage/innobase/xtrabackup/doc/source/xtrabackup_bin/xtrabackup_exit_codes.rst @@ -0,0 +1,7 @@ +========================= + *xtrabackup* Exit Codes +========================= + +The *xtrabackup* binary exits with the traditional success value of 0 after a backup when no error occurs. If an error occurs during the backup, the exit value is 1. + +In certain cases, the exit value can be something other than 0 or 1, due to the command-line option code included from the *MySQL* libraries. An unknown command-line option, for example, will cause an exit code of 255.