前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu 14.04上备份和还原Redis数据

如何在Ubuntu 14.04上备份和还原Redis数据

原创
作者头像
吴凌云
修改2018-09-19 17:21:23
2.2K0
修改2018-09-19 17:21:23
举报

介绍

Redis是一个键值缓存的数据库,它可以持久保存(永久保存)到磁盘存储(即数据库)中。在本文中,您将了解如何在Ubuntu 14.04服务器上备份Redis数据库。

一般情况下,默认将Redis数据保存到磁盘中.rdb文件里,该文件是Redis数据集的时间点快照。快照是按指定的时间间隔生成的,因此非常适合备份。

准备

要完成本教程中的步骤,您需要:

  • 一个Ubuntu 14.04服务器,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 安装Redis。您可以从此Redis设置教程中仅遵循master设置(尽管它与master-slave集群一样可以正常工作)
  • 确保Redis服务器正在运行
  • 如果设置了Redis密码,强烈建议将其设为方便记住和使用的密码。密码位于Redis配置文件 /etc/redis/redis.conf 中。

第一步 - 找到Redis数据目录

Redis将其数据存储在服务器上的目录中,这是我们要备份的内容。首先,我们需要知道它在哪里。

在Ubuntu和其他Linux发行版中,Redis数据库目录是/var/lib/redis。但是,如果您正在管理您继承的服务器并且Redis数据位置已更改,则可以通过输入以下内容来找到它:

代码语言:javascript
复制
sudo locate *rdb

或者,您也可以从redis-cli提示中找到它,请输入:

代码语言:javascript
复制
redis-cli

如果Redis服务器未运行,则响应将为:

代码语言:javascript
复制
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>

在这种情况下,启动Redis并使用以下命令重新连接:

代码语言:javascript
复制
sudo service redis-server start
​
redis-cli

shell提示符现在应该更改为:

代码语言:javascript
复制
127.0.0.1:6379>

连接到Redis时,接下来的两个命令将对其进行身份验证并获取数据目录:

代码语言:javascript
复制
auth insert-redis-password-here
​
config get dir

最后一个命令的输出应该是您的Redis数据目录:

代码语言:javascript
复制
1) "dir"
2) "/var/lib/redis"

记下您的Redis目录。如果它与显示的目录不同,请确保在整个教程中使用此目录。

您现在可以退出数据库命令行界面:

代码语言:javascript
复制
exit

检查这是否是正确的目录:

代码语言:javascript
复制
ls /var/lib/redis

你应该看到一个dump.rdb文件。那是Redis的数据。如果appendonly也启用了,您还将看到一个appendonly.aof或另一个.aof文件,其中包含服务器收到的所有写入操作的日志。

基本上,该.rdb文件是当前快照,该.aof文件保存您的Redis历史记录。两者都值得备份。

我们将从.rdb文件开始,最后以两个文件的自动备份结束。

第二步- 添加样本数据(可选)

在本节中,您可以创建一些样本数据以存储在Redis数据库中。如果您的服务器上已有数据,则只需备份现有内容即可。

登录数据库命令行界面:

代码语言:javascript
复制
redis-cli

认证:

代码语言:javascript
复制
auth insert-redis-password-here

让我们添加一些示例数据。您应该在每个步骤后得到OK的回复。

代码语言:javascript
复制
SET shapes:triangles "3 sides"
​
SET shapes:squares "4 sides"

确认已添加数据。

代码语言:javascript
复制
GET shapes:triangles
​
GET shapes:squares

输出包括在下面:

代码语言:javascript
复制
"3 sides"
​
"4 sides"

要将这些更改提交到/var/lib/redis/dump.rdb文件,请保存:

代码语言:javascript
复制
save

你可以退出:

代码语言:javascript
复制
exit

如果您愿意,可以立即检查转储文件的内容。它应该包含您的数据,即使是以一种机器可读的形式。

代码语言:javascript
复制
sudo cat /var/lib/redis/dump.rdb

文件内容:

代码语言:javascript
复制
REDIS0006?shapes:squares4 sidesshapes:triangles3 sides??o????C

第三步 - 备份Redis数据

现在您已知道Redis数据的位置,就可以进行备份了。来自Redis官方网站的介绍如下:

Redis非常适合数据备份,因为您可以在数据库运行时复制RDB文件:RDB一旦生成就永远不会被修改,并且在生成时它使用临时名称并仅使用rename(2)以原子方式重命名为其最终目标新快照完成时。

