ORA-28000 ও ORA-28001: আউটেজ ছাড়াই লক বা মেয়াদোত্তীর্ণ Oracle অ্যাকাউন্ট ঠিক করুন
ORA-28000 মানে Oracle অ্যাকাউন্টটি লক: হয় পরপর অনেকবার ভুল পাসওয়ার্ডে লগইনের চেষ্টা হয়েছে, নয়তো কেউ লক করে দিয়েছেন। ORA-28001 মানে অ্যাকাউন্টের পাসওয়ার্ডের মেয়াদ শেষ। একজন মানুষের ক্ষেত্রে একটি ALTER USER স্টেটমেন্টেই সমাধান; অ্যাপ্লিকেশন অ্যাকাউন্টে আগে খুঁজুন কোন client এখনও ভুল পাসওয়ার্ড পাঠাচ্ছে, নইলে পরের দফা ব্যর্থ লগইনে আবার লক হবে।
দুটি ত্রুটিই ডেটাবেজ পুরোপুরি সুস্থ থাকা অবস্থায় অ্যাপ্লিকেশন থামিয়ে দিতে পারে। Oracle-এর ভেতরে কিছু ভাঙেনি: একটি profile limit ঠিক সেটাই করেছে যা তাকে করতে বলা হয়েছিল।
নিচের প্রতিটি limit, status ও কমান্ড Oracle-এর 19c ডকুমেন্টেশনের সঙ্গে মিলিয়ে দেখা; যেখানে 26ai-তে পার্থক্য আছে, তা উল্লেখ করা হয়েছে।
মূল কথাগুলো
- ORA-28000 মানে অ্যাকাউন্ট লক: পরপর ব্যর্থ লগইন (
FAILED_LOGIN_ATTEMPTS, 19c-এর DEFAULT profile-এ 10) বা কোনো অ্যাডমিনিস্ট্রেটরের হাতে। - ORA-28001 মানে পাসওয়ার্ডের মেয়াদ শেষ:
PASSWORD_LIFE_TIMEও grace period পেরিয়েছে, বা কেউPASSWORD EXPIREচালিয়েছেন। পাসওয়ার্ড বদলানোই এর একমাত্র "unexpire"। DBA_USERS.ACCOUNT_STATUSবলে দেয় কোন সমস্যা। সময়ের কারণে হওয়া বদল, যেমন পাসওয়ার্ডের মেয়াদ ফুরানো বা timed lock-এর সময় পেরোনো, সেখানে দেখা যায় অ্যাকাউন্টটি পরের বার লগইন করলে; অ্যাডমিনিস্ট্রেটরেরACCOUNT LOCK,ACCOUNT UNLOCK,PASSWORD EXPIREবা নতুন পাসওয়ার্ড স্টেটমেন্ট চলার সঙ্গে সঙ্গে কার্যকর হয়।- নতুন তৈরি ডেটাবেজে ডিফল্টভাবে চালু
ORA_LOGON_FAILURESaudit policy প্রতিটি ব্যর্থ লগইনের host, OS user ও program লিখে রাখে। PASSWORD_LIFE_TIMEUNLIMITEDকরলে grace period-এ ঢুকে পড়া বা পেরোনো অ্যাকাউন্ট বাঁচে না, আর এটি কমালে অনেক অ্যাকাউন্ট পরের লগইনেই মেয়াদোত্তীর্ণ হতে পারে।- Oracle Database 19c রিলিজ 19.12 থেকে
PASSWORD_ROLLOVER_TIMEএকটি নির্দিষ্ট সময় পুরনো ও নতুন দুই পাসওয়ার্ডই গ্রহণ করে, তাই ডাউনটাইম ছাড়াই সার্ভিস অ্যাকাউন্টের পাসওয়ার্ড বদলানো যায়।

