Çoğu durumda, uygulamayla ilgili bir sorun olduğu sürece, ne zaman ve nerede olursa olsun, DBA her zaman ilk aramayı alan kişidir.Ağır durumlarda, bir telefon bombardımanı olacaktır.
Bu tür sorunlarla karşılaştığınızda ilk şey zihniyettir, paniğe kapılmamalısınız, sakin, cesur ve dikkatli olmalısınız ve çok önemli olan bir diğer şey ise teşhis fikirleri ve yardımcı senaryolardır.Bugün, ağırlıklı olarak problemlerle karşılaşıldığında genel ele alma fikirlerini tanıtacağım ve kullanımı paylaşacağım. Bazı komut dosyaları sorunları hızla bulmanıza ve çözmenize yardımcı olarak iş kesintilerini azaltır.
Veritabanı sunucusuna giriş yaptıktan sonra, ilki CPU, bellek ve G / Ç'nin sistem komutları aracılığıyla anormal olup olmadığını doğrulamaktır.Her sistemin komutları farklıdır.Ortak olanlar top, topas, vmstat ve iostat'tır.
Etkin bekleme olaylarını görüntüleyin. Bu, veritabanını izlemek, devriye gezmek ve tanılamak için en temel yöntemdir. Genellikle sorunların% 81'i olay bekleyerek neden olarak önceden belirlenebilir. Bu, veritabanı işleminin en doğrudan tezahürüdür. Aşağıdaki komut dosyası, her birini görüntülemektir. Bekleyen olayların sayısı, bekleme süresi ve bazı yaygın BOŞTA bekleme olayları hariç
a45 için col olayı SELECT inst_id, EVENT, SUM (DECODE (WAIT_TIME, 0, 0, 1)) "Prev", SUM (DECODE (WAIT_TIME, 0, 1, 0)) "Curr", COUNT (*) "Tot", sum (SECONDS_IN_WAIT ) SECONDS_IN_WAIT GV $ SESSION_WAIT'DEN NEREDE olay DEĞİL IN ('smon timer', 'pmon timer', 'rdbms ipc message', 'SQL * İstemciden gelen net mesaj', 'gcs remote message') VE olay '% boşta%' GİBİ DEĞİL VE olay '% Idle%' GİBİ DEĞİL VE olay "% Akım AQ%" GİBİ DEĞİL GROUP BY inst_id, EVENT 1,5 azalan SİPARİŞ;Burada, bazı yaygın anormal bekleme olaylarının nedenlerini kavramamız ve kitaplık önbellek kilidi, diğer oturum tarafından okuma, satır önbellek kilidi, arabellek meşgul beklemeleri, mandal: paylaşılan havuz, gc arabelleği meşgul, imleç: X üzerindeki S pimi gibi koşullu yansımalar oluşturmamız gerekir. , Doğrudan yol okuma, günlük dosyası senkronizasyonu, enq: TX-indeks çekişmesi, PX Deq Kredisi: blkd gönder, mandalsız, enq: TX-satır kilidi çekişmesi vb. Anormal bekleme olaylarının sayısı ve bekleme süresi çok uzunsa, o zaman Sorun giderme için giriş noktası buradadır.
Anormal bekleme olayını aldıktan sonra, bekleme olayına göre oturum detaylarını kontrol ederiz, yani hangi SQL'in beklediğini hangi oturumların yürütüldüğünü kontrol eder, ayrıca kullanıcı adı ve makine adı ile engellenip engellenmediğini öğreniriz. Ek olarak, aşağıdaki komut dosyası, oturumu kullanıcıya göre kontrol etmek, oturumu SQL_ID'ye göre kontrol etmek vb. İçin yeniden yazılabilir.
SELECT / * + kural * / sid, s.serial #, spid, event, sql_id, seconds_in_wait ws, row_wait_obj # obj, s.username, s.machine, BLOCKING_INSTANCE || '.' || blocking_session b_sess FROM v $ oturum s, v $ işlem p NEREDE olay = 'olay_adı' VE s.paddr = p.addr siparişi 6;Oturum listesini aldıktan sonra, son çalıştırılan SQL_ID, oturum açma zamanı vb. Gibi aşağıdaki SQL'e dayalı olarak bir oturumun ayrıntılı bilgilerini sorgulayabilirsiniz. SQL ayrıca birden çok olarak yeniden yazılabilir.
SELECT s.sid, s.serial #, spid, event, sql_id, PREV_SQL_ID, seconds_in_wait ws, row_wait_obj # obj, s.username, s.machine, module, blocking_session b_sess, logon_time FROM v $ oturum s, v $ işlem p NEREDE sid = 'sid' VE s.paddr = p.addr;Önceki iki SQL'den, oturumun beklediği nesne kimliğini görebilir ve aşağıdaki SQL üzerinden nesnenin ayrıntılı bilgilerini sorgulayabilirsiniz.
a30 için col OBJECT_NAME dba_objects'ten sahip, nesne_adı, alt nesne_adı, nesne_türü seçin nerede object_id =SQL ifadelerini SQL_ID ve HASH_VALUE'ye göre sorgulayın. Eğer v $ sqlarea içinde bulamazsanız, onu DBA_HIST_SQLTEXT görünümünde sorgulamayı deneyebilirsiniz.
v $ sqlarea'dan sql_id, SQL_fullTEXT'i seçin burada (sql_id = 'sqlid' veya hash_value = to_number ('hashvale')) ve rownum < 2Aşağıdaki SQL aracılığıyla bir oturum tarafından kaç oturumun engellendiğini sorgulayın.
v $ oturumundan sayım (*), blocking_session'ı seçin blocking_session'ın boş olmadığı yerde blocking_session'a göre gruplandırın;TM, TX'in kilitlediği bir oturumun kilitlerini ve oturum ve kilit sorgularıyla ilişkili SQL'i sorgulamak için aşağıdaki SQL'i kullanın. Burada belirtilen c zamanının 100 saniyeden fazla olduğunu unutmayın. Vakaların% 30'unda, kilit tablosu insanlar tarafından manipüle edilerek uygulama SQL'sinin Engellendi, çalıştırılamaz.
-Bir oturumun kilidini sorgulayın / * + kuralı seç * / SESSION_ID, OBJECT_ID, ORACLE_USERNAME, OS_USER_NAME, PROCESS, LOCKED_MODE gv $ locked_object'ten session_id = --Query TM, TX kilidi v $ lock'tan / * + kuralı * / * seçin nerede ctime > 100 ve ('TX', 'TM') sırasıyla 3,9; Veritabanındaki kilidi sorgulayın /*+rule*/s.sid,p.spid,l.type,round(max(l.ctime)/60,0) lock_min, s.sql_id, s.USERNAME, b.owner, b.object_type seçin, b.object_name v $ oturum s, v $ işlem p, v $ kilit l, v $ kilitli_nesne o, dba_objects b burada o.SESSION_ID = s.sid ve s.sid = l.sid ve o.OBJECT_ID = b.OBJECT_ID ve s.paddr = p.addr ve l.ctime > 100 ve l. Türü ('TX', 'TM', 'FB') grup s.sid, p.spid, l.type, s.sql_id, s.USERNAME, b.owner, b.object_type, b.object_name 9,1,3'e göre siparişNormalde, sorun ilk belirlendikten sonra işi hızlı bir şekilde eski haline getirmek için, bazı oturumları, özellikle de toplu öldürme oturumlarını öldürmek ve bazen LOKAL = HAYIR ile tüm süreçleri doğrudan öldürmek gerekir. Oturumu tekrar sonlandırırken, kontrol edip onayladığınızdan emin olun. Diğer düğümlerde veya diğer sunucularda çalıştırılamaz.
199 satırı ayarla col olay biçimi a35 -Bir SID oturumunu sonlandır SELECT / * + kural * / sid, seri #, 'öldür -9' || spid, event, blocking_session b_sess FROM v $ oturum s, v $ işlem p NEREDE sid = 'sid' VE s.paddr = p.addr 1'e göre sıralama; -SQL_ID'ye göre oturumu sonlandırın SELECT / * + kural * / sid, seri #, 'öldür -9' || spid, event, blocking_session b_sess FROM v $ oturum s, v $ işlem p NEREDE sql_id = 'sql_id' VE s.paddr = p.addr 1'e göre sırayla; -Bekleyen olaylara göre oturumu sonlandırın SELECT / * + kural * / sid, seri #, 'öldür -9' || spid, event, blocking_session b_sess FROM v $ oturum s, v $ işlem p NEREDE olay = 'olay' VE s.paddr = p.addr 1 sırayla; -Kullanıcılara göre öldürme seansları SELECT / * + kural * / sid, seri #, 'öldür -9' || spid, event, blocking_session b_sess V $ oturum s, v $ işlem p NEREDE kullanıcı adı = 'kullanıcı adı' VE s.paddr = p.addr 1'e göre sırala; --kill all LOCAL = NO proses ps -ef | grep YEREL = HAYIR | grep $ ORACLE_SID | grep -v grep | awk '{print $ 2}' | xargs öldür -9Statik parametreleri, belleği ve diğer sorunları değiştirmeniz gerekirse, veritabanını yeniden başlatmanız gerekir.Şu anda sorunun nedenini parçalamayın ve araştırma konusu olarak kullanın.İlk görevimiz işi geri yüklemek.
tail -f alert_.log sistem kontrol noktasını değiştirmek; sistem anahtarı günlük dosyasını değiştir; derhal kapanma; başlamakYukarıdakiler, özellikle uygulama yavaş ve takılı kaldığında, veritabanı problemleriyle karşılaşıldığında kullanılan bazı betiklerdir.Ayrıca, kullanmadan önce betiğe aşina olmanız önerilir, ayrıca kendi ortamınıza göre yeniden yazabilirsiniz. Daha fazla devop ve DBA içeriği daha sonra paylaşılacak ve ilgilenen arkadaşlar buna dikkat edebilir ~