因此,您可以在Redis服务器运行时备份或复制数据库文件。假设您将其备份到主文件夹下的目录,执行该备份就像输入以下内容一样简单:

代码语言:javascript
复制
sudo cp /var/lib/redis/dump.rdb /home/sammy/redis-backup-001

Redis会定期在此处保存内容,这意味着如果您运行上述命令,则无法保证最新的备份。您需要先保存数据。

但是,如果可以接受少量数据丢失,只需备份这一个文件即可。

保存数据库状态

要获得更新的Redis数据副本,更好的途径是访问redis-cli(Redis命令行)。

按步骤一的说明进行身份验证。

然后,发出save命令:

代码语言:javascript
复制
save

输出应该类似于:

代码语言:javascript
复制
OK
(1.08s)

退出数据库。

现在您可以按照上面给出的命令运行cp,确保您的备份是最新的。

虽然该cp命令将提供数据库的一次性备份,但最佳解决方案是设置一个cron作业,该作业将自动执行该过程,并使用可执行的增量更新工具,并在需要时还原数据。

第四步 - 使用rdiff-backup和Cron配置自动更新

在本节中,我们将配置一个自动备份,用于备份整个Redis数据目录,包括两个数据文件。

有几种自动备份工具可用。在本教程中,我们将使用一个更新的,用户友好的工具rdiff-backup

rdiff-backup是命令行备份工具。您可能没有在服务器上安装rdiff-backup,因此您首先必须安装它:

代码语言:javascript
复制
sudo apt-get install -y rdiff-backup

现在它已经安装,您可以通过将Redis数据备份到主目录中的文件夹来测试它。在此示例中,我们假设您的主目录是:/home/sammy

请注意,如果脚本不存在,脚本将自动创建目标目录,即您不必自己创建它。

使用--preserve-numeric-ids,源文件夹和目标文件夹的所有权将相同。

代码语言:javascript
复制
sudo rdiff-backup --preserve-numerical-ids /var/lib/redis /home/sammy/redis

与之前的cp命令一样,这是一次性备份。改变的是我们现在正在备份整个/var/lib/redis目录并使用rdiff-backup

现在我们将使用cron自动执行备份,以便在设定的时间进行备份。要完成此操作,请打开系统crontab:

代码语言:javascript
复制
sudo crontab -e

(如果您之前未在此服务器上使用过crontab,请在提示符下选择您喜欢的文本编辑器。)

在filek的底部附加如下所示的条目。

代码语言:javascript
复制
0 0 * * * rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis

此Cron条目将在每天午夜执行Redis备份。该--no文件统计切换将禁止写入到rdiff-backup-data 目录中的file_statistics文件里,这将使得rdiff-backup运行速度更快,而且占用更少的磁盘空间。

或者,您可以使用此条目进行每日备份:

代码语言:javascript
复制
@daily rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis

目前,备份将每天进行一次,因此您明天可以回来进行最终测试。或者,您可以暂时提高备份频率以确保其正常工作。

由于这些文件归redis系统用户所有,因此您可以使用此命令验证它们是否就位(确保备份实际触发):

代码语言:javascript
复制
ls -l /home/sammy/redis

您的输出应该类似于:

代码语言:javascript
复制
total 20
-rw-rw---- 1 redis redis    70 Sep 14 13:13 dump.rdb
drwx------ 3 root  root  12288 Sep 14 13:49 rdiff-backup-data
-rw-r----- 1 redis redis   119 Sep 14 13:09 redis-staging-ao.aof

您现在可以每天备份Redis数据,这些数据存储在同一服务器上的主目录中。

第五步 - 从备份还原Redis数据库

现在您已经了解了如何备份Redis数据库,此步骤将向您展示如何从备份文件dump.rdb还原数据库。

还原备份需要您使用还原文件替换活动的Redis数据库文件。由于这可能具有破坏性,我们建议尽可能恢复到新的Redis服务器。

您不希望用更有问题的恢复覆盖您的实时数据库。但是,重命名不是删除当前文件会降低风险,即使还原到同一服务器也是如此,这是本教程的策略。

检查恢复文件内容

首先,检查dump.rdb文件的内容。确保它具有您想要的数据。

您可以直接检查转储文件的内容,但请记住它使用的是Redis可读格式而不是用户可读格式:

代码语言:javascript
复制
sudo cat /home/gilly/redis/dump.rdb

这是一个小型数据库;,你的输出应该看起来像这样:

代码语言:javascript
复制
REDIS0006?shapes:triangles3 sidesshapes:squares4 sides??!^?\?,?