১. ORA-28000 ও ORA-28001 মানে কী?
ORA-28000 হলো Oracle-এর "account is locked" ত্রুটি: অ্যাডমিনিস্ট্রেটর অ্যাকাউন্ট লক করেছেন, অথবা পরপর অনেকবার ভুল পাসওয়ার্ড দেওয়া হয়েছে, তাই লগইন প্রত্যাখ্যাত। ORA-28001 হলো "password has expired" ত্রুটি: পাসওয়ার্ড তার PASSWORD_LIFE_TIME ও grace period পেরিয়েছে বা অ্যাডমিনিস্ট্রেটর মেয়াদ শেষ করেছেন, আর লগইন এগোনোর আগে পাসওয়ার্ড বদলাতে হবে।
26ai-তে Oracle বার্তাগুলোর ভাষা বদলেছে, তাই লগে কোন লেখা দেখবেন তা রিলিজের ওপর নির্ভর করে। Oracle-এর error reference থেকে দুটি সংস্করণই নিচে দেওয়া হলো।
| ত্রুটি | 19c বার্তা | 26ai বার্তা | কী বোঝায় |
|---|---|---|---|
| ORA-28000 | The account is locked. | The account is locked; login denied. | ব্যর্থ লগইন FAILED_LOGIN_ATTEMPTS-এ পৌঁছেছে, বা অ্যাডমিনিস্ট্রেটর লক করেছেন |
| ORA-28001 | the password has expired | The account has expired. The password must be changed. | মেয়াদ ও grace period শেষ, বা PASSWORD EXPIRE চালানো হয়েছে |
| ORA-28002 | the password will expire within string days | string is not unlimited. The password will expire within string days. | সতর্কবার্তা মাত্র: লগইন হয়, grace period চলছে |
| ORA-01017 | invalid username/password; logon denied | invalid credential or not authorized; logon denied | ভুল পাসওয়ার্ড; বারবার হলে এটিই ORA-28000-এ নিয়ে যায় |
| ORA-28032 | Your password has expired and the database is set to read-only | Your password has expired and the database is set to read-only. | read-only standby-তে মেয়াদোত্তীর্ণ পাসওয়ার্ড; primary-তে বদলান |
ORA-28002 grace period-এর প্রতিটি লগইনে আসে, অথচ Oracle নিজেই বলে কিছু অ্যাপ্লিকেশন লগইনের সময় error ও warning সামলাতে প্রস্তুত না-ও থাকতে পারে। তাই প্রথম চোখে পড়া লক্ষণ হতে পারে grace period শেষে আসা ORA-28001 (DEFAULT profile-এ ৭ দিন)।
ORA-12154 বা ORA-12514 ভিন্ন সমস্যা: এগুলো name-resolution ও listener ত্রুটি, যা আমার listener ও TNS ট্রাবলশুটিং গাইডে আছে।
২. কোন profile limit অ্যাকাউন্ট লক বা মেয়াদোত্তীর্ণ করে?
প্রতিটি ইউজারের একটি profile থাকে, আর আলাদা profile না দেওয়া ইউজার DEFAULT profile-এর অধীনে। পাসওয়ার্ড limit সবসময় চালু: CREATE PROFILE reference অনুযায়ী RESOURCE_LIMIT প্যারামিটার পাসওয়ার্ড resource-এ প্রযোজ্য নয়।
| প্যারামিটার | DEFAULT profile (19c) | কাজ |
|---|---|---|
FAILED_LOGIN_ATTEMPTS | 10 | লক হওয়ার আগে পরপর কতবার ব্যর্থ লগইন |
PASSWORD_LOCK_TIME | ১ দিন | ওই লক নিজে থেকে খোলার আগে কতক্ষণ থাকে |
PASSWORD_LIFE_TIME | ১৮০ দিন | একটি পাসওয়ার্ড কতদিন চলে |
PASSWORD_GRACE_TIME | ৭ দিন | মেয়াদ শেষে সতর্কবার্তার সময় (ORA-28002) |
INACTIVE_ACCOUNT_TIME | UNLIMITED | এত দিন লগইন না হলে অ্যাকাউন্ট লক (সর্বনিম্ন ১৫) |
PASSWORD_REUSE_TIME, PASSWORD_REUSE_MAX | UNLIMITED | পুরনো পাসওয়ার্ড আবার চলবে কি না |
PASSWORD_ROLLOVER_TIME | 0 (বন্ধ) | বদলের পর পুরনো পাসওয়ার্ড কতক্ষণ চলে |
ডিফল্ট বদলানো যায়, আর সব ডেটাবেজ এগুলো দিয়ে শুরুও হয় না: Oracle বলে DBCA দিয়ে বানানো ডেটাবেজে এই সেটিং থাকে, হাতে বানানো ডেটাবেজে থাকে না যদি না secconf.sql চালানো হয়। 26ai-এর Security Guide-এর টেবিলে DEFAULT profile-এর INACTIVE_ACCOUNT_TIME 365 লেখা, অথচ একই পাতার পরের অংশ ও 26ai SQL Language Reference এখনও ডিফল্ট বলে UNLIMITED।
তাই আপনার নিজের ডেটাবেজই চূড়ান্ত উত্তর:
-- DEFAULT profile-এর পাসওয়ার্ড limit (SQL, যেকোনো OS)
SELECT resource_name, limit
FROM dba_profiles
WHERE profile = 'DEFAULT'
AND resource_type = 'PASSWORD'
ORDER BY resource_name;
CDB-তে common user-এর পাসওয়ার্ড সেটিং আসে root-এ তাকে দেওয়া profile থেকে, PDB-তে লগইন করলেও। বিস্তারিত আমার Multitenant CDB ও PDB গাইডে।
৩. অ্যাকাউন্টের অবস্থা কীভাবে পড়বেন?
-- DBA হিসেবে চালান (SQL, যেকোনো OS)
SELECT username, account_status, lock_date, expiry_date,
profile, last_login, password_change_date
FROM dba_users
WHERE username = 'APP_USER';
- EXPIRED(GRACE): মেয়াদ শেষ, তবে ORA-28002 সতর্কবার্তাসহ লগইন চলছে; grace শেষের আগে পাসওয়ার্ড বদলান।
- EXPIRED: মেয়াদ শেষ বা
PASSWORD EXPIREচালানো হয়েছে; পাসওয়ার্ড বদলান। - LOCKED(TIMED): ব্যর্থ লগইনে লক;
PASSWORD_LOCK_TIMEপরে নিজে খোলে। - LOCKED:
ACCOUNT LOCKচালানো হয়েছে, বাPASSWORD_LOCK_TIME UNLIMITEDঅবস্থায় ব্যর্থ লগইন; কেবলACCOUNT UNLOCKখোলে। - OPEN & IN ROLLOVER: gradual rollover চলছে; পুরনো ও নতুন দুই পাসওয়ার্ডই কাজ করে।
সময়ের কারণে হওয়া বদল লগইনের অপেক্ষায় থাকে: পাসওয়ার্ডের মেয়াদ ফুরালে বা timed lock-এর সময় পেরোলে status বদলায় অ্যাকাউন্টটি পরের বার লগইন করলে, কারণ Oracle-এর ভাষায় account status হালনাগাদ করার কোনো background process নেই। তাই timed lock পেরোনোর পরও DBA_USERS পরের লগইন পর্যন্ত লক দেখাতে পারে।
অ্যাডমিনিস্ট্রেটরের নিজের বদল লগইনের অপেক্ষা করে না। ALTER USER ... ACCOUNT LOCK প্রবেশ বন্ধ করে ও ACCOUNT UNLOCK খুলে দেয়, PASSWORD EXPIRE পরের লগইনের আগে পাসওয়ার্ড বদল বাধ্যতামূলক করে, আর IDENTIFIED BY-এর পর থেকে প্রতিটি নতুন সংযোগে নতুন পাসওয়ার্ড লাগে, যদি না gradual rollover চলছে (অংশ ৯)।
AS SYSDBA-এর মতো administrative সংযোগে LAST_LOGIN ভরা হয় না।
৪. ORA-28000 কীভাবে ঠিক করবেন যাতে আবার না ফেরে?
- আগে status পড়ুন। LOCKED(TIMED) মানে ব্যর্থ লগইন; সাধারণ LOCKED মানে হয়তো কেউ ইচ্ছা করে লক করেছেন, তাই খোলার আগে জিজ্ঞেস করুন।
- ব্যর্থ লগইনের উৎস খুঁজে বন্ধ করুন (অংশ ৫)।
- Unlock করুন। এর জন্য
ALTER USERsystem privilege লাগে। - মেয়াদও শেষ হলে একই স্টেটমেন্টে unlock ও নতুন পাসওয়ার্ড দিন।
-- শুধু unlock (SQL, যেকোনো OS)
ALTER USER app_user ACCOUNT UNLOCK;
-- লক এবং মেয়াদোত্তীর্ণ: Oracle Security Guide-এর একই গঠনে এক স্টেটমেন্ট
ALTER USER app_user ACCOUNT UNLOCK IDENTIFIED BY <new_password>;
CDB root-এ লক হওয়া common user সব PDB-তে লক থাকে, আর Oracle বলে তাকে PDB থেকে unlock করা যায় না; root-এ গিয়ে unlock করুন। SEC_MAX_FAILED_LOGIN_ATTEMPTS (ডিফল্ট 3) অ্যাকাউন্ট লক করে না, কেবল একটি সংযোগে এতবার ব্যর্থ হলে সেই সংযোগ কেটে দেয়।

