📍 ধানমন্ডি, ঢাকা-১২০৫🇬🇧 English

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_FAILURES audit policy প্রতিটি ব্যর্থ লগইনের host, OS user ও program লিখে রাখে।
  • PASSWORD_LIFE_TIME UNLIMITED করলে grace period-এ ঢুকে পড়া বা পেরোনো অ্যাকাউন্ট বাঁচে না, আর এটি কমালে অনেক অ্যাকাউন্ট পরের লগইনেই মেয়াদোত্তীর্ণ হতে পারে।
  • Oracle Database 19c রিলিজ 19.12 থেকে PASSWORD_ROLLOVER_TIME একটি নির্দিষ্ট সময় পুরনো ও নতুন দুই পাসওয়ার্ডই গ্রহণ করে, তাই ডাউনটাইম ছাড়াই সার্ভিস অ্যাকাউন্টের পাসওয়ার্ড বদলানো যায়।
গোলাপি রং করা একটি দরজার ধাতব কব্জায় লাগানো পিতলের তালা
ORA-28000 মানে তালা তার কাজ করছে। খোলার আগে খুঁজুন কে বারবার ভুল চাবি ঘোরাচ্ছে। ছবি: Efrem Efre / Pexels

১. 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-28000The account is locked.The account is locked; login denied.ব্যর্থ লগইন FAILED_LOGIN_ATTEMPTS-এ পৌঁছেছে, বা অ্যাডমিনিস্ট্রেটর লক করেছেন
ORA-28001the password has expiredThe account has expired. The password must be changed.মেয়াদ ও grace period শেষ, বা PASSWORD EXPIRE চালানো হয়েছে
ORA-28002the password will expire within string daysstring is not unlimited. The password will expire within string days.সতর্কবার্তা মাত্র: লগইন হয়, grace period চলছে
ORA-01017invalid username/password; logon deniedinvalid credential or not authorized; logon deniedভুল পাসওয়ার্ড; বারবার হলে এটিই ORA-28000-এ নিয়ে যায়
ORA-28032Your password has expired and the database is set to read-onlyYour 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_ATTEMPTS10লক হওয়ার আগে পরপর কতবার ব্যর্থ লগইন
PASSWORD_LOCK_TIME১ দিনওই লক নিজে থেকে খোলার আগে কতক্ষণ থাকে
PASSWORD_LIFE_TIME১৮০ দিনএকটি পাসওয়ার্ড কতদিন চলে
PASSWORD_GRACE_TIME৭ দিনমেয়াদ শেষে সতর্কবার্তার সময় (ORA-28002)
INACTIVE_ACCOUNT_TIMEUNLIMITEDএত দিন লগইন না হলে অ্যাকাউন্ট লক (সর্বনিম্ন ১৫)
PASSWORD_REUSE_TIME, PASSWORD_REUSE_MAXUNLIMITEDপুরনো পাসওয়ার্ড আবার চলবে কি না
PASSWORD_ROLLOVER_TIME0 (বন্ধ)বদলের পর পুরনো পাসওয়ার্ড কতক্ষণ চলে

ডিফল্ট বদলানো যায়, আর সব ডেটাবেজ এগুলো দিয়ে শুরুও হয় না: 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 কীভাবে ঠিক করবেন যাতে আবার না ফেরে?

  1. আগে status পড়ুন। LOCKED(TIMED) মানে ব্যর্থ লগইন; সাধারণ LOCKED মানে হয়তো কেউ ইচ্ছা করে লক করেছেন, তাই খোলার আগে জিজ্ঞেস করুন।
  2. ব্যর্থ লগইনের উৎস খুঁজে বন্ধ করুন (অংশ ৫)।
  3. Unlock করুন। এর জন্য ALTER USER system privilege লাগে।
  4. মেয়াদও শেষ হলে একই স্টেটমেন্টে 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) অ্যাকাউন্ট লক করে না, কেবল একটি সংযোগে এতবার ব্যর্থ হলে সেই সংযোগ কেটে দেয়।

