【问题标题】:How can I recover my MySQL databases from a Homestead Vagrant VirtualBox?如何从 Homestead Vagrant VirtualBox 中恢复我的 MySQL 数据库?
【发布时间】:2020-06-02 19:53:59
【问题描述】:

我正在运行 Homestead v8.2.0 和 laravel/homestead (virtualbox, 7.1.0) 和 Vagrant 2.2.4。我需要升级,因为我想要 PHP 7.4 支持。

Laravel docs 说有必要先销毁vagrant box,但我知道我不想破坏我原来的box,因为我里面还有有价值的数据。所以我想我会尝试仅仅“更新”它,以防万一。

(我非常小心使用destroy,因为我不想丢失我的任何 MySQL 数据库。)

当我跑vagrant global-status时,我看到了:

id       name          provider   state   directory
------------------------------------------------------------------------------
5620b14  vboxHomestead virtualbox running C:/code/Homestead

所以我使用 git 来检查 Homestead 的 v10.2.0

我跑了vagrant box update。鉴于 Laravel 文档,我对这种方法不起作用并不感到惊讶。

然后我想:我不会更新我当前的盒子,而是在它旁边创建一个新盒子(仍然不会破坏旧盒子)。

所以我将C:/code/Homestead 复制到了一个新目录C:/code/HomesteadB

我升级到 Vagrant 2.2.7。我跑了vagrant box add laravel/homestead,看到了新的laravel/homestead (virtualbox, 9.2.0)(注意更高的版本号)。我运行了vagrant up,并继续享受我运行 PHP 7.4 的新机器。一切似乎都在按计划进行。

后来,当我受到启发回到我的旧机器并恢复那里的所有旧数据时,我注意到 MySQL 数据库丢失了!

但这没有任何意义,因为我从未删除过它们。而且我从未破坏过盒子(我仍然可以在旧的C:/code/Homesteadvagrant ssh 中运行vagrant up)。而且我认为vagrant box update 也不会删除 MySQL 数据库。

它们在哪里,我该如何找回它们?

更新以响应https://stackoverflow.com/a/60411945/470749

myuser@ABCDESK MINGW64 /c/code/Homestead ((v10.2.0))
$ vagrant box list
laravel/homestead (virtualbox, 5.2.0)
laravel/homestead (virtualbox, 6.0.0)
laravel/homestead (virtualbox, 7.1.0)
laravel/homestead (virtualbox, 9.2.0)
redash/dev        (virtualbox, 0.1.0)

$ VBoxManage list vms
"Redash" {29166fde-e0bf-4f31-8efc-58a66afd78e5}
"redash_default_1502117350190_63240" {0b5935af-288a-4e4d-aa8a-ee04f42e3235}
"macOS 10.12 High Sierra" {37b09cb2-10cd-4e1a-8e2c-aefdb1a348c6}
"macOS Sierra" {f010233b-d058-4a6e-9493-5c4d68e99ef1}
"macOS High Sierra 10.13" {741f0d4d-7f16-4f42-993b-4d301ef68125}
"default" {f3e8f33d-0ca3-452d-9ae6-d93e5e412fbb}
"vboxHomestead" {0706d0b0-d31b-4137-9e97-f86b827f1530}
"vboxHomestead2020-01-31" {1ef6f202-9d81-4d41-a4b9-adaab7b12014}

$ ls -lah /c/code/Homestead/.vagrant/machines/
total 0
drwxr-xr-x 1 myuser 197121 0 Aug 27  2017 ./
drwxr-xr-x 1 myuser 197121 0 Apr  8  2019 ../
drwxr-xr-x 1 myuser 197121 0 Apr  4  2017 homestead-7/
drwxr-xr-x 1 myuser 197121 0 Aug 27  2017 vboxHomestead/

$ ls -lah /c/code/HomesteadB/.vagrant/machines/
total 0
drwxr-xr-x 1 myuser 197121 0 Jan 31 09:36 ./
drwxr-xr-x 1 myuser 197121 0 Jan 31 09:25 ../
drwxr-xr-x 1 myuser 197121 0 Jan 31 09:25 homestead-7/
drwxr-xr-x 1 myuser 197121 0 Jan 31 09:25 vboxHomestead/
drwxr-xr-x 1 myuser 197121 0 Jan 31 09:36 vboxHomestead2020-01-31/