৫. কোন client বারবার অ্যাকাউন্ট লক করছে, কীভাবে খুঁজবেন?
নতুন তৈরি ডেটাবেজে ORA_LOGON_FAILURES unified audit policy ডিফল্টভাবে চালু, কিন্তু Oracle বলে আগের সংস্করণ থেকে upgrade করা ডেটাবেজে এটি চালু থাকে না। তাই আগে দেখুন, না থাকলে চালু করুন:
-- failed-logon policy কি চালু? (SQL, যেকোনো OS)
SELECT policy_name, enabled_option, entity_name, success, failure
FROM audit_unified_enabled_policies
WHERE policy_name = 'ORA_LOGON_FAILURES';
-- কোনো row নেই? Oracle-এর স্টেটমেন্ট (AUDIT SYSTEM বা AUDIT_ADMIN লাগে)
AUDIT POLICY ORA_LOGON_FAILURES WHENEVER NOT SUCCESSFUL;
-- গত এক দিনে APP_USER-এর জন্য কে ভুল পাসওয়ার্ড পাঠিয়েছে?
-- (AUDIT_VIEWER বা AUDIT_MGMT role লাগে)
SELECT userhost, os_username, client_program_name,
COUNT(*) AS failures, MAX(event_timestamp) AS last_seen
FROM unified_audit_trail
WHERE action_name = 'LOGON'
AND return_code = 1017
AND dbusername = 'APP_USER'
AND event_timestamp > SYSDATE - 1
GROUP BY userhost, os_username, client_program_name
ORDER BY failures DESC;
Policy চালু করলে প্রতিটি ব্যর্থ লগইনে একটি audit রেকর্ড যোগ হয়, তাই audit trail পরিষ্কারের রুটিনে এটি রাখুন; DBMS_AUDIT_MGMT আমার Oracle ডেটাবেজ সিকিউরিটি গাইডে আছে। USERHOST হলো যে host থেকে সেশন এসেছে, আর CLIENT_PROGRAM_NAME হলো প্রোগ্রাম।
কোনো row না এলেও প্রশ্নের নিষ্পত্তি হয় না। Query-টি কেবল গত এক দিন দেখে, তাই পুরনো ব্যর্থতা এর বাইরে, আর audit-trail পরিষ্কারের রুটিনে মুছে যাওয়া রেকর্ড আর নেই; policy তখন এই ইউজারকে না-ও ধরে থাকতে পারে, বা client যে container-এ (root বা PDB) লগইন করে আপনি হয়তো অন্যটিতে সংযুক্ত। তাই সময়সীমা বাড়ান, audit retention ও container দেখুন, আর লকের অন্য পথগুলোও দেখুন: অ্যাডমিনিস্ট্রেটরের ACCOUNT LOCK (অংশ ৩) ও INACTIVE_ACCOUNT_TIME (অংশ ২)।
একটি পাসওয়ার্ড অনেক জায়গায় জমা থাকতে পারে: অ্যাপ্লিকেশন সার্ভারের connection pool ও তার wallet, Oracle REST Data Services-এর প্রতিটি pool, অন্য ডেটাবেজের fixed-user database link, অন্য সার্ভারের script, job ও monitoring agent। Active Data Guard standby ডিফল্টভাবে ব্যর্থ লগইন নিজে গোনে; ADG_ACCOUNT_INFO_TRACKING = GLOBAL করলে পুরো Data Guard configuration এক সীমায় গোনে।
মে ২০২৬-এ একটি Oracle REST Data Services সেটআপে ঠিক এটাই পেয়েছিলাম: দুটি connection pool একই ইউজার হিসেবে একটি ডেটাবেজে লগইন করত। একটি reconfiguration সেই ইউজারের পাসওয়ার্ড বদলে একটি pool-এর কপি হালনাগাদ করে, আর অন্য pool পুরনো কপি নিয়ে ORA-01017-এ ব্যর্থ হয় (ORDS দেখায় HTTP status 574); দ্বিতীয় pool-এর পাসওয়ার্ড হালনাগাদ করে ORDS রিস্টার্ট দিলে তা ফিরে আসে।

