{"id":2363,"date":"2024-06-02T16:35:29","date_gmt":"2024-06-02T13:35:29","guid":{"rendered":"https:\/\/www.fibacloud.com\/community\/tutorials\/?p=2363"},"modified":"2026-10-04T22:57:46","modified_gmt":"2026-10-04T19:57:46","slug":"how-to-create-a-daily-backup-plan","status":"publish","type":"post","link":"https:\/\/www.fibacloud.com\/community\/tutorials\/en\/how-to-create-a-daily-backup-plan\/","title":{"rendered":"Daily Backup Plan: RPO, RTO and Restore Testing"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"2363\" class=\"elementor elementor-2363\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d53a3a4 e-con-full e-flex e-con e-parent\" data-id=\"d53a3a4\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c4c798f elementor-widget elementor-widget-text-editor\" data-id=\"c4c798f\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<style>\/*! elementor - v3.21.0 - 08-05-2024 *\/\n.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}<\/style>\t\t\t\t<p>A daily backup plan does more than copy files every night. It identifies the data to protect, acceptable data loss, the time available to restore service and the person responsible for recovery. This guide builds a practical website backup plan and a <strong>file-restoration exercise that does not overwrite the source<\/strong>.<\/p>\n<figure class=\"fc-editorial-figure\" data-fc-visual=\"20260920\" aria-labelledby=\"fc-editorial-caption-2363\"><a href=\"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-content\/uploads\/community-editorial-20260920\/fc-backup-en-inline-20260920.webp\" target=\"_blank\" rel=\"noopener\" aria-label=\"Open full-size illustration\"><picture><source media=\"(max-width: 600px)\" srcset=\"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-content\/uploads\/community-editorial-20260920\/fc-backup-en-mobile-20260920.webp\" width=\"720\" height=\"1140\"><img loading=\"lazy\" src=\"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-content\/uploads\/community-editorial-20260920\/fc-backup-en-inline-20260920.webp\" srcset=\"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-content\/uploads\/community-editorial-20260920\/fc-backup-en-inline-20260920.webp 1440w, https:\/\/www.fibacloud.com\/community\/tutorials\/wp-content\/uploads\/community-editorial-20260920\/fc-backup-en-inline-20260920-300x242.webp 300w, https:\/\/www.fibacloud.com\/community\/tutorials\/wp-content\/uploads\/community-editorial-20260920\/fc-backup-en-inline-20260920-1024x825.webp 1024w, https:\/\/www.fibacloud.com\/community\/tutorials\/wp-content\/uploads\/community-editorial-20260920\/fc-backup-en-inline-20260920-768x619.webp 768w\" sizes=\"auto, (max-width: 900px) 100vw, 820px\" width=\"1440\" height=\"1160\" alt=\"3\u20132\u20131: from copies to recovery\" class=\"wp-image-2548\"  decoding=\"async\"><\/picture><\/a><figcaption id=\"fc-editorial-caption-2363\"><strong>3\u20132\u20131: from copies to recovery<\/strong> Three copies, two storage media and one off-site copy reduce single-point loss. A restore test verifies recovery; this arrangement alone does not provide immutability.<details><summary>Step-by-step explanation<\/summary><ol><li>3 copies: Keep production data and two backups.<\/li><li>2 media: Reduce shared failure dependencies.<\/li><li>1 off-site: Separate a copy from the primary site.<\/li><li>Restore: Measure time and verify integrity.<\/li><\/ol><\/details><\/figcaption><\/figure>\n<h2>Define recovery targets first<\/h2>\n<p><strong>RPO<\/strong> is the data-loss interval measured from the last usable recovery point. <strong>RTO<\/strong> is the target time for restoring service. A system with one nightly backup can lose more than 24 hours of data if a scheduled backup also fails. An order-processing database with an RPO measured in minutes needs more than daily file copies: use its supported log\/PITR or more frequent backup design.<\/p>\n<p>Validate this example against your data volume and service agreement:<\/p>\n<table>\n<thead>\n<tr>\n<th>Area<\/th>\n<th>Example decision<\/th>\n<th>Acceptance check<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Protected data<\/td>\n<td>Site files, configuration and application-aware DB backup<\/td>\n<td>No missing uploads or secret dependencies<\/td>\n<\/tr>\n<tr>\n<td>Schedule<\/td>\n<td>Daily at 03:00 UTC; 06:00 Europe\/Istanbul<\/td>\n<td>The scheduler&#8217;s actual timezone is recorded<\/td>\n<\/tr>\n<tr>\n<td>Retention<\/td>\n<td>14 daily copies and 4 weekly copies<\/td>\n<td>Capacity and available recovery dates are measured<\/td>\n<\/tr>\n<tr>\n<td>Second copy<\/td>\n<td>Another failure domain with separate access credentials<\/td>\n<td>Compromise of the main account cannot delete both copies<\/td>\n<\/tr>\n<tr>\n<td>Ownership<\/td>\n<td>Operator and backup operator<\/td>\n<td>Failed\/missed-job alerts reach the intended recipient<\/td>\n<\/tr>\n<tr>\n<td>Recovery<\/td>\n<td>Separate destination first, controlled cutover later<\/td>\n<td>Data correctness and actual recovery time are recorded<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>These values are not a FibaCloud service commitment. Verify available controls, quotas\/prices, encryption and retention against your selected service&#8217;s current terms. Do not assume identical screen names or options across every plan.<\/p>\n<h2>Obtain a consistent backup<\/h2>\n<p>Copying a running database&#8217;s files with ordinary <code>tar<\/code> does not produce an application-consistent backup. MySQL needs an appropriate dump\/physical backup; PostgreSQL needs an appropriate dump\/base backup and log strategy. The <a href=\"https:\/\/www.fibacloud.com\/community\/tutorials\/en\/how-to-create-and-manage-a-mysql-database\/\">MySQL management guide<\/a> demonstrates a dump restored into another database. Use the database vendor&#8217;s documented method rather than archiving its active data directory.<\/p>\n<p>The following exercise uses <strong>unchanging sample files only<\/strong>. For a real application, coordinate files and database state using a maintenance window, the application&#8217;s backup mechanism or documented snapshot consistency. A snapshot or HA system is not equivalent to an independent backup.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4bb1991 elementor-widget elementor-widget-text-editor\" data-id=\"4bb1991\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<pre><code class=\"language-bash\">umask 077\nlab_dir=$(mktemp -d)\nmkdir \"$lab_dir\/source\" \"$lab_dir\/backups\" \"$lab_dir\/restore\"\nprintf '%s\\n' 'Backup verification' &gt; \"$lab_dir\/source\/index.txt\"\nprintf '%s\\n' 'version=1' &gt; \"$lab_dir\/source\/config.txt\"\ntar -czf \"$lab_dir\/backups\/site.tar.gz\" -C \"$lab_dir\/source\" .\nsha256sum \"$lab_dir\/backups\/site.tar.gz\" &gt; \"$lab_dir\/backups\/site.tar.gz.sha256\"\nsha256sum --check \"$lab_dir\/backups\/site.tar.gz.sha256\"\ntar -tzf \"$lab_dir\/backups\/site.tar.gz\"<\/code><\/pre>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-48f1ad7 elementor-widget elementor-widget-text-editor\" data-id=\"48f1ad7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Check a successful exit, a nonempty archive and the expected file list together. A hash detects changes to the copy; it does not by itself establish application consistency or trusted provenance. If an attacker can replace both archive and hash, this check is insufficient.<\/p>\n<h2>Restore into a separate destination<\/h2>\n<p>Extract your own archive into the empty <code>restore<\/code> directory. Do not extract an unknown archive into production or as root.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2074609 elementor-widget elementor-widget-text-editor\" data-id=\"2074609\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<pre><code class=\"language-bash\">tar -xzf \"$lab_dir\/backups\/site.tar.gz\" --no-same-owner -C \"$lab_dir\/restore\"\ndiff -r \"$lab_dir\/source\" \"$lab_dir\/restore\"<\/code><\/pre>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f7caae6 elementor-widget elementor-widget-text-editor\" data-id=\"f7caae6\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p><code>diff<\/code> should report no difference. This tests data equality; a real website also needs HTTP, critical user-flow, database-connection, permission and plugin checks. Prevent restored email, payment, webhook and scheduled-job configurations from acting on real customers during the exercise. Do not restore over the running source site.<\/p>\n<p>Record the start\/end time, archive timestamp, file\/DB object counts, application result and operator. Compare the <strong>measured<\/strong> duration with the target RTO. A failed exercise is not resolved by noting that a backup exists: correct the problem and repeat it.<\/p>\n<h2>Verify schedules and alerts<\/h2>\n<p>When configuring the product scheduler or an operating-system job, define its execution account, explicit timezone, overlap behavior and unsuccessful exit codes. Keep secrets out of cron lines; use a file readable only by the job account or a secret manager. With test data, simulate a failed job and a missed schedule and verify that the notification actually arrives.<\/p>\n<p>Apply retention cleanup only after validating the new backup and the second copy. Avoid examples that automatically remove the last usable copy. Do not keep the encryption key in the same single failure domain as every backup: recovery authorization and key access also need testing.<\/p>\n<h2>Maintain a recovery procedure<\/h2>\n<p>Re-measure after changes to data volume, application version or destination storage. For example, schedule monthly complete restoration exercises and another test after significant changes; the appropriate frequency depends on your business requirements. Before removing the sample directories, inspect <code>$lab_dir<\/code> and its contents. Do not run cleanup with variables that have been repointed at production paths.<\/p>\n<p>If the new schedule fails, preserve the previously working job and last valid backup. Changing destinations or cleaning up failed copies must not remove the only usable recovery point.<\/p>\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.cisa.gov\/stopransomware\/ransomware-guide\" rel=\"nofollow noopener\" target=\"_blank\">CISA: separate backups and restoration testing<\/a><\/li>\n<li><a href=\"https:\/\/www.gnu.org\/software\/tar\/manual\/html_node\/backup.html\" rel=\"nofollow noopener\" target=\"_blank\">GNU tar: backup and restoration<\/a><\/li>\n<li><a href=\"https:\/\/docs.oracle.com\/cd\/E17952_01\/mysql-8.4-en\/mysqldump.html\" rel=\"nofollow noopener\" target=\"_blank\">MySQL 8.4: mysqldump and consistency limitations<\/a><\/li>\n<li><a href=\"https:\/\/www.postgresql.org\/docs\/16\/backup-dump.html\" rel=\"nofollow noopener\" target=\"_blank\">PostgreSQL 16: SQL dump backups<\/a><\/li>\n<\/ul>\n<p class=\"fc-article-review-date\">Technical content and sources reviewed on October 4, 2026. Recheck the relevant official documentation when a version or provider changes.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Build a daily backup plan around RPO, RTO, retention and an independent copy. Back up sample files and verify a restore to a separate destination.<\/p>\n","protected":false},"author":1,"featured_media":2547,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[228,230,224,226],"class_list":["post-2363","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials-en","tag-backup","tag-backup-software","tag-cloud-computing","tag-data-security"],"lang":"en","translations":{"en":2363,"tr":1806},"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/posts\/2363","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/comments?post=2363"}],"version-history":[{"count":8,"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/posts\/2363\/revisions"}],"predecessor-version":[{"id":2371,"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/posts\/2363\/revisions\/2371"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/media\/2547"}],"wp:attachment":[{"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/media?parent=2363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/categories?post=2363"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fibacloud.com\/community\/tutorials\/wp-json\/wp\/v2\/tags?post=2363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}