$ ls -lah /c/code/Homestead/.vagrant/machines/vboxHomestead/virtualbox/
total 19K
drwxr-xr-x 1 myuser 197121    0 Apr  8  2019 ./
drwxr-xr-x 1 myuser 197121    0 Aug 27  2017 ../
-rw-r--r-- 1 myuser 197121   40 Apr  8  2019 action_provision
-rw-r--r-- 1 myuser 197121   10 Feb 18 12:20 action_set_name
-rw-r--r-- 1 myuser 197121  138 Feb 18 11:44 box_meta
-rw-r--r-- 1 myuser 197121    1 Apr  8  2019 creator_uid
-rw-r--r-- 1 myuser 197121   36 Apr  8  2019 id
-rw-r--r-- 1 myuser 197121   32 Apr  8  2019 index_uuid
-rw-r--r-- 1 myuser 197121 1.7K Apr  8  2019 private_key
-rw-r--r-- 1 myuser 197121  653 Feb 18 12:22 synced_folders
-rw-r--r-- 1 myuser 197121   17 Apr  8  2019 vagrant_cwd

$ ls -lah /c/code/HomesteadB/.vagrant/machines/vboxHomestead/virtualbox/
total 19K
drwxr-xr-x 1 myuser 197121    0 Jan 31 09:25 ./
drwxr-xr-x 1 myuser 197121    0 Jan 31 09:25 ../
-rw-r--r-- 1 myuser 197121   40 Jan 31 09:25 action_provision
-rw-r--r-- 1 myuser 197121   10 Jan 31 09:26 action_set_name
-rw-r--r-- 1 myuser 197121  138 Jan 31 09:25 box_meta
-rw-r--r-- 1 myuser 197121    1 Jan 31 09:25 creator_uid
-rw-r--r-- 1 myuser 197121   36 Jan 31 09:25 id
-rw-r--r-- 1 myuser 197121   32 Jan 31 09:25 index_uuid
-rw-r--r-- 1 myuser 197121 1.7K Jan 31 09:25 private_key
-rw-r--r-- 1 myuser 197121  653 Jan 31 09:25 synced_folders
-rw-r--r-- 1 myuser 197121   18 Jan 31 09:25 vagrant_cwd

$ ls -lah /c/code/HomesteadB/.vagrant/machines/vboxHomestead2020-01-31/virtualbox/
total 19K
drwxr-xr-x 1 myuser 197121    0 Jan 31 09:37 ./
drwxr-xr-x 1 myuser 197121    0 Jan 31 09:36 ../
-rw-r--r-- 1 myuser 197121   40 Jan 31 09:37 action_provision
-rw-r--r-- 1 myuser 197121   10 Feb 24 18:45 action_set_name
-rw-r--r-- 1 myuser 197121  138 Feb  4 11:56 box_meta
-rw-r--r-- 1 myuser 197121    1 Jan 31 09:36 creator_uid
-rw-r--r-- 1 myuser 197121   36 Jan 31 09:36 id
-rw-r--r-- 1 myuser 197121   32 Jan 31 09:36 index_uuid
-rw-r--r-- 1 myuser 197121 1.7K Jan 31 09:37 private_key
-rw-r--r-- 1 myuser 197121  654 Feb 24 18:46 synced_folders
-rw-r--r-- 1 myuser 197121   18 Jan 31 09:36 vagrant_cwd

$ cat /c/code/HomesteadB/.vagrant/machines/vboxHomestead2020-01-31/virtualbox/id
1ef6f202-9d81-4d41-a4b9-adaab7b12014

$ cat /c/code/HomesteadB/.vagrant/machines/vboxHomestead/virtualbox/id
0706d0b0-d31b-4137-9e97-f86b827f1530

$ cat /c/code/Homestead/.vagrant/machines/vboxHomestead/virtualbox/id
0706d0b0-d31b-4137-9e97-f86b827f1530

【问题讨论】:

  • 使用 SequelPro 等 gui 工具检查您的盒子数据库。如果存在,将数据导出到安全的地方,然后升级box并导入db。我不是宅基地用户,但在日常任务中,我使用我们在销毁命令之前添加的 vagrant 框来备份数据库。
  • 你有数据库备份吗?
  • @Tarasovych 不,所以我的问题。
  • 你的数据库在旧盒子里吗?
  • @Tarasovych 不,这就是为什么我发布这个问题以及为什么它说“我注意到 MySQL 数据库丢失了”。

标签: laravel vagrant virtualbox homestead


【解决方案1】:

我认为您将盒子和虚拟机混为一谈 - 我回答了 here 来解释差异,但基本上一旦您创建了 VM(虚拟盒子资源),流浪者就不会使用盒子了。

问题可能是您制作了一个副本,但没有从您的项目文件夹中删除对 VM 的引用,因此 vagrant 确实继续在同一 VM 上运行,但使用了新的框引用。

您需要检查的是,在您的项目副本 (C:/code/HomesteadB) 中,.vagrant/machines/<default>/virtualbox/id - 这是在更新所有数据之前与您的项目相对应的 VirtualBox VM 的 ID。