৬. পাসওয়ার্ডের মেয়াদ শেষ হলে ORA-28001 কীভাবে ঠিক করবেন?
আলাদা কোনো "unexpire" নেই: Oracle-এর Security Guide বলে পাসওয়ার্ড বদলালেই অ্যাকাউন্ট "unexpired" হয়।
-- অ্যাডমিনিস্ট্রেটর নতুন পাসওয়ার্ড দেন (SQL, যেকোনো OS)
ALTER USER app_user IDENTIFIED BY <new_password>;
একই পাসওয়ার্ড আবার দেওয়া যায় কেবল profile-এর reuse নিয়ম অনুমতি দিলে। DEFAULT profile-এ দুই reuse limit-ই UNLIMITED, যার মানে Oracle দুটিই উপেক্ষা করে; যে profile এগুলো সেট করে, সেখানে পুনরাবৃত্তি ORA-28007-এ আটকায়।
মেয়াদোত্তীর্ণ পাসওয়ার্ডে মানুষ লগইন করলে SQL*Plus নতুন পাসওয়ার্ড চায়; অ্যাপ্লিকেশনের connection pool-এর সামনে সেই প্রশ্নের উত্তর দেওয়ার কেউ নেই। আর Oracle জানায়, PASSWORD_LIFE_TIME UNLIMITED করলে কেবল grace period-এ না-ঢোকা অ্যাকাউন্টেই প্রভাব পড়ে; grace শেষ হলে পাসওয়ার্ড বদলাতেই হবে।
read-only Active Data Guard standby-তে মেয়াদোত্তীর্ণ পাসওয়ার্ড ORA-28032 দেয়; Oracle-এর পরামর্শ, primary-তে পাসওয়ার্ড বদলে standby-তে আবার চেষ্টা করুন। Standby নিয়ে বিস্তারিত আমার Oracle 19c Data Guard গাইডে।
৭. PASSWORD_LIFE_TIME কমালে একসঙ্গে অনেক অ্যাকাউন্ট কেন মেয়াদোত্তীর্ণ হয়?
PASSWORD_LIFE_TIME মাপা হয় প্রতিটি অ্যাকাউন্টের শেষ পাসওয়ার্ড বদল (বা তৈরি) থেকে, profile বদলানোর মুহূর্ত থেকে নয়। যেমন ১৮০ থেকে ৯০ দিনে নামালে, যাদের পাসওয়ার্ড ৯০ দিনের বেশি পুরনো, Oracle-এর ভাষায় তারা পরের সংযোগেই মেয়াদোত্তীর্ণ হয়ে grace period-এ ঢোকে।
-- APP_PROF-এ যাদের পাসওয়ার্ড ৯০ দিনের বেশি পুরনো
SELECT username, account_status, password_change_date
FROM dba_users
WHERE profile = 'APP_PROF'
AND password_change_date < SYSDATE - 90
ORDER BY password_change_date;
৮. সার্ভিস অ্যাকাউন্টের পাসওয়ার্ড কি কখনো মেয়াদোত্তীর্ণ হওয়া উচিত?
আমার নিয়ম: অ্যাপ্লিকেশন সার্ভিস অ্যাকাউন্টকে নিজস্ব profile দিন, যাতে তার limit DEFAULT-এর দুর্ঘটনা না হয়ে একটি সিদ্ধান্ত হয়। দীর্ঘ বা সীমাহীন মেয়াদ হঠাৎ মেয়াদোত্তীর্ণ হওয়া এড়ায় কিন্তু এক পাসওয়ার্ড বছরের পর বছর চালু রাখতে পারে; lockout limit অনুমান করে পাসওয়ার্ড ভাঙা থামায় কিন্তু একটি ভুল-কনফিগার করা client-কে অ্যাপ্লিকেশন থামানোর সুযোগ দেয়।
-- আগামী ১৪ দিনে মেয়াদোত্তীর্ণ হবে এমন অ্যাকাউন্ট (১৪ একটি উদাহরণ)
SELECT username, account_status, expiry_date, profile
FROM dba_users
WHERE oracle_maintained = 'N'
AND expiry_date < SYSDATE + 14
ORDER BY expiry_date;

