我正在尝试为我的 Django 应用程序恢复 postgres 数据转储。数据转储是从 Heroku 中提取的,并且 pg_restore 正在装有 Linux 的 Azure VM 上运行。大约有 40 个表,总大小不超过 2GB。我尝试了两种方法;都失败了。专家能指出这里可能存在什么问题吗?请注意,postgres 数据转储被调用latest.dump
并驻留/home/myuser/
在我的 Linux VM 中。
方法一:
我切换到postgres
via用户sudo su postgres
,然后进入psql
。在那里我运行CREATE DATABASE mydatabase;
。接下来我退出psql
,并从用户 postgres 运行以下命令:pg_restore latest.dump -d mydatabase -U postgres
。该过程已运行,但最终我得到:
警告:恢复时忽略的错误:75
我遇到的所有错误几乎都是‘角色不存在’类型:
pg_restore: [archiver (db)] Error from TOC entry 241; 1259 44416 TABLE links_grouptraffic uauvuro0s8b9v4
pg_restore: [archiver (db)] could not execute query: ERROR: role "uauvuro0s8b9v4" does not exist
Command was: ALTER TABLE public.links_grouptraffic OWNER TO uauvuro0s8b9v4;
请注意,“uauvuro0s8b9v4”是 heroku 上的用户;我还没有在 Azure 上创建这样的用户。当我在 example.cloudapp.net 上运行我的 Django 应用程序时,我看到一个权限被拒绝错误。完整版是这样的:
异常类型:DatabaseError 异常值:
关系 links_link 的权限被拒绝
异常位置:/home/myuser/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/db/backends/postgresql_psycopg2/base.py 执行中,第 54 行
方法 2:
这次,我再次通过CREATE DATABASE mydatabase;
in创建了一个新数据库psql
。然后我从 psql 中退出并运行python manage.py syncdb
(注意,我在方法 1 中没有这样做)。结果创建了一堆表。我选择yes
“是否要创建超级用户”。我提供了必要的详细信息,它就为我创建了。接下来,我快速运行python manage.py migrate djcelery
并python manage.py migrate user_sessions
迁移两个外部包。这样我的表结构就完成了。
然后我继续运行pg_restore latest.dump -d damadam -U postgres
。这次命令以
警告:恢复时忽略错误:333。
如果我去 example.cloudapp.net 测试我的应用程序,我不会收到任何错误,但是也没有恢复任何数据pg_restore
。以下是运行时看到的错误示例:
1)关系已存在:
pg_restore: [archiver (db)] Error from TOC entry 242; 1259 44432 SEQUENCE links_groupinvite_id_seq uauvuro0s8b9v4
pg_restore: [archiver (db)] could not execute query: ERROR: relation "links_groupinvite_id_seq" already exists
Command was: CREATE SEQUENCE links_groupinvite_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
2)违反外键约束:
pg_restore: [archiver (db)] Error from TOC entry 2572; 0 44416 TABLE DATA links_grouptraffic uauvuro0s8b9v4
pg_restore: [archiver (db)] COPY failed for table "links_grouptraffic": ERROR: insert or update on table "links_grouptraffic" violates foreign key constraint "links_grouptraffic_visitor_id_fkey"
3)关系已存在:
pg_restore: [archiver (db)] Error from TOC entry 2273; 1259 16773 INDEX links_link_submitter_id uauvuro0s8b9v4
pg_restore: [archiver (db)] could not execute query: ERROR: relation "links_link_submitter_id" already exists
Command was: CREATE INDEX links_link_submitter_id ON links_link USING btree (submitter_id);
4)关系约束已存在:
pg_restore: [archiver (db)] Error from TOC entry 2372; 2606 16881 FK CONSTRAINT links_userprofile_user_id_fkey uauvuro0s8b9v4
pg_restore: [archiver (db)] could not execute query: ERROR: constraint "links_userprofile_user_id_fkey" for relation "links_userprofile" already exists
Command was: ALTER TABLE ONLY links_userprofile
ADD CONSTRAINT links_userprofile_user_id_fkey FOREIGN KEY (user_id) REFERENCES auth_u...
专家能指出我做错了什么吗?以及正确的做法是什么?
注:如有需要,请询问更多信息
答案1
您应该在恢复数据库之前创建 uauvuro0s8b9v4 用户,否则 pg_restore 将引发此类错误(因为在您的情况下,该用户拥有很多关系)。
在 psql 中尝试:
CREATE USER uauvuro0s8b9v4 WITH PASSWORD '12334444';