{"id":442713,"date":"2026-06-17T17:30:15","date_gmt":"2026-06-17T09:30:15","guid":{"rendered":"https:\/\/idc.net\/help\/?p=442713"},"modified":"2026-06-11T17:31:46","modified_gmt":"2026-06-11T09:31:46","slug":"%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%95%b0%e6%8d%ae%e5%a4%87%e4%bb%bd%e5%ae%8c%e5%85%a8%e6%96%b9%e6%a1%88%ef%bc%9a3-2-1%e5%a4%87%e4%bb%bd%e5%8e%9f%e5%88%99%e3%80%81%e8%87%aa%e5%8a%a8%e5%8c%96%e8%84%9a","status":"publish","type":"post","link":"https:\/\/idc.net\/help\/442713\/","title":{"rendered":"\u670d\u52a1\u5668\u6570\u636e\u5907\u4efd\u5b8c\u5168\u65b9\u6848\uff1a3-2-1\u5907\u4efd\u539f\u5219\u3001\u81ea\u52a8\u5316\u811a\u672c\u4e0e\u5f02\u5730\u5bb9\u707e\u5b9e\u6218"},"content":{"rendered":"<p>\u6570\u636e\u4e22\u5931\u662f\u7ad9\u957f\u6700\u60e8\u75db\u7684\u4e8b\u6545\u4e4b\u4e00\u3002\u786c\u76d8\u6545\u969c\u3001\u8bef\u64cd\u4f5c\u3001\u52d2\u7d22\u8f6f\u4ef6\u653b\u51fb\u3001\u670d\u52a1\u5546\u8dd1\u8def\u2026\u2026\u4efb\u4f55\u4e00\u79cd\u60c5\u51b5\u90fd\u53ef\u80fd\u8ba9\u8f9b\u82e6\u79ef\u7d2f\u7684\u6570\u636e\u7070\u98de\u70df\u706d\u3002\u79d1\u5b66\u7684\u5907\u4efd\u7b56\u7565\u662f\u6bcf\u4e2a\u670d\u52a1\u5668\u7ba1\u7406\u5458\u7684\u5fc5\u4fee\u8bfe\u3002<\/p>\n<h2>\u4e00\u30013-2-1\u5907\u4efd\u539f\u5219<\/h2>\n<p>3-2-1\u539f\u5219\u662f\u4e1a\u754c\u516c\u8ba4\u7684\u5907\u4efd\u9ec4\u91d1\u6cd5\u5219\uff1a<\/p>\n<ul>\n<li><strong>3\u4efd\u6570\u636e<\/strong>\uff1a\u81f3\u5c11\u4fdd\u75593\u4efd\u6570\u636e\u526f\u672c\uff081\u4efd\u751f\u4ea7\u6570\u636e + 2\u4efd\u5907\u4efd\uff09<\/li>\n<li><strong>2\u79cd\u4ecb\u8d28<\/strong>\uff1a\u5907\u4efd\u5b58\u50a8\u5728\u81f3\u5c112\u79cd\u4e0d\u540c\u4ecb\u8d28\u4e0a\uff08\u5982\u672c\u5730\u78c1\u76d8 + \u5bf9\u8c61\u5b58\u50a8\uff09<\/li>\n<li><strong>1\u4efd\u5f02\u5730<\/strong>\uff1a\u81f3\u5c111\u4efd\u5907\u4efd\u5b58\u50a8\u5728\u5f02\u5730\uff08\u9632\u6b62\u673a\u623f\u7ea7\u6545\u969c\uff0c\u5982\u706b\u707e\u3001\u65ad\u7535\uff09<\/li>\n<\/ul>\n<p>\u4ee5\u9999\u6e2f\u670d\u52a1\u5668\u4e3a\u4f8b\uff0c\u5408\u7406\u76843-2-1\u5907\u4efd\u5b9e\u65bd\u65b9\u6848\uff1a<\/p>\n<ul>\n<li>\u751f\u4ea7\u6570\u636e\uff1a\u9999\u6e2f\u670d\u52a1\u5668\u672c\u5730<\/li>\n<li>\u672c\u5730\u5907\u4efd\uff1a\u540c\u4e00\u670d\u52a1\u5668\u7684\u72ec\u7acb\u5b58\u50a8\u5377\u6216\u5feb\u7167<\/li>\n<li>\u5f02\u5730\u5907\u4efd\uff1a\u7f8e\u56fd\u6216\u65b0\u52a0\u5761\u7684\u5bf9\u8c61\u5b58\u50a8\uff08S3\/OSS\uff09<\/li>\n<\/ul>\n<h2>\u4e8c\u3001\u6570\u636e\u5e93\u81ea\u52a8\u5907\u4efd\u811a\u672c\uff08MySQL\uff09<\/h2>\n<pre><code>#!\/bin\/bash\r\n# \/usr\/local\/bin\/mysql-backup.sh\r\n\r\nDB_USER=\"root\"\r\nDB_PASS=\"\u4f60\u7684\u6570\u636e\u5e93\u5bc6\u7801\"\r\nBACKUP_DIR=\"\/backup\/mysql\"\r\nDATE=$(date +%Y%m%d_%H%M%S)\r\nRETENTION_DAYS=30\r\n\r\nmkdir -p \"$BACKUP_DIR\"\r\n\r\n# \u5907\u4efd\u6240\u6709\u6570\u636e\u5e93\r\nfor DB in $(mysql -u\"$DB_USER\" -p\"$DB_PASS\" -e \"SHOW DATABASES;\" 2&gt;\/dev\/null | grep -Ev \"^(Database|information_schema|performance_schema|sys)$\"); do\r\n    echo \"\u6b63\u5728\u5907\u4efd\u6570\u636e\u5e93\uff1a$DB\"\r\n    mysqldump -u\"$DB_USER\" -p\"$DB_PASS\" \\\r\n        --single-transaction \\\r\n        --routines \\\r\n        --triggers \\\r\n        \"$DB\" | gzip &gt; \"$BACKUP_DIR\/${DB}_${DATE}.sql.gz\"\r\ndone\r\n\r\n# \u5220\u9664\u8d85\u8fc7\u4fdd\u7559\u5929\u6570\u7684\u65e7\u5907\u4efd\r\nfind \"$BACKUP_DIR\" -name \"*.sql.gz\" -mtime +\"$RETENTION_DAYS\" -delete\r\n\r\necho \"MySQL\u5907\u4efd\u5b8c\u6210\uff1a$DATE\"<\/code><\/pre>\n<h2>\u4e09\u3001\u7f51\u7ad9\u6587\u4ef6\u589e\u91cf\u5907\u4efd\uff08rsync\uff09<\/h2>\n<pre><code>#!\/bin\/bash\r\n# \/usr\/local\/bin\/files-backup.sh\r\n\r\nSOURCE=\"\/var\/www\/html\"\r\nBACKUP_DIR=\"\/backup\/files\"\r\nDATE=$(date +%Y%m%d)\r\n\r\nmkdir -p \"$BACKUP_DIR\"\r\n\r\n# \u589e\u91cf\u5907\u4efd\uff08\u53ea\u4f20\u8f93\u53d8\u5316\u7684\u6587\u4ef6\uff09\r\nrsync -avz --delete \\\r\n    --exclude=\"*.log\" \\\r\n    --exclude=\"cache\/*\" \\\r\n    --exclude=\".git\" \\\r\n    \"$SOURCE\/\" \\\r\n    \"$BACKUP_DIR\/latest\/\"\r\n\r\n# \u521b\u5efa\u6bcf\u65e5\u5feb\u7167\uff08\u786c\u94fe\u63a5\uff0c\u4e0d\u5360\u989d\u5916\u7a7a\u95f4\uff09\r\ncp -al \"$BACKUP_DIR\/latest\" \"$BACKUP_DIR\/snapshot_$DATE\"\r\n\r\n# \u53ea\u4fdd\u7559\u6700\u8fd114\u5929\u7684\u5feb\u7167\r\nls -dt \"$BACKUP_DIR\"\/snapshot_* | tail -n +15 | xargs rm -rf\r\n\r\necho \"\u6587\u4ef6\u5907\u4efd\u5b8c\u6210\uff1a$DATE\"<\/code><\/pre>\n<h2>\u56db\u3001\u5f02\u5730\u5907\u4efd\u5230\u5bf9\u8c61\u5b58\u50a8\uff08S3\u517c\u5bb9\uff09<\/h2>\n<p>\u4f7f\u7528rclone\u5c06\u672c\u5730\u5907\u4efd\u540c\u6b65\u5230S3\u517c\u5bb9\u7684\u5bf9\u8c61\u5b58\u50a8\uff08\u963f\u91cc\u4e91OSS\u3001Cloudflare R2\u7b49\u5747\u652f\u6301\uff09\uff1a<\/p>\n<pre><code># \u5b89\u88c5rclone\r\ncurl https:\/\/rclone.org\/install.sh | bash\r\n\r\n# \u914d\u7f6e\u8fdc\u7a0b\u5b58\u50a8\uff08\u4ee5Cloudflare R2\u4e3a\u4f8b\uff09\r\nrclone config\r\n# \u9009\u62e9new remote \u2192 \u547d\u540d\u4e3a r2backup\r\n# \u7c7b\u578b\u9009\u62e9 s3 \u2192 \u63d0\u4f9b\u5546\u9009\u62e9 Cloudflare R2\r\n# \u586b\u5165Access Key ID\u548cSecret Access Key<\/code><\/pre>\n<pre><code>#!\/bin\/bash\r\n# \/usr\/local\/bin\/offsite-backup.sh\r\n\r\nLOCAL_BACKUP=\"\/backup\"\r\nREMOTE=\"r2backup:\u4f60\u7684bucket\u540d\u79f0\/hongkong-server\"\r\nDATE=$(date +%Y%m%d)\r\n\r\n# \u540c\u6b65\u5230\u8fdc\u7a0b\uff08\u53ea\u4e0a\u4f20\u53d8\u5316\u7684\u6587\u4ef6\uff09\r\nrclone sync \"$LOCAL_BACKUP\" \"$REMOTE\/$DATE\" \\\r\n    --transfers 4 \\\r\n    --checkers 8 \\\r\n    --log-file \/var\/log\/rclone-backup.log \\\r\n    --log-level INFO\r\n\r\necho \"\u5f02\u5730\u5907\u4efd\u5b8c\u6210\uff1a$DATE\"<\/code><\/pre>\n<h2>\u4e94\u3001\u81ea\u52a8\u5316\u5b9a\u65f6\u4efb\u52a1\u914d\u7f6e<\/h2>\n<pre><code># \u7f16\u8f91crontab\r\ncrontab -e\r\n\r\n# \u6dfb\u52a0\u4ee5\u4e0b\u5b9a\u65f6\u4efb\u52a1\uff1a\r\n# \u6bcf\u5929\u51cc\u66681\u70b9\u5907\u4efdMySQL\r\n0 1 * * * \/usr\/local\/bin\/mysql-backup.sh &gt;&gt; \/var\/log\/mysql-backup.log 2&gt;&amp;1\r\n\r\n# \u6bcf\u5929\u51cc\u66682\u70b9\u5907\u4efd\u6587\u4ef6\r\n0 2 * * * \/usr\/local\/bin\/files-backup.sh &gt;&gt; \/var\/log\/files-backup.log 2&gt;&amp;1\r\n\r\n# \u6bcf\u5929\u51cc\u66683\u70b9\u540c\u6b65\u5230\u5f02\u5730\r\n0 3 * * * \/usr\/local\/bin\/offsite-backup.sh &gt;&gt; \/var\/log\/offsite-backup.log 2&gt;&amp;1\r\n\r\n# \u6bcf\u5468\u65e5\u51cc\u66684\u70b9\u68c0\u67e5\u5907\u4efd\u5b8c\u6574\u6027\r\n0 4 * * 0 \/usr\/local\/bin\/backup-verify.sh &gt;&gt; \/var\/log\/backup-verify.log 2&gt;&amp;1<\/code><\/pre>\n<h2>\u516d\u3001\u5907\u4efd\u9a8c\u8bc1\uff08\u6700\u5bb9\u6613\u88ab\u5ffd\u7565\u7684\u6b65\u9aa4\uff09<\/h2>\n<p>\u5907\u4efd\u4e0d\u9a8c\u8bc1\u7b49\u4e8e\u6ca1\u6709\u5907\u4efd\u3002\u6bcf\u5468\u81f3\u5c11\u6267\u884c\u4e00\u6b21\u6062\u590d\u6d4b\u8bd5\uff1a<\/p>\n<pre><code>#!\/bin\/bash\r\n# \/usr\/local\/bin\/backup-verify.sh\r\n\r\nBACKUP_DIR=\"\/backup\/mysql\"\r\nTEST_DB=\"backup_test_db\"\r\nLATEST_BACKUP=$(ls -t \"$BACKUP_DIR\"\/*.sql.gz | head -1)\r\n\r\necho \"\u9a8c\u8bc1\u5907\u4efd\u6587\u4ef6\uff1a$LATEST_BACKUP\"\r\n\r\n# \u521b\u5efa\u6d4b\u8bd5\u6570\u636e\u5e93\u5e76\u6062\u590d\r\nmysql -u root -p\u4f60\u7684\u5bc6\u7801 -e \"CREATE DATABASE IF NOT EXISTS $TEST_DB;\"\r\ngunzip &lt; \"$LATEST_BACKUP\" | mysql -u root -p\u4f60\u7684\u5bc6\u7801 \"$TEST_DB\" # \u68c0\u67e5\u8868\u6570\u91cf\uff08\u7b80\u5355\u9a8c\u8bc1\uff09 TABLE_COUNT=$(mysql -u root -p\u4f60\u7684\u5bc6\u7801 -e \"SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$TEST_DB';\" 2&gt;\/dev\/null | tail -1)\r\n\r\nif [ \"$TABLE_COUNT\" -gt \"0\" ]; then\r\n    echo \"\u2705 \u5907\u4efd\u9a8c\u8bc1\u901a\u8fc7\uff0c\u6062\u590d\u4e86 $TABLE_COUNT \u5f20\u8868\"\r\nelse\r\n    echo \"\u274c \u5907\u4efd\u9a8c\u8bc1\u5931\u8d25\uff0c\u8bf7\u7acb\u5373\u68c0\u67e5\uff01\"\r\n    # \u53d1\u9001\u544a\u8b66\u90ae\u4ef6\r\n    echo \"\u5907\u4efd\u9a8c\u8bc1\u5931\u8d25\" | mail -s \"\u26a0\ufe0f \u670d\u52a1\u5668\u5907\u4efd\u5f02\u5e38\" \u4f60\u7684\u90ae\u7bb1@example.com\r\nfi\r\n\r\n# \u6e05\u7406\u6d4b\u8bd5\u6570\u636e\u5e93\r\nmysql -u root -p\u4f60\u7684\u5bc6\u7801 -e \"DROP DATABASE $TEST_DB;\"<\/code><\/pre>\n<h2>\u4e03\u3001\u670d\u52a1\u5668\u5feb\u7167\u5907\u4efd<\/h2>\n<p>\u9664\u4e86\u6587\u4ef6\u7ea7\u5907\u4efd\uff0cIDC.Net\u652f\u6301\u670d\u52a1\u5668\u5feb\u7167\uff08Snapshot\uff09\u529f\u80fd\uff0c\u53ef\u5bf9\u6574\u4e2a\u7cfb\u7edf\u76d8\u521b\u5efa\u65f6\u95f4\u70b9\u5feb\u7167\uff1a<\/p>\n<ul>\n<li>\u5feb\u7167\u5728\u670d\u52a1\u5546\u57fa\u7840\u8bbe\u65bd\u5c42\u9762\u4fdd\u5b58\uff0c\u4e0e\u670d\u52a1\u5668\u6570\u636e\u72ec\u7acb<\/li>\n<li>\u9002\u5408\u5728\u7cfb\u7edf\u5347\u7ea7\u3001\u5927\u7248\u672c\u66f4\u65b0\u524d\u521b\u5efa\uff0c\u51fa\u95ee\u9898\u53ef\u4e00\u952e\u56de\u6eda<\/li>\n<li>\u5feb\u7167\u6062\u590d\u65f6\u95f4\u901a\u5e38\u57285~15\u5206\u949f\u5185<\/li>\n<li>\u5efa\u8bae\u4e0e\u6587\u4ef6\u7ea7\u5907\u4efd\u7ed3\u5408\u4f7f\u7528\uff0c\u4e92\u4e3a\u8865\u5145<\/li>\n<\/ul>\n<h2>\u516b\u3001\u5907\u4efd\u7b56\u7565\u603b\u7ed3<\/h2>\n<table>\n<thead>\n<tr>\n<th>\u5907\u4efd\u7c7b\u578b<\/th>\n<th>\u9891\u7387<\/th>\n<th>\u4fdd\u7559\u65f6\u95f4<\/th>\n<th>\u5b58\u50a8\u4f4d\u7f6e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u6570\u636e\u5e93\u5168\u91cf\u5907\u4efd<\/td>\n<td>\u6bcf\u5929<\/td>\n<td>30\u5929<\/td>\n<td>\u672c\u5730 + \u5f02\u5730<\/td>\n<\/tr>\n<tr>\n<td>\u7f51\u7ad9\u6587\u4ef6\u589e\u91cf\u5907\u4efd<\/td>\n<td>\u6bcf\u5929<\/td>\n<td>14\u5929\u5feb\u7167<\/td>\n<td>\u672c\u5730<\/td>\n<\/tr>\n<tr>\n<td>\u5f02\u5730\u5bf9\u8c61\u5b58\u50a8\u540c\u6b65<\/td>\n<td>\u6bcf\u5929<\/td>\n<td>90\u5929<\/td>\n<td>\u5f02\u5730\u4e91\u5b58\u50a8<\/td>\n<\/tr>\n<tr>\n<td>\u670d\u52a1\u5668\u7cfb\u7edf\u5feb\u7167<\/td>\n<td>\u6bcf\u5468 + \u91cd\u5927\u53d8\u66f4\u524d<\/td>\n<td>3~5\u4e2a\u7248\u672c<\/td>\n<td>\u670d\u52a1\u5546\u57fa\u7840\u8bbe\u65bd<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>IDC.Net\u7684<a href=\"https:\/\/idc.net\/cloud-hk\/\">\u9999\u6e2fVPS<\/a>\u652f\u6301\u5feb\u7167\u5907\u4efd\u529f\u80fd\uff0c\u914d\u5408\u672c\u6587\u7684\u81ea\u52a8\u5316\u811a\u672c\uff0c\u5373\u53ef\u6784\u5efa\u5b8c\u6574\u76843-2-1\u5907\u4efd\u4f53\u7cfb\uff0c\u8ba9\u6570\u636e\u5b89\u5168\u6709\u5145\u5206\u4fdd\u969c\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6570\u636e\u4e22\u5931\u662f\u7ad9\u957f\u6700\u60e8\u75db\u7684\u4e8b\u6545\u4e4b\u4e00\u3002\u786c\u76d8\u6545\u969c\u3001\u8bef\u64cd\u4f5c\u3001\u52d2\u7d22\u8f6f\u4ef6\u653b\u51fb\u3001\u670d\u52a1\u5546\u8dd1\u8def\u2026\u2026\u4efb\u4f55\u4e00\u79cd\u60c5\u51b5\u90fd\u53ef\u80fd\u8ba9\u8f9b\u82e6\u79ef\u7d2f\u7684\u6570 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[202645],"tags":[],"class_list":["post-442713","post","type-post","status-publish","format-standard","hentry","category-202645"],"_links":{"self":[{"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/posts\/442713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/comments?post=442713"}],"version-history":[{"count":1,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/posts\/442713\/revisions"}],"predecessor-version":[{"id":442714,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/posts\/442713\/revisions\/442714"}],"wp:attachment":[{"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/media?parent=442713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/categories?post=442713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/idc.net\/help\/wp-json\/wp\/v2\/tags?post=442713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}