PostgreSQL - เปลี่ยนชื่อฐานข้อมูล


127

ฉันต้องการเปลี่ยนชื่อฐานข้อมูล แต่เมื่อฉันทำในฐานข้อมูล PGAdmin : ALTER DATABASE "databaseName" RENAME TO "databaseNameOld"บอกว่าทำไม่ได้

ฉันจะทำมันได้อย่างไร?

( เวอร์ชัน 8.3 บน WindowsXP )

ปรับปรุง

  • ข้อความแสดงข้อผิดพลาดแรก: ไม่สามารถเนื่องจากฉันเชื่อมต่ออยู่ ดังนั้นฉันจึงเลือกฐานข้อมูลอื่นและทำการสืบค้น

  • ฉันได้รับข้อความแสดงข้อผิดพลาดครั้งที่สองแจ้งว่ามีผู้ใช้เชื่อมต่อ ฉันเห็นในPGAdminหน้าจอว่ามันมีมากมายPIDแต่มันไม่ได้ใช้งาน ... ฉันไม่เห็นวิธีการฆ่าพวกมัน


1
คุณสามารถอธิบายได้อย่างละเอียดว่าเหตุใดจึงไม่สามารถทำได้ ฉันเพิ่งทำมัน (บนแพลตฟอร์มอื่น) และมันได้ผล
Vinko Vrsalovic

1
ข้อความแสดงข้อผิดพลาดที่แน่นอนคืออะไรและคุณได้ค้นหาข้อผิดพลาดนี้ในเอกสาร postgres หรือไม่ บางทีอาจมีเหตุผลที่สมบูรณ์แบบสำหรับพฤติกรรมนั้น โดยปกติการเปลี่ยนชื่อควรใช้งานได้
ไม่มีอยู่

อัปเดตดูคำถาม
Patrick Desjardins

ทำไมไม่รีสตาร์ทฐานข้อมูล?
ไม่มีอยู่

ข้อความแสดงข้อผิดพลาดที่แน่นอนคืออะไรและคุณได้ค้นหาข้อผิดพลาดนี้ในเอกสาร postgres หรือไม่ บางทีอาจมีเหตุผลที่สมบูรณ์แบบสำหรับพฤติกรรมนั้น โดยปกติการเปลี่ยนชื่อควรใช้งานได้ หากคุณมีปัญหากับการเชื่อมต่อที่รอดำเนินการหรือตายเพียงแค่รีสตาร์ทฐานข้อมูลเพื่อกำจัดพวกมัน
ไม่มีอยู่

คำตอบ:


190

พยายามอย่าอ้างชื่อฐานข้อมูล:

ALTER DATABASE people RENAME TO customers;

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


18
จำเป็นต้องมีการอ้างอิงเมื่อชื่อมีอักษรตัวใหญ่อยู่
Patrick Desjardins

7
ไม่ได้เป็นเช่นนั้น แต่จำเป็นต้องมีการอ้างถึงเมื่อชื่อมี.หรือ@.
omar

6
นอกจากนี้ยังต้องมีการอ้างอิงเมื่อชื่อมี-
GreenTurtle

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

จำเป็นต้องมีการอ้างอิงเมื่อชื่อมีพื้นที่ว่าง
Loaderon

86

สำหรับการอ้างอิงในอนาคตคุณควรจะสามารถ:

-- disconnect from the database to be renamed
\c postgres

-- force disconnect all other clients from the database to be renamed
SELECT pg_terminate_backend( pid )
FROM pg_stat_activity
WHERE pid <> pg_backend_pid( )
    AND datname = 'name of database';

-- rename the database (it should now have zero clients)
ALTER DATABASE "name of database" RENAME TO "new name of database";

โปรดทราบว่าpg_stat_activityคอลัมน์ของตารางpidถูกตั้งชื่อตามprocpidเวอร์ชันก่อนหน้า 9.2 ดังนั้นหากเวอร์ชัน PostgreSQL ของคุณต่ำกว่า 9.2 ให้ใช้procpidแทนpidไฟล์.


3
มันได้ผลสำหรับฉันขอบคุณ! แต่ชื่อคอลัมน์ใน pg_stat_activity คือ pid และไม่ใช่ procpid ( PostgreSQL 9.3.5 on x86_64-apple-darwin, compiled by i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00), 64-bit)
bodman

7

ฉันเพิ่งเจอสิ่งนี้และด้านล่างคือสิ่งที่ได้ผล:

1) pgAdminเป็นหนึ่งในเซสชัน ใช้psqlแทน
2) หยุดบริการpgBouncerและ / หรือตัวกำหนดตารางเวลาบน Windows เนื่องจากสิ่งเหล่านี้สร้างเซสชัน


3

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

ขอบคุณทั้งหมด


3

แทนที่จะปรับใช้ nuke (รีสตาร์ทเซิร์ฟเวอร์) คุณควรพยายามปิดการเชื่อมต่อเหล่านั้นที่รบกวนคุณโดยการค้นหาว่ามาจากที่ใดและปิดกระบวนการไคลเอ็นต์หรือโดยใช้pg_cancel_backend()ฟังก์ชัน


0

สำหรับใครก็ตามที่พบปัญหานี้โดยใช้ DBeaver และได้รับข้อความแสดงข้อผิดพลาดเช่นนี้:

ERROR: database "my_stubborn_db" is being accessed by other users
  Detail: There is 1 other session using the database.

ยกเลิกการเชื่อมต่อปัจจุบันของคุณและเชื่อมต่อกับเซิร์ฟเวอร์เดิมอีกครั้งด้วยการเชื่อมต่อที่ไม่ได้กำหนดเป้าหมายฐานข้อมูลที่คุณกำลังเปลี่ยนชื่อ

การเปลี่ยนฐานข้อมูลที่ใช้งานไม่เพียงพอ

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