如何恢复数据库内容
How can I restore the database contents
我通过以下命令备份数据库:
docker exec -it kiwi_web /Kiwi/manage.py dumpdata --all --indent 2 > database.json
然后,升级 运行 Kiwi TCMS 容器并通过执行以下命令恢复数据库:
cd Kiwi/
git pull
docker-compose down
docker pull kiwitcms/kiwi
docker pull centos/mariadb
docker volume rm kiwi_db_data
docker exec -it kiwi_web /Kiwi/manage.py migrate
docker-compose up -d
到现在为止,一切都很好。当我从所有表中删除数据时
docker exec -it kiwi_web /bin/bash -c '/Kiwi/manage.py sqlflush | /Kiwi/manage.py dbshell'
显示
CommandError: You appear not to have the 'mysql' program installed or on your path.
我不知道如何修复它。
如果我直接恢复数据库命令,它显示
django.db.utils.IntegrityError: Problem installing fixture '-': Could not load contenttypes.ContentType(pk=1): (1062, "Duplicate entry 'admin-logentry' for key 'django_content_type_app_label_model_76bd3d3b_uniq'")
那么,我应该怎么做才能恢复数据库内容?
@Cuijun - 下次请格式化您的问题以提高可读性。
I back up the database by below command:
docker exec -it kiwi_web /Kiwi/manage.py dumpdata --all --indent 2 > database.json
^^^ 这样就好了。
then, upgrade running Kiwi TCMS containers and restore the database by executing the following commands:
- cd Kiwi/
- git pull
- docker-compose down
- docker pull kiwitcms/kiwi
- docker pull centos/mariadb
- docker volume rm kiwi_db_data
- docker exec -it kiwi_web /Kiwi/manage.py migrate
- docker-compose up -d
until now, it's fine.
不,这不好。 每当您升级容器时,您都必须应用任何新的迁移。这在文档和每个发行说明中都有记录:
https://kiwitcms.readthedocs.io/en/latest/installing_docker.html#upgrading
https://kiwitcms.org/blog/kiwi-tcms-team/2020/04/27/kiwi-tcms-83/
你的整个升级过程是错误的,会导致错误和数据丢失!!!
你永远不应该删除你的数据卷,它与应用程序的其余部分分开正是为了能够在重新启动和版本升级中幸存下来。然而,还有更多内容,请参见下文。
说明一下:Kiwi TCMS的一些改动需要修改数据库结构。有时是添加或删除列,但有时是重命名现有列、更改其数据类型或更新实际值。在内部,这是由所谓的迁移控制的——这些文件指示数据库引擎如何应用必要的更改,以便数据库模式成为应用程序所期望的。这就是首先创建数据库表的原因。这就是为什么你有这个 manage.py migrate
命令的原因。
在当前情况下,您可以做的最好的事情是使用旧版本的 Kiwi TCMS 启动容器 - 这与您进行备份时 运行 的版本相同。
然后非常严格地按照说明在每个版本之间升级,并在每一步进行备份。
因为您说您正在使用 centos/mariadb
图像,这意味着您正在使用 MariaDB 5.5。 Kiwi TCMS 8.0 切换到 MariaDB 10.x 因为旧版本无法处理一些可用的迁移。阅读发行说明了解更多信息。
现在因为您一直在使用旧版本(并且您可能已经删除了 docker 图片的旧版本),所以您陷入了困境。恢复中间版本的唯一选择是为从您拥有的版本到现在发布的每个版本从源代码构建它。
我通过以下命令备份数据库:
docker exec -it kiwi_web /Kiwi/manage.py dumpdata --all --indent 2 > database.json
然后,升级 运行 Kiwi TCMS 容器并通过执行以下命令恢复数据库:
cd Kiwi/
git pull
docker-compose down
docker pull kiwitcms/kiwi
docker pull centos/mariadb
docker volume rm kiwi_db_data
docker exec -it kiwi_web /Kiwi/manage.py migrate
docker-compose up -d
到现在为止,一切都很好。当我从所有表中删除数据时
docker exec -it kiwi_web /bin/bash -c '/Kiwi/manage.py sqlflush | /Kiwi/manage.py dbshell'
显示
CommandError: You appear not to have the 'mysql' program installed or on your path.
我不知道如何修复它。 如果我直接恢复数据库命令,它显示
django.db.utils.IntegrityError: Problem installing fixture '-': Could not load contenttypes.ContentType(pk=1): (1062, "Duplicate entry 'admin-logentry' for key 'django_content_type_app_label_model_76bd3d3b_uniq'")
那么,我应该怎么做才能恢复数据库内容?
@Cuijun - 下次请格式化您的问题以提高可读性。
I back up the database by below command:
docker exec -it kiwi_web /Kiwi/manage.py dumpdata --all --indent 2 > database.json
^^^ 这样就好了。
then, upgrade running Kiwi TCMS containers and restore the database by executing the following commands:
- cd Kiwi/
- git pull
- docker-compose down
- docker pull kiwitcms/kiwi
- docker pull centos/mariadb
- docker volume rm kiwi_db_data
- docker exec -it kiwi_web /Kiwi/manage.py migrate
- docker-compose up -d
until now, it's fine.
不,这不好。 每当您升级容器时,您都必须应用任何新的迁移。这在文档和每个发行说明中都有记录:
https://kiwitcms.readthedocs.io/en/latest/installing_docker.html#upgrading
https://kiwitcms.org/blog/kiwi-tcms-team/2020/04/27/kiwi-tcms-83/
你的整个升级过程是错误的,会导致错误和数据丢失!!!
你永远不应该删除你的数据卷,它与应用程序的其余部分分开正是为了能够在重新启动和版本升级中幸存下来。然而,还有更多内容,请参见下文。
说明一下:Kiwi TCMS的一些改动需要修改数据库结构。有时是添加或删除列,但有时是重命名现有列、更改其数据类型或更新实际值。在内部,这是由所谓的迁移控制的——这些文件指示数据库引擎如何应用必要的更改,以便数据库模式成为应用程序所期望的。这就是首先创建数据库表的原因。这就是为什么你有这个 manage.py migrate
命令的原因。
在当前情况下,您可以做的最好的事情是使用旧版本的 Kiwi TCMS 启动容器 - 这与您进行备份时 运行 的版本相同。
然后非常严格地按照说明在每个版本之间升级,并在每一步进行备份。
因为您说您正在使用 centos/mariadb
图像,这意味着您正在使用 MariaDB 5.5。 Kiwi TCMS 8.0 切换到 MariaDB 10.x 因为旧版本无法处理一些可用的迁移。阅读发行说明了解更多信息。
现在因为您一直在使用旧版本(并且您可能已经删除了 docker 图片的旧版本),所以您陷入了困境。恢复中间版本的唯一选择是为从您拥有的版本到现在发布的每个版本从源代码构建它。