৯. Gradual password rollover কীভাবে ডাউনটাইম এড়ায়?
Oracle Database 19c রিলিজ 19.12-এ যোগ হওয়া এই সুবিধায় একটি অ্যাকাউন্ট নির্দিষ্ট সময় পুরনো ও নতুন দুই পাসওয়ার্ডই গ্রহণ করে, তাই ডাউনটাইম নির্ধারণ ছাড়াই অ্যাপ্লিকেশনের পাসওয়ার্ড বদলানো যায়। এটি সার্ভিস অ্যাকাউন্টের জন্য; administrative ইউজার বাদ।
-- ১. সার্ভিস অ্যাকাউন্টের profile (১ দিন একটি উদাহরণ)
CREATE PROFILE app_svc_prof LIMIT
PASSWORD_ROLLOVER_TIME 1;
-- ১ক. অ্যাকাউন্ট সরানোর আগে: নতুন profile আর DEFAULT পাশাপাশি
-- (APP_SVC_PROF সারিতে LIMIT DEFAULT = DEFAULT সারির মানই খাটবে)
SELECT resource_name, profile, limit
FROM dba_profiles
WHERE profile IN ('DEFAULT', 'APP_SVC_PROF')
AND resource_type = 'PASSWORD'
ORDER BY resource_name, profile;
-- ১খ. মানগুলো ঠিক থাকলে তবেই অ্যাকাউন্ট সরান
ALTER USER app_user PROFILE app_svc_prof;
-- ২. পাসওয়ার্ড বদলালেই rollover শুরু
ALTER USER app_user IDENTIFIED BY <new_password>;
-- ৩. প্রত্যাশিত: OPEN & IN ROLLOVER
SELECT username, account_status FROM dba_users WHERE username = 'APP_USER';
-- ৪. সফল লগইন audit করুন, তারপর পুরনো পাসওয়ার্ডে কে আসছে (Oracle-এর query)
CREATE AUDIT POLICY app_user_logons ACTIONS LOGON;
AUDIT POLICY app_user_logons BY app_user WHENEVER SUCCESSFUL;
SELECT DBUSERNAME, AUTHENTICATION_TYPE, OS_USERNAME, USERHOST, EVENT_TIMESTAMP
FROM UNIFIED_AUDIT_TRAIL
WHERE ACTION_NAME='LOGON' AND EVENT_TIMESTAMP > SYSDATE-1
AND REGEXP_LIKE(AUTHENTICATION_TYPE, '(VERIFIER=.*?-OLD)');
-- ৫. সব client সরেছে: rollover এখনই শেষ, তারপর policy বন্ধ (BY ছাড়া NOAUDIT কাজ করে না)
ALTER USER app_user EXPIRE PASSWORD ROLLOVER PERIOD;
NOAUDIT POLICY app_user_logons BY app_user;
নতুন profile-এ যে limit লেখা নেই, তা আসে আপনার ডেটাবেজের DEFAULT profile-এ তখন যা আছে সেখান থেকে। DEFAULT বদলানো থাকতে পারে, আর হাতে বানানো ডেটাবেজে নথিভুক্ত মান না-ও থাকতে পারে (অংশ ২), তাই ১৮০ দিন ধরে নেবেন না। ধাপ ১ক দুটি profile পাশাপাশি দেখায়; সার্ভিস অ্যাকাউন্টের জন্য কোনো মান ঠিক না থাকলে ধাপ ১খ-এর আগে নতুন profile-এ সঠিক মানটি সেট করুন।
সময়সীমা অন্তত ১ ঘণ্টা, আর সর্বোচ্চ ৬০ দিন বা profile-এর PASSWORD_LIFE_TIME বা PASSWORD_GRACE_TIME, যেটি সবচেয়ে কম; নথিভুক্ত DEFAULT মানে Oracle-এর টেবিল অনুযায়ী তা ৭ দিন, DEFAULT বদলানো থাকলে আপনার মান অনুযায়ী। সময় শেষে পুরনো পাসওয়ার্ড ORA-1017 পায় ও ব্যর্থ লগইন হিসেবে গোনা হয়, তাই ভুলে যাওয়া client তখনও অ্যাকাউন্ট লক করতে পারে।
Rollover চলাকালীন Data Pump কেবল নতুন পাসওয়ার্ডের verifier export করে, আর Data Guard-এ rollover-এর জন্য ADG_ACCOUNT_INFO_TRACKING GLOBAL লাগে। পাসওয়ার্ড চুরির সন্দেহ হলে rollover বাদ দিন: ALTER USER app_user IDENTIFIED BY <new_password> EXPIRE PASSWORD ROLLOVER PERIOD; এক স্টেটমেন্টে পুরনোটি সঙ্গে সঙ্গে বাতিল করে।
১০. অ্যাপ্লিকেশন অ্যাকাউন্ট ব্যর্থ হলে রানবুক কী?
- অ্যাপ্লিকেশন লগে সঠিক ত্রুটি পড়ুন: ORA-28000, ORA-28001, ORA-28002, ORA-01017 বা ORA-28032।
DBA_USERS-এ status, তারিখ, profile ও শেষ পাসওয়ার্ড বদল দেখুন।- লক হলে failed-logon query চালিয়ে ভুল পাসওয়ার্ড পাঠানো client ঠিক বা বন্ধ করুন।
- পাসওয়ার্ড বদলালে প্রতিটি জমা কপি হালনাগাদ করুন, তারপর status আবার দেখুন।
- পরে অ্যাকাউন্টকে নিজস্ব profile দিন আর মেয়াদ ও লকের চেক monitoring-এ যোগ করুন।
অন্য ত্রুটির জন্য আমার Oracle ত্রুটি নির্ণয়ের নিয়মতান্ত্রিক পদ্ধতি একইভাবে কাজ করে। ORA-28000 ও ORA-28001 ডেটাবেজের ব্যর্থতা নয়, profile limit-এর কাজ; কোন client-এর কাছে পাসওয়ার্ডের কপি আছে জানলে সমাধান সত্যিই একটি ALTER USER দূরে।
সাধারণ জিজ্ঞাসা (FAQ)
ORA-28000 দেখানো Oracle অ্যাকাউন্ট কীভাবে unlock করব?
ALTER USER system privilege থাকা ইউজার হিসেবে ALTER USER username ACCOUNT UNLOCK চালান। আগে UNIFIED_AUDIT_TRAIL-এর failed-logon রেকর্ড দেখে ভুল পাসওয়ার্ড পাঠানো উৎস ঠিক করুন, নইলে পরের দফা ব্যর্থ লগইনে আবার লক হবে। LOCKED(TIMED) অ্যাকাউন্ট PASSWORD_LOCK_TIME পেরোলে নিজেও খোলে।
ORA-28001 (the password has expired) কীভাবে ঠিক করব?
ALTER USER username IDENTIFIED BY new_password দিয়ে নতুন পাসওয়ার্ড দিন, তারপর যেসব client পাসওয়ার্ড জমা রাখে সেগুলো হালনাগাদ করুন। Oracle-এ আলাদা unexpire কমান্ড নেই: পাসওয়ার্ড বদলানোই unexpire। grace period শেষ হওয়া অ্যাকাউন্টকে পরে PASSWORD_LIFE_TIME UNLIMITED করে বাঁচানো যায় না।
Oracle 19c-এ ডিফল্ট PASSWORD_LIFE_TIME কত?
Oracle Database 19c-এর DEFAULT profile-এ PASSWORD_LIFE_TIME ১৮০ দিন ও PASSWORD_GRACE_TIME ৭ দিন, সঙ্গে FAILED_LOGIN_ATTEMPTS 10 ও PASSWORD_LOCK_TIME ১ দিন। Oracle বলে হাতে বানানো ডেটাবেজে secconf.sql না চালালে এগুলো থাকে না, তাই আসল মান DBA_PROFILES-এ দেখুন।
অ্যাকাউন্ট EXPIRED(GRACE) দেখাচ্ছে কেন?
এর PASSWORD_LIFE_TIME পেরিয়েছে আর grace period চলছে। লগইন হয় কিন্তু ORA-28002 সতর্কবার্তা আসে, আর grace শেষে পরের লগইন ORA-28001-এ ব্যর্থ হয়; তার আগেই পাসওয়ার্ড বদলান।
ডাউনটাইম ছাড়া কি অ্যাপ্লিকেশনের ডেটাবেজ পাসওয়ার্ড বদলানো যায়?
হ্যাঁ, Oracle Database 19c রিলিজ 19.12 থেকে gradual password rollover দিয়ে। অ্যাকাউন্টকে শূন্য-নয় এমন PASSWORD_ROLLOVER_TIME-সহ profile দিন ও পাসওয়ার্ড বদলান; সময় শেষ হওয়া পর্যন্ত বা ALTER USER username EXPIRE PASSWORD ROLLOVER PERIOD চালানো পর্যন্ত পুরনো ও নতুন দুটিই কাজ করে।
কোন মেশিন Oracle অ্যাকাউন্ট লক করছে, কীভাবে খুঁজব?
ওই ইউজারের জন্য RETURN_CODE 1017-যুক্ত LOGON রেকর্ড UNIFIED_AUDIT_TRAIL-এ খুঁজুন, USERHOST, OS_USERNAME ও CLIENT_PROGRAM_NAME ধরে group করে। এই রেকর্ড লেখে যে ORA_LOGON_FAILURES policy, তা ডিফল্টভাবে চালু কেবল নতুন তৈরি ডেটাবেজে, তাই upgrade করা ডেটাবেজে আগে AUDIT_UNIFIED_ENABLED_POLICIES দেখুন।
PDB-এর ভেতর থেকে কি common user unlock করা যায়?
না। Oracle-এর Security Guide বলে CDB root-এ লক হওয়া common user ওই CDB-র কোনো PDB-তে লগইন করতে পারে না এবং PDB-তে তাকে unlock করা যায় না। root-এ সংযুক্ত হয়ে সেখানে unlock করুন।
🔒 আপনার পাসওয়ার্ডের কপি আর কার কাছে আছে?
সার্ভিস অ্যাকাউন্টের পাসওয়ার্ড অনেক সার্ভারের pool, wallet, link ও script-এ ছড়িয়ে থাকে, আর উন্মুক্ত পাসওয়ার্ড মেয়াদোত্তীর্ণ পাসওয়ার্ডের চেয়েও খারাপ। অন্য কেউ দেখার আগে আপনার ডেটাবেজ স্তর কী উন্মুক্ত করছে জানতে চাইলে আমি ভালোভাবে দেখে দেব।
🔍 ডিজিটাল এক্সপোজার অডিটতথ্যসূত্র ও আরও পড়ুন
- 📄 Oracle Database 19c Security Guide - Using a Password Management Policy (DEFAULT profile, লক, মেয়াদ, password life cycle)
- 📄 Oracle Database 19c Security Guide - Gradual Database Password Rollover
- 📄 Oracle Database 19c Reference - DBA_USERS (প্রতিটি ACCOUNT_STATUS)
- 📄 Oracle Database 19c SQL Language Reference - CREATE PROFILE
- 📄 Oracle Database Error Messages - ORA-28000
Oracle-এর সব উদ্ধৃতি ২ নভেম্বর ২০২৬-এ পড়া। ORDS-এর উদাহরণটি মে ২০২৬-এ একটি প্রোডাকশন সিস্টেমে লেখক নিজে নির্ণয় ও সমাধান করেছেন; নাম গোপন রাখা হয়েছে। প্রোডাকশনে প্রয়োগের আগে limit ও syntax আপনার রিলিজের ডকুমেন্টেশনের সঙ্গে মিলিয়ে নিন।