如果您最近的备份没有数据,则不应继续进行还原。如果有数据在即可继续。

可选:模拟数据丢失

让我们模拟数据丢失,这是备份恢复的原因。

登录Redis:

代码语言:javascript
复制
redis-cli

在这个命令序列中,我们将使用Redis进行授权并删除shapes:triangles条目:

代码语言:javascript
复制
auth insert-redis-password-here

DEL shapes:triangles

现在让我们确保删除条目:

代码语言:javascript
复制
GET shapes:triangles

输出应该是:

代码语言:javascript
复制
(nil)

保存并退出:

代码语言:javascript
复制
save

exit

可选:设置新的Redis服务器

现在,如果您计划还原到新的Redis服务器,请确保新的Redis服务器已启动并正在运行。

出于本教程的目的,我们将仅遵循此Redis群集教程的安装Redis这一步,但如果您想要更复杂的设置,则可以按照整篇文章进行操作。

通过运行redis-benchmark -q -n 1000 -c 10 -P 5验证Redis在新服务器上运行后,您可以继续。

停止Redis

在我们可以在替换Redis转储文件之前,需要停止当前运行的Redis实例。停止Redis后,您的数据库将处于脱机状态。

代码语言:javascript
复制
sudo service redis-server stop

输出应该是:

代码语言:javascript
复制
Stopping redis-server: redis-server

检查它是否实际停止了:

代码语言:javascript
复制
sudo service redis-server status

输出如下:

代码语言:javascript
复制
redis-server is not running

接下来,我们将重命名当前数据库文件。

重命名当前dump.rdb

Redis从dump.rdb文件中读取其内容。我们重命名当前的一个,为我们的恢复文件让路。

代码语言:javascript
复制
sudo mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.old

请注意,如果您确定当前版本优于备份文件,则可以还原dump.rdb.old

如果启用了AOF,请将其关闭

AOF跟踪Redis数据库的每个写操作。但是,由于我们尝试从时间点备份进行恢复,因此我们不希望Redis重新创建存储在其AOF文件中的操作。

您还可以列出目录/var/lib/redis/的内容。如果您在那里看到文件.aof,则表明您已启用AOF。

让我们重命名该.aof文件,暂时将其排除在外。这将重命名以.aof结尾的每个文件,因此如果您有多个AOF文件,则应单独重命名文件,而不是运行此命令:

