如何从Homestead Vagrant VirtualBox恢复MySQL数据库?

6
我原先使用的是Homestead v8.2.0和laravel/homestead (virtualbox, 7.1.0),以及Vagrant 2.2.4。由于需要支持PHP 7.4,我需要进行升级。
根据Laravel文档,建议先销毁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文档,我并不惊讶这种方法不起作用。
所以我想:与其更新当前的box,不如创建一个新的盒子(仍然不销毁旧的盒子)。
所以我将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/Homestead中运行vagrant up,然后vagrant ssh)。而且我认为vagrant box update也不会删除MySQL数据库。
它们在哪里,我该如何恢复它们?
回答更新:https://dev59.com/17noa4cB1Zd3GeqPOVTL#60411945
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

@Tarasovych 不是,这就是我提问的原因。 - Ryan
你的数据库在旧盒子里吗? - Tarasovych
当你说你“注意到”你的数据库丢失了,你是通过什么方式发现的?你使用了 mysql CLI 客户端吗? - linuxartisan
@Tarasovych “vagrant box update”会删除数据库吗?你确定吗?为什么会这样做? - Ryan
vagrant box update does not know anything about what's inside your box. So, no, it does not delete databases. Probably the issue does not relate to vagrant box update - Tarasovych
显示剩余7条评论
2个回答

2
我认为你把盒子和虚拟机混淆了 - 我在这里给出了答案来解释它们之间的区别,但基本上一旦你创建了一个虚拟机(Virtual Box 资源),vagrant 就不再使用盒子了。
问题可能是你复制了文件,但没有从项目文件夹中删除对虚拟机的引用,所以 vagrant 继续使用同一个虚拟机,但使用新的盒子引用。
你需要检查的是,在你的项目副本(C:/code/HomesteadB)中的 .vagrant/machines/<default>/virtualbox/id - 这是你的 VirtualBox VM 的 ID,对应于更新前包含所有数据的项目。
打开 VirtualBox 并检查该虚拟机是否仍然存在 - (你可以在所有虚拟机的 VirtualBox 文件夹中检查)。如果不存在,则你的虚拟机已经丢失,除非你有一些硬盘备份,其中包含虚拟机的引用和 VirtualBox 目录的副本,否则无法找回数据。
我仍然不确定它是如何发生的,因为 vagrant upvagrant box update 之后不应该重新构建虚拟机。如果是这样,那么问题就在于当你复制项目时,你没有从 .vagrant 目录中删除虚拟机 ID 引用,所以它仍然与现有虚拟机交互。如果在复制项目后删除了 vagrant id 引用,那么你就是安全的,vagrant 就无法触及现有虚拟机,因为没有链接。
你应该打开 VirtualBox 并检查以下两个虚拟机:
  • "vboxHomestead" {0706d0b0-d31b-4137-9e97-f86b827f1530}
  • "vboxHomestead2020-01-31" {1ef6f202-9d81-4d41-a4b9-adaab7b12014}
打开它们并检查是否可以在这些虚拟机中找到你的 MySQL 数据,如果不在这些虚拟机中,则数据将会丢失。
我有点担心(为你)的是,虚拟机 0706d0b0-d31b-4137-9e97-f86b827f1530 是你想要的虚拟机,但已经从新的 laravel 文件夹重新创建了它。

感谢您的回复。我更新了我的问题以添加更多信息。我想我可能在记得编辑C:\ code \ HomesteadB \ Homestead.yaml之前运行了/ c / code / HomesteadB vagrant up一次,将其更改为name:vboxHomestead2020-01-31而不是name:vboxHomestead。它还说mysql8:true。https://laravel.com/docs/6.x/homestead#installing-optional-features 我想知道这是否导致它清除了我的现有MySQL数据库。 - Ryan
非常感谢你到目前为止的想法。在赏金明天到期之前,你有没有新的想法呢(现在我已经添加了更多信息)?谢谢。 - Ryan
它不需要重新构建虚拟机,只需要使用新软件重新配置并运行后安装脚本(由制作盒子的人定义)。 - liviu blidar
我没有注意到你对你的答案进行了编辑,SO也没有通知我! 我刚刚尝试了 vim /c/code/HomesteadB/Homestead.yaml 并将 name: vboxHomestead2020-01-31 编辑回 name: vboxHomestead。 然后 vagrant up(我还尝试过 vagrant reload --provision),vagrant ssh,和 mysqlshow databases。 没有运气。 谢谢。 真是神秘和令人沮丧,我在升级期间不知道如何删除数据库。 - Ryan

1
你唯一的机会就是希望 "vagrant box update" 不会对 mysql 进行全新、干净的安装。在放弃所有希望之前,我建议你尝试一些方法:
1)检查你的虚拟机提供程序(VirtualBox??),看看有多少虚拟机在那里列出。如果有比你预期的更多,则从 VirtualBox 接口启动这些奇怪的虚拟机,并查看你认为不应该存在的奇怪机器上是否存在你的数据。说实话,这种方法成功的可能性非常低,但还是值得一试的。如果你找到了任何东西,请使用 mysqldump,在新的虚拟机中进行恢复。

2) 在你的新机器中使用vagrant ssh,然后cd /var/lib/查找与mysql相关的文件夹。这样做可以确保在vagrant更新命令未完全清除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://dev59.com/YJjga4cB1Zd3GeqPHTs3#37963066。如果可以访问您的数据,请对数据进行mysqldump并在新盒子上进行还原。

有一些机会可以让它工作,但不幸的是,如果你找不到你的数据,那么它要么已经消失了,要么无法访问,所以你可能需要接受你的命运 :(


感谢您的回复。我更新了我的问题以添加更多信息。我想我可能在记得编辑C:\ code \ HomesteadB \ Homestead.yaml之前运行了/ c / code / HomesteadB vagrant up一次,将其更改为name:vboxHomestead2020-01-31而不是name:vboxHomestead。它还说mysql8:true。https://laravel.com/docs/6.x/homestead#installing-optional-features 我想知道这是否导致它清除了我的现有MySQL数据库。 - Ryan
谢谢你迄今为止的想法。在悬赏过期之前,你有没有任何新的想法(现在我已经添加了更多的信息)?谢谢。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接