मेरे मामले में, मैं AWS Redshift (Postgres पर आधारित) का उपयोग कर रहा हूं। और ऐसा प्रतीत होता है कि DB के लिए कोई अन्य कनेक्शन नहीं हैं, लेकिन मुझे यह वही त्रुटि मिल रही है।
ERROR: database "XYZ" is being accessed by other users
मेरे मामले में, ऐसा लगता है कि डेटाबेस क्लस्टर अभी भी डेटाबेस पर कुछ प्रसंस्करण कर रहा है, और कोई अन्य बाहरी / उपयोगकर्ता कनेक्शन नहीं है, डेटाबेस अभी भी आंतरिक रूप से उपयोग में है। मैंने इसे निम्न चलाकर पाया:
SELECT * FROM stv_sessions;
इसलिए मेरा हैक मेरे कोड में एक लूप लिखना था, इसमें मेरे डेटाबेस नाम के साथ पंक्तियों की तलाश थी। (बेशक लूप अनंत नहीं है, और एक नींद लूप है, आदि)
SELECT * FROM stv_sessions where db_name = 'XYZ';
यदि पंक्तियाँ मिलीं, तो एक-एक करके प्रत्येक PID को हटाने के लिए आगे बढ़ें।
SELECT pg_terminate_backend(PUT_PID_HERE);
यदि कोई पंक्तियाँ नहीं मिलीं, तो डेटाबेस को छोड़ने के लिए आगे बढ़ें
DROP DATABASE XYZ;
नोट: मेरे मामले में, मैं जावा यूनिट / सिस्टम परीक्षण लिख रहा हूं, जहां इसे स्वीकार्य माना जा सकता है। यह उत्पादन कोड के लिए स्वीकार्य नहीं है।
यहाँ जावा में पूर्ण हैक है, (मेरे परीक्षण / उपयोगिता वर्गों को अनदेखा करें)।
int i = 0;
while (i < 10) {
try {
i++;
logStandardOut("First try to delete session PIDs, before dropping the DB");
String getSessionPIDs = String.format("SELECT stv_sessions.process, stv_sessions.* FROM stv_sessions where db_name = '%s'", dbNameToReset);
ResultSet resultSet = databaseConnection.execQuery(getSessionPIDs);
while (resultSet.next()) {
int sessionPID = resultSet.getInt(1);
logStandardOut("killPID: %s", sessionPID);
String killSessionPID = String.format("select pg_terminate_backend(%s)", sessionPID);
try {
databaseConnection.execQuery(killSessionPID);
} catch (DatabaseException dbEx) {
//This is most commonly when a session PID is transient, where it ended between my query and kill lines
logStandardOut("Ignore it, you did your best: %s, %s", dbEx.getMessage(), dbEx.getCause());
}
}
//Drop the DB now
String dropDbSQL = String.format("DROP DATABASE %s", dbNameToReset);
logStandardOut(dropDbSQL);
databaseConnection.execStatement(dropDbSQL);
break;
} catch (MissingDatabaseException ex) {
//ignore, if the DB was not there (to be dropped)
logStandardOut(ex.getMessage());
break;
} catch (Exception ex) {
logStandardOut("Something went wrong, sleeping for a bit: %s, %s", ex.getMessage(), ex.getCause());
sleepMilliSec(1000);
}
}
GRANT CONNECT ON DATABASE thedb TO public;