PostgreSQL: วางฐานข้อมูล PostgreSQL ผ่านบรรทัดคำสั่ง [ปิด]


321

ฉันพยายามที่จะวางฐานข้อมูลของฉันและสร้างใหม่ผ่านบรรทัดคำสั่ง

ฉันเข้าสู่ระบบในการใช้psql -U usernameและจากนั้นทำตามด้วย\connect template1DROP DATABASE databasename;

ฉันได้รับข้อผิดพลาด

มีการเข้าถึงฐานข้อมูล databasename โดยผู้ใช้รายอื่น

ฉันปิด Apache และลองอีกครั้ง แต่ฉันยังคงได้รับข้อผิดพลาดนี้ ฉันกำลังทำอะไรผิดหรือเปล่า?


2
จะเกิดอะไรขึ้นหากคุณเพิ่งรันdropdb databasenameคำสั่งจากบรรทัดคำสั่ง
Dylan Markow

1
มันบอกว่า "ข้อผิดพลาด: ไม่สามารถปล่อยฐานข้อมูลที่เปิดอยู่ในปัจจุบัน"
iman453

4
ใช้psql -U <user> -c "drop database protodb"(ไม่มีชื่อฐานข้อมูล)
ผู้ใช้

3
สิ่งนี้จะรีสตาร์ท postgres และยกเลิกการเชื่อมต่อกับทุกคน: sudo service postgresql ทำการรีสตาร์ทจากนั้นทำดังนี้: dropdb -h localhost -p 5432 -U "youruser" "testdb" สังเกตเห็น "" เพื่อให้แน่ใจว่าอักขระพิเศษเข้ากันได้โดยไม่ต้องผูกปม
unom

drop database <dataabase_name>;อย่าลืมเครื่องหมายจุลภาค
Sandip Subedi

คำตอบ:


455

คุณสามารถเรียกใช้คำสั่งdropdbจากบรรทัดคำสั่ง:

dropdb 'database name'

โปรดทราบว่าคุณต้องเป็น superuser หรือเจ้าของฐานข้อมูลจึงจะสามารถวางได้

คุณยังสามารถตรวจสอบมุมมอง pg_stat_activity เพื่อดูประเภทของกิจกรรมที่กำลังเกิดขึ้นกับฐานข้อมูลของคุณรวมถึงกระบวนการว่างทั้งหมด

SELECT * FROM pg_stat_activity WHERE datname='database name';

3
ฉันใช้dropuserคำสั่งเพื่อลบผู้ใช้
pl1nk

6
ไม่ใช่คำตอบที่เป็นประโยชน์สำหรับเวอร์ชัน 9 ข้อผิดพลาดเกี่ยวกับการเชื่อมต่อที่เปิดยังคงปรากฏอยู่
Pavel Vlasov

4
สิ่งนี้จะรีสตาร์ท postgres และยกเลิกการเชื่อมต่อกับทุกคน: sudo service postgresql ทำการรีสตาร์ทจากนั้นทำดังนี้: dropdb -h localhost -p 5432 -U "youruser" "testdb" สังเกตเห็น "" เพื่อให้แน่ใจว่าอักขระพิเศษเข้ากันได้โดยไม่ต้องผูกปม
unom

1
ใช้ผู้ใช้ postgres: sudo -u postgres dropdb 'ชื่อฐานข้อมูล'
leszek.hanusz

\lเพื่อดูฐานข้อมูลทั้งหมดที่คุณมี
Sandip Subedi

115

สิ่งนี้ใช้ได้กับฉัน:

select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';

สำหรับ postgresql ที่เร็วกว่า 9.2 แทนที่pidด้วยprocpid

DROP DATABASE "YourDatabase";

http://blog.gahooa.com/2010/11/03/how-to-force-drop-a-postgresql-database-by-killing-off-connection-processes/


12
ต้องเปลี่ยนให้ใช้งานได้:select pg_terminate_backend(pid) from pg_stat_activity where datname='YourDatabase';
mrt

column "procpid" does not existสำหรับ amazon RDS postgres 9.6 ตัวอย่าง
anon58192932

ฮึ่ม เรียกใช้สิ่งนี้ แต่เพิ่งเชื่อมต่อใหม่ทันทีหลังจากพูดว่า "การเชื่อมต่อ SSL ปิดโดยไม่คาดหมาย [... ] พยายามรีเซ็ต: สำเร็จ" ฉันกลับมาแล้ว
mlissner

67

