<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数据库 on Zata-砸它</title><link>https://www.zata.cc/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/</link><description>Recent content in 数据库 on Zata-砸它</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Example Person</copyright><lastBuildDate>Thu, 28 May 2026 17:04:36 +0800</lastBuildDate><atom:link href="https://www.zata.cc/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/index.xml" rel="self" type="application/rss+xml"/><item><title>数据库备份实战</title><link>https://www.zata.cc/p/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%87%E4%BB%BD%E5%AE%9E%E6%88%98/</link><pubDate>Thu, 28 May 2026 14:55:07 +0800</pubDate><guid>https://www.zata.cc/p/%E6%95%B0%E6%8D%AE%E5%BA%93%E5%A4%87%E4%BB%BD%E5%AE%9E%E6%88%98/</guid><description>&lt;img src="https://www.zata.cc/images/index/index.png" alt="Featured image of post 数据库备份实战" />&lt;h2 id="前言">前言
&lt;/h2>&lt;p>数据是企业的核心资产，数据库备份是数据安全的最后一道防线。本文将系统介绍 PostgreSQL 和 MySQL 的备份方法、自动化策略以及恢复演练流程。&lt;/p>
&lt;h2 id="一postgresql-备份">一、PostgreSQL 备份
&lt;/h2>&lt;h3 id="11-pg_dump-基础用法">1.1 pg_dump 基础用法
&lt;/h3>&lt;p>&lt;code>pg_dump&lt;/code> 是 PostgreSQL 最常用的逻辑备份工具，支持单数据库导出。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 基本备份命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h localhost -U postgres -d mydb &amp;gt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 压缩备份（推荐）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h localhost -U postgres -d mydb -Fc &amp;gt; backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅备份结构（不含数据）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h localhost -U postgres -d mydb --schema-only &amp;gt; schema.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅备份数据（不含结构）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h localhost -U postgres -d mydb --data-only &amp;gt; data.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 备份指定表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h localhost -U postgres -d mydb -t users -t orders &amp;gt; tables.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>参数说明：&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>参数&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>-h&lt;/code>&lt;/td>
&lt;td>数据库主机地址&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-U&lt;/code>&lt;/td>
&lt;td>连接用户名&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-d&lt;/code>&lt;/td>
&lt;td>数据库名称&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-Fc&lt;/code>&lt;/td>
&lt;td>自定义格式压缩（推荐，支持并行恢复）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-t&lt;/code>&lt;/td>
&lt;td>指定备份的表&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="12-pg_dumpall-全库备份">1.2 pg_dumpall 全库备份
&lt;/h3>&lt;p>备份整个 PostgreSQL 实例（所有数据库 + 全局对象）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 备份所有数据库和全局对象（角色、表空间等）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dumpall -h localhost -U postgres &amp;gt; all_databases.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅备份全局对象（角色定义）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dumpall -h localhost -U postgres --globals-only &amp;gt; globals.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="13-恢复方法">1.3 恢复方法
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复 SQL 格式备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -h localhost -U postgres -d mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复自定义格式备份（支持并行）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb -j &lt;span class="m">4&lt;/span> backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复前创建新数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">createdb -h localhost -U postgres mydb_restore
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb_restore backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="二mysql-备份">二、MySQL 备份
&lt;/h2>&lt;h3 id="21-mysqldump-基础用法">2.1 mysqldump 基础用法
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 基本备份命令&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p mydb &amp;gt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 备份所有数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p --all-databases &amp;gt; all_databases.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 备份指定表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p mydb users orders &amp;gt; tables.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅备份结构&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p mydb --no-data &amp;gt; schema.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅备份数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p mydb --no-create-info &amp;gt; data.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>推荐参数组合：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 生产环境推荐参数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h localhost -u root -p &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --single-transaction &lt;span class="se">\ &lt;/span> &lt;span class="c1"># InnoDB 一致性快照&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --routines &lt;span class="se">\ &lt;/span> &lt;span class="c1"># 包含存储过程和函数&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --triggers &lt;span class="se">\ &lt;/span> &lt;span class="c1"># 包含触发器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --events &lt;span class="se">\ &lt;/span> &lt;span class="c1"># 包含事件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> --master-data&lt;span class="o">=&lt;/span>&lt;span class="m">2&lt;/span> &lt;span class="se">\ &lt;/span> &lt;span class="c1"># 记录 binlog 位置（用于主从同步）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> mydb &amp;gt; backup.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="22-恢复方法">2.2 恢复方法
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复所有数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p &amp;lt; all_databases.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="三其他-postgresql-图形化工具">三、其他 PostgreSQL 图形化工具
&lt;/h2>&lt;p>除了 Navicat，还有多种优秀的 PostgreSQL 客户端工具支持备份和恢复功能。&lt;/p>
&lt;h3 id="31-pgadmin">3.1 pgAdmin
&lt;/h3>&lt;p>pgAdmin 是 PostgreSQL 官方推荐的免费图形化管理工具：&lt;/p>
&lt;p>&lt;strong>安装方法：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 Homebrew 安装（macOS）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install --cask pgadmin4
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或从官网下载：https://www.pgadmin.org/download/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>备份步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>连接数据库服务器，选择目标数据库&lt;/li>
&lt;li>右键点击数据库 →「备份」&lt;/li>
&lt;li>配置备份选项：
&lt;ul>
&lt;li>&lt;strong>格式&lt;/strong>：Custom（推荐）、Directory、Plain SQL、Tar&lt;/li>
&lt;li>&lt;strong>编码&lt;/strong>：UTF8（推荐）&lt;/li>
&lt;li>&lt;strong>中定义&lt;/strong>：选择「仅结构」或「结构和数据」&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>选择备份文件保存位置，点击「备份」&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>恢复步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>右键点击目标数据库 →「恢复」&lt;/li>
&lt;li>选择备份文件（.backup 或 .dump）&lt;/li>
&lt;li>配置恢复选项：
&lt;ul>
&lt;li>&lt;strong>架构&lt;/strong>：选择要恢复的 schema&lt;/li>
&lt;li>&lt;strong>数据&lt;/strong>：选择要恢复的表&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>点击「恢复」执行&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>优点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>免费开源，官方推荐&lt;/li>
&lt;li>功能全面，支持服务器管理&lt;/li>
&lt;li>跨平台（Windows/macOS/Linux）&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>缺点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>界面较复杂，新手上手较难&lt;/li>
&lt;li>大数据库备份可能较慢&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="32-dbeaver">3.2 DBeaver
&lt;/h3>&lt;p>DBeaver 是一款功能强大的免费数据库管理工具，支持 PostgreSQL 及多种数据库：&lt;/p>
&lt;p>&lt;strong>安装方法：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 Homebrew 安装（macOS）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install --cask dbeaver-community
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或从官网下载：https://dbeaver.io/download/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>备份步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>右键点击数据库 →「工具」→「备份数据库」&lt;/li>
&lt;li>选择备份对象（整个库或指定表）&lt;/li>
&lt;li>配置备份选项：
&lt;ul>
&lt;li>&lt;strong>格式&lt;/strong>：SQL、Dump、CSV 等&lt;/li>
&lt;li>&lt;strong>选项&lt;/strong>：包含索引、触发器、外键等&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>保存备份文件&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>恢复步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>右键点击目标数据库 →「工具」→「恢复数据库」&lt;/li>
&lt;li>选择备份文件&lt;/li>
&lt;li>配置恢复选项&lt;/li>
&lt;li>执行恢复&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>优点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>完全免费开源&lt;/li>
&lt;li>支持 80+ 种数据库&lt;/li>
&lt;li>界面友好，功能丰富&lt;/li>
&lt;li>支持数据导出/导入&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>缺点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>功能较多，界面稍显复杂&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="33-datagrip">3.3 DataGrip
&lt;/h3>&lt;p>JetBrains DataGrip 是一款专业的数据库 IDE（付费）：&lt;/p>
&lt;p>&lt;strong>安装方法：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 Homebrew 安装（macOS）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install --cask datagrip
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或从官网下载：https://www.jetbrains.com/datagrip/download/&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>备份方式：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>右键数据库 →「Dump to File」导出&lt;/li>
&lt;li>使用 Database Diff 进行数据库同步备份&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>特点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>强大的 SQL 编辑和调试功能&lt;/li>
&lt;li>支持多数据库管理&lt;/li>
&lt;li>与 JetBrains 全家桶集成良好&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="34-heidisql">3.4 HeidiSQL
&lt;/h3>&lt;p>HeidiSQL 主要用于 MySQL/MariaDB，但也支持 PostgreSQL：&lt;/p>
&lt;p>&lt;strong>备份：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>右键数据库 →「导出数据库为 SQL」&lt;/li>
&lt;li>支持自定义导出选项&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>特点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>免费、轻量级&lt;/li>
&lt;li>Windows 专用&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="35-phppgadmin">3.5 phpPgAdmin
&lt;/h3>&lt;p>基于 Web 的 PostgreSQL 管理工具：&lt;/p>
&lt;p>&lt;strong>特点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>浏览器访问，无需安装客户端&lt;/li>
&lt;li>适合服务器管理&lt;/li>
&lt;li>功能相对基础&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="36-adminer">3.6 Adminer
&lt;/h3>&lt;p>轻量级单文件数据库管理工具：&lt;/p>
&lt;p>&lt;strong>特点：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>仅一个 PHP 文件，非常轻量&lt;/li>
&lt;li>支持 PostgreSQL、MySQL、MongoDB 等&lt;/li>
&lt;li>可直接通过 Web 访问&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="37-工具对比">3.7 工具对比
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>工具&lt;/th>
&lt;th>类型&lt;/th>
&lt;th>价格&lt;/th>
&lt;th>跨平台&lt;/th>
&lt;th>特点&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>Navicat&lt;/strong>&lt;/td>
&lt;td>桌面应用&lt;/td>
&lt;td>付费&lt;/td>
&lt;td>Windows/macOS/Linux&lt;/td>
&lt;td>功能全面，界面美观&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>pgAdmin&lt;/strong>&lt;/td>
&lt;td>桌面应用&lt;/td>
&lt;td>免费&lt;/td>
&lt;td>全平台&lt;/td>
&lt;td>官方推荐，功能强大&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>DBeaver&lt;/strong>&lt;/td>
&lt;td>桌面应用&lt;/td>
&lt;td>免费&lt;/td>
&lt;td>全平台&lt;/td>
&lt;td>开源社区活跃&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>DataGrip&lt;/strong>&lt;/td>
&lt;td>IDE&lt;/td>
&lt;td>付费&lt;/td>
&lt;td>全平台&lt;/td>
&lt;td>开发者友好&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>HeidiSQL&lt;/strong>&lt;/td>
&lt;td>桌面应用&lt;/td>
&lt;td>免费&lt;/td>
&lt;td>Windows&lt;/td>
&lt;td>轻量级&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>phpPgAdmin&lt;/strong>&lt;/td>
&lt;td>Web 应用&lt;/td>
&lt;td>免费&lt;/td>
&lt;td>全平台&lt;/td>
&lt;td>无需安装客户端&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Adminer&lt;/strong>&lt;/td>
&lt;td>Web 应用&lt;/td>
&lt;td>免费&lt;/td>
&lt;td>全平台&lt;/td>
&lt;td>极轻量级&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="38-命令行工具补充">3.8 命令行工具补充
&lt;/h3>&lt;p>除了图形化工具，以下命令行工具也非常有用：&lt;/p>
&lt;p>&lt;strong>pg_dumpall&lt;/strong>（已介绍）：备份所有数据库&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pg_dumpall -h localhost -U postgres &amp;gt; all.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>psql&lt;/strong>（已介绍）：恢复 SQL 文件&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">psql -h localhost -U postgres -d mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>pg_basebackup&lt;/strong>：物理备份（完整数据库复制）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建物理备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_basebackup -h localhost -U postgres -D /backup/base -Ft -z -P
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复物理备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -d postgres /backup/base
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Barman&lt;/strong>：企业级备份管理工具&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置备份服务器&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">barman check pg_server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">barman backup pg_server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">barman recover pg_server latest /var/lib/postgresql/data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="四navicat-图形化备份">四、Navicat 图形化备份
&lt;/h2>&lt;p>Navicat 是一款流行的数据库管理工具，支持 MySQL、PostgreSQL、SQL Server、Oracle 等多种数据库，提供直观的图形界面进行备份操作。&lt;/p>
&lt;p>&lt;strong>安装方法：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 Homebrew 安装 Navicat Premium（macOS）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install --cask navicat-premium
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或安装 Navicat for PostgreSQL 专用版&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">brew install --cask navicat-for-postgresql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或从官网下载：https://www.navicat.com.cn/download/navicat-premium&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="41-postgresql-备份">4.1 PostgreSQL 备份
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>连接数据库&lt;/strong>：在左侧连接列表中选择 PostgreSQL 连接&lt;/li>
&lt;li>&lt;strong>开始备份&lt;/strong>：
&lt;ul>
&lt;li>右键点击目标数据库 → 选择「备份数据库」&lt;/li>
&lt;li>或菜单栏选择「工具」→「备份数据库」&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>配置备份选项&lt;/strong>：
&lt;ul>
&lt;li>选择备份格式（建议选择「自定义」格式）&lt;/li>
&lt;li>可选择要包含的对象（表、视图、函数等）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>保存备份&lt;/strong>：点击「开始」后选择保存位置&lt;/li>
&lt;/ol>
&lt;h3 id="42-mysql-备份">4.2 MySQL 备份
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>连接数据库&lt;/strong>：在左侧连接列表中选择 MySQL 连接&lt;/li>
&lt;li>&lt;strong>数据同步（迁移备份）&lt;/strong>：
&lt;ul>
&lt;li>菜单栏选择「工具」→「数据同步」&lt;/li>
&lt;li>源选择当前数据库&lt;/li>
&lt;li>目标选择文件或另一个数据库&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>导出数据库&lt;/strong>：
&lt;ul>
&lt;li>右键数据库 →「转储 SQL 文件」→「结构和数据」或「仅结构」&lt;/li>
&lt;li>自动生成 .sql 文件保存到本地&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="43-定时自动备份navicat-premium">4.3 定时自动备份（Navicat Premium）
&lt;/h3>&lt;p>Navicat Premium 支持定时任务自动备份：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>新建批处理作业&lt;/strong>：
&lt;ul>
&lt;li>菜单栏选择「工具」→「自动运行」或「计划」&lt;/li>
&lt;li>点击「新建批处理作业」&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>添加备份任务&lt;/strong>：
&lt;ul>
&lt;li>从左侧拖拽「备份」任务到右侧流程区&lt;/li>
&lt;li>选择连接和数据库&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>配置定时计划&lt;/strong>：
&lt;ul>
&lt;li>勾选「计划」选项卡&lt;/li>
&lt;li>设置执行频率（每天、每周等）&lt;/li>
&lt;li>设置执行时间&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>保存并启用&lt;/strong>：
&lt;ul>
&lt;li>保存批处理作业&lt;/li>
&lt;li>勾选「启用」启动定时任务&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="44-navicat-cloud-备份">4.4 Navicat Cloud 备份
&lt;/h3>&lt;p>Navicat Cloud 提供云端备份同步功能：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>登录 Navicat Cloud&lt;/strong>：
&lt;ul>
&lt;li>菜单栏「文件」→「登录 Navicat Cloud」&lt;/li>
&lt;li>输入账号密码&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>同步备份&lt;/strong>：
&lt;ul>
&lt;li>右键数据库 →「备份到 Navicat Cloud」&lt;/li>
&lt;li>或通过「工具」→「同步」上传备份&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>恢复云端备份&lt;/strong>：
&lt;ul>
&lt;li>从 Navicat Cloud 下载备份文件&lt;/li>
&lt;li>恢复到本地数据库&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="45-navicat-恢复数据库">4.5 Navicat 恢复数据库
&lt;/h3>&lt;p>备份的最终目的是恢复，Navicat 提供了便捷的恢复功能：&lt;/p>
&lt;p>&lt;strong>PostgreSQL 恢复步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>右键点击目标数据库 → 选择「还原数据库」&lt;/li>
&lt;li>选择备份文件（.backup 或 .dump 格式）&lt;/li>
&lt;li>配置恢复选项：
&lt;ul>
&lt;li>&lt;strong>仅还原结构&lt;/strong>：只恢复表结构，不恢复数据&lt;/li>
&lt;li>&lt;strong>仅还原数据&lt;/strong>：只恢复数据，表结构需已存在&lt;/li>
&lt;li>&lt;strong>结构和数据&lt;/strong>：完整恢复（推荐）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>点击「开始」执行恢复&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>MySQL 恢复步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>运行 SQL 文件&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>右键目标数据库 →「运行 SQL 文件」&lt;/li>
&lt;li>选择之前导出的 .sql 备份文件&lt;/li>
&lt;li>执行导入&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>数据同步恢复&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>菜单栏「工具」→「数据同步」&lt;/li>
&lt;li>源选择备份文件或备份库&lt;/li>
&lt;li>目标选择要恢复的数据库&lt;/li>
&lt;li>执行同步&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>恢复注意事项：&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>场景&lt;/th>
&lt;th>注意事项&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>覆盖恢复&lt;/strong>&lt;/td>
&lt;td>确保目标库已清空或删除，避免数据冲突&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>部分恢复&lt;/strong>&lt;/td>
&lt;td>可选择仅恢复特定表，减少恢复时间&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>跨版本恢复&lt;/strong>&lt;/td>
&lt;td>高版本备份可能无法恢复到低版本数据库&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>字符集问题&lt;/strong>&lt;/td>
&lt;td>确保备份和恢复使用相同字符集，避免乱码&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="46-navicat-备份注意事项">4.6 Navicat 备份注意事项
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>注意事项&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>备份位置&lt;/strong>&lt;/td>
&lt;td>建议保存到非系统盘，避免系统崩溃丢失&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>文件命名&lt;/strong>&lt;/td>
&lt;td>包含日期时间，便于追溯（如 &lt;code>mydb_20260528.sql&lt;/code>）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>定期检查&lt;/strong>&lt;/td>
&lt;td>定期验证备份文件能否正常恢复&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>大数据库&lt;/strong>&lt;/td>
&lt;td>超大数据库建议使用命令行工具，性能更优&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>密码保护&lt;/strong>&lt;/td>
&lt;td>敏感数据库建议设置备份文件密码&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="五自动化备份脚本">五、自动化备份脚本
&lt;/h2>&lt;h3 id="51-postgresql-自动备份脚本">5.1 PostgreSQL 自动备份脚本
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="c1"># pg_backup.sh - PostgreSQL 自动备份脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PG_HOST&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;localhost&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PG_USER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;postgres&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PG_PORT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;5432&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BACKUP_DIR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/backup/postgresql&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">RETENTION_DAYS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DATE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>date +%Y%m%d_%H%M%S&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建备份目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir -p &lt;span class="nv">$BACKUP_DIR&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 获取所有数据库列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DATABASES&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>psql -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> -p &lt;span class="nv">$PG_PORT&lt;/span> -t -c &lt;span class="s2">&amp;#34;SELECT datname FROM pg_database WHERE datistemplate = false;&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 遍历备份每个数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> DB in &lt;span class="nv">$DATABASES&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nv">DB&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>&lt;span class="nb">echo&lt;/span> &lt;span class="nv">$DB&lt;/span> &lt;span class="p">|&lt;/span> tr -d &lt;span class="s1">&amp;#39; &amp;#39;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -n &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$DB&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;正在备份数据库: &lt;/span>&lt;span class="nv">$DB&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> pg_dump -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> -p &lt;span class="nv">$PG_PORT&lt;/span> -d &lt;span class="nv">$DB&lt;/span> -Fc &amp;gt; &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$BACKUP_DIR&lt;/span>&lt;span class="s2">/&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">DB&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">_&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">DATE&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">.dump&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清理过期备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">find &lt;span class="nv">$BACKUP_DIR&lt;/span> -name &lt;span class="s2">&amp;#34;*.dump&amp;#34;&lt;/span> -mtime +&lt;span class="nv">$RETENTION_DAYS&lt;/span> -delete
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;备份完成！&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="52-mysql-自动备份脚本">5.2 MySQL 自动备份脚本
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="c1"># mysql_backup.sh - MySQL 自动备份脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 配置变量&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">MYSQL_HOST&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;localhost&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">MYSQL_USER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;root&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">MYSQL_PASS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;your_password&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BACKUP_DIR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/backup/mysql&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">RETENTION_DAYS&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">7&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DATE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>date +%Y%m%d_%H%M%S&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 创建备份目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mkdir -p &lt;span class="nv">$BACKUP_DIR&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 获取所有数据库列表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DATABASES&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>mysql -h &lt;span class="nv">$MYSQL_HOST&lt;/span> -u &lt;span class="nv">$MYSQL_USER&lt;/span> -p&lt;span class="nv">$MYSQL_PASS&lt;/span> -e &lt;span class="s2">&amp;#34;SHOW DATABASES;&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> grep -v Database &lt;span class="p">|&lt;/span> grep -v information_schema &lt;span class="p">|&lt;/span> grep -v performance_schema&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 遍历备份每个数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">for&lt;/span> DB in &lt;span class="nv">$DATABASES&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">do&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;正在备份数据库: &lt;/span>&lt;span class="nv">$DB&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> mysqldump -h &lt;span class="nv">$MYSQL_HOST&lt;/span> -u &lt;span class="nv">$MYSQL_USER&lt;/span> -p&lt;span class="nv">$MYSQL_PASS&lt;/span> &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --single-transaction --routines --triggers --events &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> &lt;span class="nv">$DB&lt;/span> &lt;span class="p">|&lt;/span> gzip &amp;gt; &lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="nv">$BACKUP_DIR&lt;/span>&lt;span class="s2">/&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">DB&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">_&lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nv">DATE&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">.sql.gz&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">done&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 清理过期备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">find &lt;span class="nv">$BACKUP_DIR&lt;/span> -name &lt;span class="s2">&amp;#34;*.sql.gz&amp;#34;&lt;/span> -mtime +&lt;span class="nv">$RETENTION_DAYS&lt;/span> -delete
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;备份完成！&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="53-配置定时任务">5.3 配置定时任务
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 编辑 crontab&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">crontab -e
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 每天凌晨 2 点执行备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> &lt;span class="m">2&lt;/span> * * * /scripts/pg_backup.sh &amp;gt;&amp;gt; /var/log/pg_backup.log 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="m">0&lt;/span> &lt;span class="m">2&lt;/span> * * * /scripts/mysql_backup.sh &amp;gt;&amp;gt; /var/log/mysql_backup.log 2&amp;gt;&lt;span class="p">&amp;amp;&lt;/span>&lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="六云存储备份">六、云存储备份
&lt;/h2>&lt;h3 id="51-上传到-aws-s3">5.1 上传到 AWS S3
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="c1"># upload_to_s3.sh&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BACKUP_DIR&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/backup/postgresql&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">S3_BUCKET&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;s3://your-bucket/database-backups&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">DATE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>date +%Y%m%d&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 同步备份文件到 S3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">aws s3 sync &lt;span class="nv">$BACKUP_DIR&lt;/span> &lt;span class="nv">$S3_BUCKET&lt;/span>/&lt;span class="nv">$DATE&lt;/span>/ &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --storage-class STANDARD_IA &lt;span class="se">\
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="se">&lt;/span> --delete
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 设置生命周期规则自动清理旧备份（在 S3 控制台配置）&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="52-上传到-cloudflare-r2">5.2 上传到 Cloudflare R2
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 使用 rclone 同步到 R2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">rclone sync /backup/postgresql r2:your-bucket/database-backups/&lt;span class="k">$(&lt;/span>date +%Y%m%d&lt;span class="k">)&lt;/span>/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="七备份策略最佳实践">七、备份策略最佳实践
&lt;/h2>&lt;h3 id="61-备份类型对比">6.1 备份类型对比
&lt;/h3>&lt;table>
&lt;thead>
&lt;tr>
&lt;th>类型&lt;/th>
&lt;th>说明&lt;/th>
&lt;th>优点&lt;/th>
&lt;th>缺点&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>全量备份&lt;/strong>&lt;/td>
&lt;td>备份所有数据&lt;/td>
&lt;td>恢复简单快速&lt;/td>
&lt;td>占用空间大，耗时长&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>增量备份&lt;/strong>&lt;/td>
&lt;td>仅备份变化数据&lt;/td>
&lt;td>占用空间小&lt;/td>
&lt;td>恢复需要全量+所有增量&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>差异备份&lt;/strong>&lt;/td>
&lt;td>备份自上次全量后的变化&lt;/td>
&lt;td>恢复比增量快&lt;/td>
&lt;td>比增量占用更多空间&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="62-推荐策略">6.2 推荐策略
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">生产环境推荐备份策略：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">┌─────────────────────────────────────────────────────┐
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 周日：全量备份 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 周一~周六：增量备份 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 保留周期：至少 4 周 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 异地备份：同步到云存储（S3/R2/OSS） │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">│ 恢复演练：每月至少 1 次 │
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└─────────────────────────────────────────────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="63-备份验证清单">6.3 备份验证清单
&lt;/h3>&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> 备份文件是否完整生成&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 备份文件大小是否合理&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 备份是否按时执行（检查 cron 日志）&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 异地备份是否同步成功&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> 定期进行恢复演练&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="八数据恢复命令行">八、数据恢复（命令行）
&lt;/h2>&lt;p>命令行恢复是生产环境中最重要的技能，本节详细介绍 PostgreSQL 和 MySQL 的恢复操作。&lt;/p>
&lt;h3 id="71-postgresql-恢复详解">7.1 PostgreSQL 恢复详解
&lt;/h3>&lt;p>&lt;strong>基础恢复命令：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复 SQL 格式备份（纯文本）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -h localhost -U postgres -d mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复自定义格式备份（.dump 文件）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 并行恢复（加快大数据库恢复速度）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb -j &lt;span class="m">4&lt;/span> backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>创建新数据库恢复：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 创建新数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">createdb -h localhost -U postgres mydb_new
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 恢复数据到新数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb_new backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>恢复前清理目标库：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 如果目标库存在且要完全覆盖，先删除&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dropdb -h localhost -U postgres mydb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 重新创建数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">createdb -h localhost -U postgres mydb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>选择性恢复（仅恢复指定表）：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 列出备份中的所有对象&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -l backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅恢复特定表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb -t users backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb -t orders backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅恢复存储过程&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb -P -t function_name backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>恢复前检查选项：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 先检查备份文件内容（不执行恢复）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore --help &lt;span class="c1"># 查看所有选项&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 不带数据恢复（仅检查结构）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb --schema-only backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复到另一个表空间&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d mydb --tablespace&lt;span class="o">=&lt;/span>new_space backup.dump
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="72-mysql-恢复详解">7.2 MySQL 恢复详解
&lt;/h3>&lt;p>&lt;strong>基础恢复命令：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复单个数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复所有数据库（备份时包含 CREATE DATABASE 语句）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p &amp;lt; all_databases.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 恢复压缩备份（gzip 格式）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">gunzip &amp;lt; backup.sql.gz &lt;span class="p">|&lt;/span> mysql -h localhost -u root -p mydb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或使用 zcat&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">zcat backup.sql.gz &lt;span class="p">|&lt;/span> mysql -h localhost -u root -p mydb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>指定字符集恢复：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 如果有字符集问题，指定字符集&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p --default-character-set&lt;span class="o">=&lt;/span>utf8mb4 mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或在 SQL 文件开头设置&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p --init-command&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;SET NAMES utf8mb4&amp;#34;&lt;/span> mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>覆盖恢复（先清空后导入）：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 删除并重建数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p -e &lt;span class="s2">&amp;#34;DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 恢复数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; backup.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>选择性恢复（仅恢复指定表）：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法1：使用 sed 提取指定表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sed -n &lt;span class="s1">&amp;#39;/DROP TABLE.*`表名`;/,/UNLOCK TABLES;/p&amp;#39;&lt;/span> backup.sql &amp;gt; table.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; table.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法2：使用 mysqlimport（需要先创建空表）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqlimport -h localhost -u root -p mydb table_data.txt
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 方法3：使用 mydumper 并行导出/导入指定表&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mydumper -h localhost -u root -p -o /backup/tables -t users -t orders
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">myloader -h localhost -u root -p -d /backup/tables -o mydb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>表结构与数据分离恢复：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅恢复表结构&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; schema.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 仅恢复数据（表结构需已存在）&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb --init-command&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;SET foreign_key_checks=0; SET unique_checks=0; SET SESSION tx_isolation=&amp;#39;READ-UNCOMMITTED&amp;#39;;&amp;#34;&lt;/span> &amp;lt; data.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="73-恢复高级技巧">7.3 恢复高级技巧
&lt;/h3>&lt;p>&lt;strong>时间点恢复（PITR）：&lt;/strong>&lt;/p>
&lt;p>PostgreSQL 支持基于时间点的恢复：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 停止 PostgreSQL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl stop postgresql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 备份当前数据目录&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo cp -r /var/lib/postgresql/data /var/lib/postgresql/data.bak
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 恢复到指定时间点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PGDATA&lt;/span>&lt;span class="o">=&lt;/span>/var/lib/postgresql/data pg_restore -P --clean --create --dbname&lt;span class="o">=&lt;/span>postgres backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 或编辑 postgresql.conf 设置恢复目标时间&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># recovery_target_time = &amp;#39;2026-05-28 10:00:00&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>MySQL binlog 恢复：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 确定恢复时间点&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqlbinlog --start-datetime&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2026-05-28 10:00:00&amp;#34;&lt;/span> --stop-datetime&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;2026-05-28 12:00:00&amp;#34;&lt;/span> mysql-bin.000001 &amp;gt; recovery.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 应用恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysql -h localhost -u root -p mydb &amp;lt; recovery.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>增量备份恢复：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># PostgreSQL WAL 归档恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 恢复基础全量备份&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h localhost -U postgres -d postgres backup.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 应用 WAL 文件&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -h localhost -U postgres -d mydb &amp;lt; &lt;span class="m">000000010000000000000001&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -h localhost -U postgres -d mydb &amp;lt; &lt;span class="m">000000010000000000000002&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>跨服务器恢复：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># PostgreSQL：恢复远程数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_dump -h remote_host -U postgres -d mydb &lt;span class="p">|&lt;/span> pg_restore -h localhost -U postgres -d mydb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># MySQL：远程到本地&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">mysqldump -h remote_host -u root -p mydb &lt;span class="p">|&lt;/span> mysql -h localhost -u root -p mydb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="74-恢复检查清单">7.4 恢复检查清单
&lt;/h3>&lt;p>执行恢复前务必检查以下项目：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>检查项&lt;/th>
&lt;th>操作&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>备份文件完整性&lt;/strong>&lt;/td>
&lt;td>检查文件大小和校验和&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>磁盘空间&lt;/strong>&lt;/td>
&lt;td>确认目标磁盘有足够空间&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>数据库版本&lt;/strong>&lt;/td>
&lt;td>确保备份和目标版本兼容&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>字符集&lt;/strong>&lt;/td>
&lt;td>确认字符集设置一致&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>连接权限&lt;/strong>&lt;/td>
&lt;td>确认恢复账号有足够权限&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>依赖关系&lt;/strong>&lt;/td>
&lt;td>检查存储过程、触发器依赖&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>外键约束&lt;/strong>&lt;/td>
&lt;td>恢复时关闭外键检查可加速&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="九恢复演练">九、恢复演练
&lt;/h2>&lt;p>恢复演练是备份策略中&lt;strong>最容易被忽视但最重要&lt;/strong>的环节！&lt;/p>
&lt;h3 id="91-演练脚本">9.1 演练脚本
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="c1"># restore_drill.sh - 恢复演练脚本&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">BACKUP_FILE&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;/backup/postgresql/mydb_20260528_020000.dump&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">TEST_DB&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;mydb_drill_test&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PG_HOST&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;localhost&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">PG_USER&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;postgres&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;=== 数据库恢复演练开始 ===&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;时间: &lt;/span>&lt;span class="k">$(&lt;/span>date&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 1. 创建测试数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;1. 创建测试数据库: &lt;/span>&lt;span class="nv">$TEST_DB&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dropdb -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$POSTGRES_USER&lt;/span> &lt;span class="nv">$TEST_DB&lt;/span> 2&amp;gt;/dev/null &lt;span class="o">||&lt;/span> &lt;span class="nb">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">createdb -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> &lt;span class="nv">$TEST_DB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 2. 执行恢复&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;2. 执行恢复...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pg_restore -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> -d &lt;span class="nv">$TEST_DB&lt;/span> &lt;span class="nv">$BACKUP_FILE&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 3. 验证数据&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;3. 验证数据完整性...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nv">TABLE_COUNT&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="k">$(&lt;/span>psql -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> -d &lt;span class="nv">$TEST_DB&lt;/span> -t -c &lt;span class="s2">&amp;#34;SELECT count(*) FROM information_schema.tables WHERE table_schema = &amp;#39;public&amp;#39;;&amp;#34;&lt;/span>&lt;span class="k">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34; 恢复表数量: &lt;/span>&lt;span class="nv">$TABLE_COUNT&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># 4. 清理测试数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;4. 清理测试数据库...&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">dropdb -h &lt;span class="nv">$PG_HOST&lt;/span> -U &lt;span class="nv">$PG_USER&lt;/span> &lt;span class="nv">$TEST_DB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;=== 恢复演练完成 ===&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="92-演练报告模板">9.2 演练报告模板
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">数据库恢复演练报告
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">==================
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">日期：2026-05-28
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">演练人员：张三
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">备份文件：mydb_20260528_020000.dump
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">备份大小：1.2 GB
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">演练结果：
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 恢复耗时：3分28秒
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 表数量：45
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 数据完整性：✓ 通过
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">- 应用连接测试：✓ 通过
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">结论：备份有效，恢复流程正常。
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="十常见问题">十、常见问题
&lt;/h2>&lt;h3 id="q1-备份时数据库是否需要停服">Q1: 备份时数据库是否需要停服？
&lt;/h3>&lt;p>&lt;strong>不需要。&lt;/strong> PostgreSQL 的 &lt;code>pg_dump&lt;/code> 和 MySQL 的 &lt;code>mysqldump --single-transaction&lt;/code> 都支持在线热备份，不会阻塞业务。&lt;/p>
&lt;h3 id="q2-大数据库备份太慢怎么办">Q2: 大数据库备份太慢怎么办？
&lt;/h3>&lt;ul>
&lt;li>PostgreSQL：使用 &lt;code>-j&lt;/code> 参数并行备份/恢复&lt;/li>
&lt;li>MySQL：考虑使用 &lt;code>mydumper&lt;/code> 工具并行导出&lt;/li>
&lt;li>超大数据库建议使用物理备份工具（pg_basebackup、XtraBackup）&lt;/li>
&lt;/ul>
&lt;h3 id="q3-如何备份-docker-中的数据库">Q3: 如何备份 Docker 中的数据库？
&lt;/h3>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># PostgreSQL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> postgres pg_dump -U postgres mydb &amp;gt; backup.sql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># MySQL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker &lt;span class="nb">exec&lt;/span> mysql mysqldump -u root -pPassword mydb &amp;gt; backup.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="总结">总结
&lt;/h2>&lt;ol>
&lt;li>&lt;strong>备份是刚需&lt;/strong>：没有备份的数据库就是在裸奔&lt;/li>
&lt;li>&lt;strong>自动化是关键&lt;/strong>：手动备份一定会被遗忘&lt;/li>
&lt;li>&lt;strong>异地备份是保障&lt;/strong>：服务器挂了，备份还在&lt;/li>
&lt;li>&lt;strong>演练是验证&lt;/strong>：没测试过的备份等于没有备份&lt;/li>
&lt;li>&lt;strong>监控是补充&lt;/strong>：备份失败要及时告警&lt;/li>
&lt;/ol>
&lt;p>记住：&lt;strong>数据无价，备份先行！&lt;/strong>&lt;/p></description></item></channel></rss>