আবছা আলোর ঘরে একটি ল্যাপটপে টাইপ করছে দুটি হাত, পর্দায় কোডের লাইন
কোন মেশিন ভুল পাসওয়ার্ড পাঠিয়েছে, audit trail তা আগেই জানে। Unlock-এর আগে তাকে জিজ্ঞেস করুন। ছবি: cottonbro studio / Pexels

৫. কোন 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 রিস্টার্ট দিলে তা ফিরে আসে।

একটি হাতে কলম, পাশে ডেস্ক ক্যালেন্ডার যেখানে ৩০ তারিখ লাল কালিতে গোল করা
প্রতিটি মেয়াদোত্তীর্ণ পাসওয়ার্ডের একটি তারিখ থাকে। আউটেজ হয় যখন কেউ সেটি লিখে রাখেনি। ছবি: Towfiqu barbhuiya / Pexels

৬. পাসওয়ার্ডের মেয়াদ শেষ হলে 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;
কাঠের টেবিলে সমুদ্রঘোড়া-আকৃতির ক্লিপসহ একটি রিংয়ে দুটি পিতলের চাবি, পাশে একটি রুপালি USB ফ্ল্যাশ ড্রাইভ
Rollover-এর সময় কিছুক্ষণ দুটি চাবিই একই দরজা খোলে। তারপর শুধু নতুনটি। ছবি: COPPERTIST WU / Pexels

৯. 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; এক স্টেটমেন্টে পুরনোটি সঙ্গে সঙ্গে বাতিল করে।

১০. অ্যাপ্লিকেশন অ্যাকাউন্ট ব্যর্থ হলে রানবুক কী?

  1. অ্যাপ্লিকেশন লগে সঠিক ত্রুটি পড়ুন: ORA-28000, ORA-28001, ORA-28002, ORA-01017 বা ORA-28032।
  2. DBA_USERS-এ status, তারিখ, profile ও শেষ পাসওয়ার্ড বদল দেখুন।
  3. লক হলে failed-logon query চালিয়ে ভুল পাসওয়ার্ড পাঠানো client ঠিক বা বন্ধ করুন।
  4. পাসওয়ার্ড বদলালে প্রতিটি জমা কপি হালনাগাদ করুন, তারপর status আবার দেখুন।
  5. পরে অ্যাকাউন্টকে নিজস্ব 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 DBA কনসালট্যান্ট

লেখক পরিচিতি

নাসির উদ্দিন খান একজন Oracle Certified Professional ও CSV-সার্টিফায়েড আইটি কনসালট্যান্ট, ঢাকা, বাংলাদেশ। Oracle ডেটাবেজ প্রশাসন (RAC, Data Guard, RMAN), WebLogic মিডলওয়্যার, ERP সিস্টেম ডিজাইন এবং উৎপাদন, ফার্মাসিউটিক্যাল, ব্যাংকিং ও স্বাস্থ্যসেবা প্রতিষ্ঠানের জন্য AI ইন্টিগ্রেশনে তাঁর ১৮+ বছরের সরাসরি অভিজ্ঞতা।

তথ্যসূত্র ও আরও পড়ুন

Oracle-এর সব উদ্ধৃতি ২ নভেম্বর ২০২৬-এ পড়া। ORDS-এর উদাহরণটি মে ২০২৬-এ একটি প্রোডাকশন সিস্টেমে লেখক নিজে নির্ণয় ও সমাধান করেছেন; নাম গোপন রাখা হয়েছে। প্রোডাকশনে প্রয়োগের আগে limit ও syntax আপনার রিলিজের ডকুমেন্টেশনের সঙ্গে মিলিয়ে নিন।

সম্পর্কিত লেখা

যে অ্যাকাউন্ট অ্যাপ্লিকেশন আটকে দেয় না

Oracle সিকিউরিটি হার্ডেনিং · পাসওয়ার্ড ও profile নীতি · audit trail সেটআপ · হেলথ চেক। ১৮+ বছরের Oracle অভিজ্ঞতা। বাংলাদেশ ও বিশ্বজুড়ে।

💬