打开 Virtualbox 并检查该 VM 是否仍然存在 - (您可以检查所有 VM 的 VirtualBox 文件夹)如果它不存在,则您的 VM 已经消失并且您无法取回数据,除非您有一些硬盘备份参考 VM 和 VirtualBox 目录的副本

我仍然不确定它会如何发生,因为在vagrant box update 之后的vagrant up 不应该重建虚拟机。如果是这样,则问题是当您复制项目时,您没有从 .vagrant 目录中删除对 VM 的引用,因此它仍在与现有 VM 交互。如果您在复制项目后确实删除了 vagrant id 引用,那么您将是安全的,并且 vagrant 将无法访问现有的 VM,因为没有链接。

您应该打开 VirtualBox 并检查以下 2 个虚拟机

  • “vboxHomestead”{0706d0b0-d31b-4137-9e97-f86b827f1530}
  • “vboxHomestead2020-01-31”{1ef6f202-9d81-4d41-a4b9-adaab7b12014}

打开它们并检查您是否可以在这些虚拟机中找到您的 MySQL 数据,如果在这些虚拟机中找不到,那么它将丢失。

我有点担心(对你来说)VM 0706d0b0-d31b-4137-9e97-f86b827f1530 是你想要的,但它是从新的 laravel 文件夹中重新创建的

【讨论】:

  • 感谢您的回复。我更新了我的问题以添加更多信息。我想我可能已经运行了一次/c/code/HomesteadB vagrant up,然后才记得编辑我的C:\code\HomesteadB\Homestead.yamlname: vboxHomestead2020-01-31 而不是name: vboxHomestead。它还说mysql8: truelaravel.com/docs/6.x/homestead#installing-optional-features我想知道这是否导致它破坏了我现有的 MySQL 数据库。
  • 感谢您迄今为止的想法。在明天赏金到期之前你有什么新想法吗(现在我已经添加了更多信息)?谢谢。
  • 它不需要重建虚拟机,只需要用新软件重新配置它并运行安装后脚本。 (由制作盒子的人定义)
  • 我没有注意到您对答案的编辑,所以也没有通知我!我刚刚尝试了vim /c/code/HomesteadB/Homestead.yaml 并将name: vboxHomestead2020-01-31 编辑回name: vboxHomestead。然后vagrant up(我也试过vagrant reload --provision)、vagrant sshmysqlshow databases。没有运气。不过谢谢。我在升级过程中不知何故删除了数据库,这真的很神秘和令人沮丧。
【解决方案2】:

您唯一的机会是希望vagrant box update 不会重新安装 mysql。在放弃所有希望之前,我会尝试一些事情:

1) 检查您的虚拟机提供商(VirtualBox??),看看那里列出了多少虚拟机。如果比您预期的要多,请从 VirtualBox 界面启动奇数,看看您的数据是否存在于您认为不应该存在的奇数机器上。老实说,这工作的机会很小,但值得一试。如果您的旧盒子仍然存在于旧状态的某个地方,它应该覆盖您。如果你发现了什么,做mysqldump然后在新的restore 盒子。

2) vagrant ssh 在您的新机器中,cd /var/lib/ 查找与 mysql 相关的文件夹。如果 vagrant update 命令没有完全清除您的 mysql 数据目录,这应该涵盖您。我担心它可能有:(但请检查是否有文件看起来像您的旧表名称或模式名称。如果您找到任何东西,请将 mysql 数据目录更改为指向该文件夹,请参阅https://dba.stackexchange.com/questions/14320/how-can-i-move-a-mysql-database-to-another-drive。做一个 mysqldump 和在新盒子里恢复

3) 使用 VBoxManage list vms 获取 vagrant box id 列表。如果旧的仍然存在,您可以将 vagrant 指向它。检查这篇文章:https://stackoverflow.com/a/37963066/4183810。如果您可以访问您的数据,请对您的数据执行 mysqldump 并将其恢复到新机器上。

这可能会奏效,但不幸的是,如果您找不到您的数据,它要么已经消失,要么无法访问,所以您可能不得不接受自己的命运 :(

【讨论】:

  • 感谢您的回复。我更新了我的问题以添加更多信息。我想我可能已经运行了一次/c/code/HomesteadB vagrant up,然后才记得编辑我的C:\code\HomesteadB\Homestead.yamlname: vboxHomestead2020-01-31 而不是name: vboxHomestead。它还说mysql8: truelaravel.com/docs/6.x/homestead#installing-optional-features 我想知道这是否导致它破坏了我现有的 MySQL 数据库。
  • 感谢您迄今为止的想法。在明天赏金到期之前你有什么新想法吗(现在我已经添加了更多信息)?谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2010-11-07
  • 2014-07-25
  • 2013-05-26
相关资源
最近更新 更多