代码语言:javascript
复制
sudo mv /var/lib/redis/*.aof /var/lib/redis/appendonly.aof.old

编辑Redis配置文件以暂时关闭AOF:

代码语言:javascript
复制
sudo nano /etc/redis/redis.conf

在该AOF部分中,查找appendonly指令并将yes更改为no。这会禁用它:

代码语言:javascript
复制
appendonly no

恢复dump.rdb文件

现在我们将使用我们的恢复文件,如果您按照本教程中的前面步骤操作,则应保存该文件/home/sammy/redis/dump.rdb

如果要还原到新服务器,现在是时候将文件从备份服务器上载到新服务器了:

代码语言:javascript
复制
scp /home/sammy/redis/dump.rdb sammy@your_new_redis_server_ip:/home/sammy/dump.rdb

现在,在还原服务器(可以是原始Redis服务器或新服务器)上,您可以使用cp将文件复制到该/var/lib/redis文件夹:

代码语言:javascript
复制
sudo cp -p /home/sammy/redis/dump.rdb /var/lib/redis

(如果您将文件上载到 /home/sammy/dump.rdb, 请使用命令/home/sammy/dump.rdb``sudo cp -p /home/sammy/dump.rdb /var/lib/redis来复制文件。)

或者,如果要使用rdiff-backup,请运行下面显示的命令。请注意,这仅适用于从最初设置的文件夹rdiff-backup进行还原的情况。使用rdiff-backup时,您必须在目标文件夹中指定文件的名称:

代码语言:javascript
复制
sudo rdiff-backup -r now /home/sammy/redis/dump.rdb /var/lib/redis/dump.rdb

有关该-r选项的详细信息可在本文末尾给出的项目网站上找到。

设置dump.rdb文件的权限

如果要还原到进行备份的同一服务器,则可能已具有正确的权限。

如果将备份文件复制到新服务器,则可能必须更新文件权限。

让我们查看/var/lib/redis/目录中dump.rdb文件的权限。

代码语言:javascript
复制
ls -la /var/lib/redis/

如果你看到这样的话:

代码语言:javascript
复制
-rw-r-----  1 sammy sammy   70 Feb 25 15:38 dump.rdb
-rw-rw----  1 redis redis 4137 Feb 25 15:36 dump.rdb.old

您需要更新权限,以使该文件归redis用户和组所有:

代码语言:javascript
复制
sudo chown redis:redis /var/lib/redis/dump.rdb

更新文件也可以由组写入:

代码语言:javascript
复制
sudo chmod 660 /var/lib/redis/dump.rdb

现在再次列出/var/lib/redis/目录的内容:

代码语言:javascript
复制
ls -la /var/lib/redis/

现在,您还原的dump.rdb文件具有正确的权限:

代码语言:javascript
复制
-rw-rw----  1 redis redis   70 Feb 25 15:38 dump.rdb
-rw-rw----  1 redis redis 4137 Feb 25 15:36 dump.rdb.old

如果您的Redis服务器守护程序在恢复文件之前运行,现在将无法启动 - 它将显示一条消息,例如Could not connect to Redis at 127.0.0.1:6379: Connection refused- 检查Redis的日志。

如果您在日志中看到一行Fatal error loading the DB: Permission denied. Exiting.,那么您需要检查dump.rdb文件的权限,如此步骤中所述。

启动Redis

现在我们需要再次启动Redis服务器。

代码语言:javascript
复制
sudo service redis-server start

检查数据库内容

让我们看看修复是否有效。

登录Redis:

代码语言:javascript
复制
redis-cli

检查shapes:triangles条目:

代码语言:javascript
复制
GET shapes:triangles

输出应该是:

代码语言:javascript
复制
"3 sides"

这样的结果表示我们的修复工作生效了。

代码语言:javascript
复制
exit

如果你没有使用AOF,你就完成了!您恢复的Redis实例应该恢复正常。

(可选)启用AOF

如果要恢复或开始使用AOF跟踪对数据库的所有写入,请按照这些说明进行操作。必须从Redis命令行重新创建AOF文件。

登录Redis:

代码语言:javascript
复制
redis-cli

打开AOF:

代码语言:javascript
复制
BGREWRITEAOF

你应该得到输出:

代码语言:javascript
复制
Background append only file rewriting started

运行info命令。这将产生很多输出内容:

代码语言:javascript
复制
info

滚动到Persistence部分,检查aof条目是否与此处显示的相匹配。如果aof_rewrite_in_progress0,则AOF文件的重新创建已完成。

代码语言:javascript
复制
# Persistence

. . .

aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:0
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

如果确认已完成AOF文件的重新创建,您现在可以退出Redis命令行:

代码语言:javascript
复制
exit

您可以再次列出文件/var/lib/redis

代码语言:javascript
复制
ls /var/lib/redis

您应该再次看到实时文件.aof,例如appendonly.aofredis-staging-ao.aof,以及dump.rdb文件和其他备份文件。

确认后,停止Redis服务器:

代码语言:javascript
复制
sudo service redis-server stop

现在,在redis.conf文件中再次打开AOF :

代码语言:javascript
复制
sudo nano /etc/redis/redis.conf

然后将appendonly值更改为yes:重新启用AOF :

代码语言:javascript
复制
appendonly yes

启动Redis:

代码语言:javascript
复制
sudo service redis-server start

如果您想再次验证数据库的内容,只需再次运行“ 检查数据库内容”部分。

就是这样,Redis实例应该恢复正常。

结论

当您不介意将数据备份到同一服务器上的目录时,以本文中给出的方式备份Redis数据非常有用。

当然,最安全的方法是备份到不同的机器。您可以用/var/lib/redis目录下的同一个文件使用多种备份方法。

想要了解更多关于备份和还原的开源信息教程,请前往腾讯云+社区学习更多知识。

参考文献:《How To Back Up and Restore Your Redis Data on Ubuntu 14.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第一步 - 找到Redis数据目录
  • 第二步- 添加样本数据(可选)
  • 第三步 - 备份Redis数据
  • 第四步 - 使用rdiff-backup和Cron配置自动更新
  • 第五步 - 从备份还原Redis数据库
    • 检查恢复文件内容
      • 可选:模拟数据丢失
        • 可选:设置新的Redis服务器
          • 停止Redis
            • 重命名当前dump.rdb
              • 如果启用了AOF,请将其关闭
                • 恢复dump.rdb文件
                  • 设置dump.rdb文件的权限
                    • 启动Redis
                      • 检查数据库内容
                        • (可选)启用AOF
                        • 结论
                        相关产品与服务
                        云数据库 Redis
                        腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档