ลองสิ่งนี้ หมายเหตุไม่มีการระบุฐานข้อมูล - เพียงแค่เรียกใช้ "บนเซิร์ฟเวอร์"

psql -U postgres -c "drop database databasename"

ถ้านั่นไม่ได้ผลฉันได้เห็นปัญหาเกี่ยวกับ postgres ที่เก็บไว้ในคำสั่งที่เตรียมไว้กำพร้า
ในการทำความสะอาดให้ทำดังนี้

SELECT * FROM pg_prepared_xacts;

จากนั้นสำหรับทุก id ที่คุณเห็นให้เรียกใช้สิ่งนี้:

ROLLBACK PREPARED '<id>';

ขออภัยฉันยังใหม่กับฐานข้อมูลดังนั้นนี่อาจเป็นคำถามที่โง่ แต่ฉันจะพิมพ์สิ่งนี้ออกที่ไหน ก่อนที่จะเข้าสู่ระบบฐานข้อมูลใช่มั้ย และฉันควรแทนที่ชื่อฐานข้อมูลด้วยชื่อฐานข้อมูลของฉันใช่ไหม
iman453

@ iman453: คุณเรียกใช้สิ่งนั้นโดยตรงจากเชลล์ / บรรทัดคำสั่งของคุณ
mu สั้นเกินไป

2
ไม่มีสิ่งเช่น "เพียงบนเซิร์ฟเวอร์" สำหรับ postgresql คุณต้องเชื่อมต่อกับฐานข้อมูล ในกรณีนี้คุณจะเชื่อมต่อกับฐานข้อมูล postgres ซึ่งสวยมากสำหรับกรณีเช่นนี้ และเป็นจุดที่ดีในการทำธุรกรรม แต่ในกรณีนี้คุณควรได้รับข้อความแสดงข้อผิดพลาดที่บอกว่าเป็นปัญหา
Scott Marlowe

1
ขออภัยโบฮีเมียน แต่คุณเป็นคนที่ผิด นี่คือ pg_stat_activity ขณะที่เรียกใช้บิวด์จากบรรทัดคำสั่ง: postgres = # select * จาก pg_stat_activity; 11564 | Postgres | 22223 | 16384 | Smarlowe สร้างการทดสอบฐานข้อมูล | f | 2011-08-19 16: 18: 26.918933-06 | 2011-08-19 16: 18: 26.918933-06 | 2011-08-19 16: 18: 26.916578-06 | | -1 โปรดทราบว่าสิ่งนี้เกิดขึ้นขณะที่รันการสร้าง b จากบรรทัดคำสั่งในเทอร์มินัลอื่น ฟิลด์แรกนั้นคือฐานข้อมูลที่สคริปต์ที่สร้างขึ้นของฉันเชื่อมต่อกับ
สกอตต์มาร์โลว์

1
ทำไมนี่ไม่ใช่คำตอบอันดับต้น ๆ # 1
Henley Chiu

16

เมื่อมีข้อความระบุว่าผู้ใช้เชื่อมต่อกันอยู่แบบสอบถามอะไร "select * จาก pg_stat_activity;" พูด? มีผู้ใช้คนอื่นนอกจากคุณเชื่อมต่ออยู่หรือไม่? ถ้าเป็นเช่นนั้นคุณอาจต้องแก้ไขไฟล์ pg_hba.conf ของคุณเพื่อปฏิเสธการเชื่อมต่อจากผู้ใช้รายอื่นหรือปิดแอปใดก็ตามที่เข้าถึงฐานข้อมูล pg เพื่อให้สามารถวางได้ ฉันมีปัญหานี้ในบางครั้งในการผลิต ตั้งค่า pg_hba.conf ให้มีสองบรรทัดดังนี้:

local   all         all                               ident
host    all         all         127.0.0.1/32          reject

และบอกให้ pgsql ทำการรีโหลดหรือรีสตาร์ท (เช่น sudo /etc/init.d/postgresql reload หรือ pg_ctl reload) และตอนนี้วิธีเดียวที่จะเชื่อมต่อกับเครื่องของคุณคือผ่านซ็อกเก็ตในท้องถิ่น ฉันสมมติว่าคุณอยู่ใน linux หากไม่ใช่นี่อาจจำเป็นต้องมีการปรับแต่งสิ่งอื่นที่ไม่ใช่ local / ident ในบรรทัดแรกนั้นไปยังชื่อโฮสต์ ... ชื่อผู้ใช้ของคุณ

ตอนนี้คุณควรจะทำ:

psql postgres
drop database mydatabase;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.