আমার ক্ষেত্রে, আমি এডাব্লুএস রেডশিফ্ট (পোস্টগ্রিসের উপর ভিত্তি করে) ব্যবহার করছি। এবং এটি উপস্থিত হয় ডিবিতে অন্য কোনও সংযোগ নেই, তবে আমি এই একই ত্রুটিটি পাচ্ছি।
ERROR: database "XYZ" is being accessed by other users
আমার ক্ষেত্রে এটি দেখে মনে হচ্ছে ডাটাবেস ক্লাস্টারটি এখনও ডাটাবেসটিতে কিছু প্রক্রিয়াজাতকরণ করছে এবং অন্য কোনও বহিরাগত / ব্যবহারকারীর সংযোগ নেই, তথাপি ডাটাবেসটি অভ্যন্তরীণভাবে ব্যবহারের মধ্যে রয়েছে। আমি নিম্নলিখিতটি চালিয়ে এটি পেয়েছি:
SELECT * FROM stv_sessions;
সুতরাং আমার হ্যাকটি ছিল আমার কোডে একটি লুপ লিখতে, এতে আমার ডাটাবেসের নাম সহ সারি সন্ধান করা। (অবশ্যই লুপটি অসীম নয়, এবং একটি নিদ্রালু লুপ ইত্যাদি)
SELECT * FROM stv_sessions where db_name = 'XYZ';
সারিগুলি পাওয়া গেলে, প্রতিটি পিআইডি, একে একে মুছে ফেলতে এগিয়ে যান।
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;