May 17, 2026, 11:40 PM

This commit is contained in:
Paweł Domański
2026-05-18 06:40:19 +00:00
commit 64944cf004
896 changed files with 310709 additions and 0 deletions
+300
View File
@@ -0,0 +1,300 @@
Welcome, **paweł**! 👋 Here are your prompts.
# Introduction
## What is the Agent Command Kit?
Mission Control is a single-file HTML dashboard that serves as your personal command center — tracking goals, projects, revenue, AI agents, and more. All in one place on your desktop.
📄 **Single HTML File**
No frameworks, no deploys, no dependencies. Just one file you open in your browser.
🤖 **AI-Built**
Copy a prompt, paste it into Claude or ChatGPT, and get a complete working dashboard in seconds.
🎨 **Fully Yours**
Every pixel is customizable. Change colors, add sections, make it match your workflow perfectly.
### Why It Works
Most dashboards require accounts, subscriptions, and fighting with someone else's idea of what you need. Mission Control flips that — it's a single HTML file:
- Opens instantly, works offline, zero loading screens
- Your data stays in your browser (localStorage) — no cloud, no accounts
- AI builds it to YOUR spec — not a template you have to hack around
- Version control it, back it up, share it — it's just a file
### How to Use This Guide
This guide contains **3 prompts** that build progressively. Each one is a complete, copy-paste-ready prompt designed to produce production-quality code.
1. **Copy the Prompt**
Click the copy button on any prompt block to copy it to your clipboard.
2. **Fill in \[Brackets\]**
Replace variables like `[YOUR_NAME]` with your actual info.
3. **Paste & Build**
Send to Claude or ChatGPT. Save the output as an HTML file. Done.
---
## Prompt 01: The Foundation
This mega-prompt builds your complete Mission Control dashboard from scratch — a premium dark-theme command center with live data, smooth animations, and persistent storage. One prompt, one file, zero dependencies.
### What You'll Get
A 2000+ line, production-quality HTML file containing:
- Dark glassmorphism theme with frosted-glass cards and subtle glow effects
- Sticky header with navigation tabs, live clock, and status indicator
- **Dashboard tab** — Welcome greeting, 4 metric cards, activity feed, priorities
- **Projects tab** — Full Kanban board (Backlog → In Progress → Done)
- **Timeline tab** — Phase-based roadmap with milestones
- **Notes tab** — Quick capture with auto-save
- All data persisted to localStorage — nothing lost on refresh
- Keyboard shortcut (Cmd+K) for search, responsive design, smooth animations
### Variables to Fill In
- `[YOUR_NAME]`: Your first name (used in the welcome greeting)
- `[YOUR_BUSINESS]`: Your company or project name
- `[YOUR_ROLE]`: Your title — CEO, Creator, Developer, etc.
- `[MAIN_GOAL]`: Your primary goal (e.g., "Hit $10K MRR")
- `[GOAL_DEADLINE]`: Target date (e.g., "December 2025")
- `[GOAL_METRIC]`: The key number you're tracking
- `[COLOR_ACCENT]`: Hex color for accents (e.g., `#6C63FF`, `#00D4AA`)
💡 **Tip:** Use Claude (Sonnet or Opus) for best results. The prompt is optimized for long-form code generation. If using ChatGPT, use GPT-4 with a "write the complete file" follow-up if it truncates.
### The Foundation Prompt
````text
I want you to build me a Mission Control dashboard as a single HTML file. This is my personal command center for tracking my life and business.
**About Me:**
- Name: [YOUR_NAME]
- Business/Role: [YOUR_BUSINESS] — [YOUR_ROLE]
- Main Goal: [MAIN_GOAL] by [GOAL_DEADLINE]
- Key Metric: [GOAL_METRIC]
**Technical Requirements:**
- Single self-contained HTML file (inline CSS + JS, no external dependencies except Google Fonts Inter)
- Dark theme with glassmorphism: primary bg #050508, cards with backdrop-filter blur, subtle borders rgba(255,255,255,0.06)
- Accent color: [COLOR_ACCENT] (use for highlights, active states, glows)
- Font: Inter from Google Fonts
- Fully responsive, smooth animations (fadeInUp on cards, pulse on status dot)
- All data saved to localStorage so nothing is lost on refresh
**Layout:**
- Sticky frosted-glass header: logo/title left, tab navigation center, search bar + live status dot right
- Tabs: 📊 Dashboard, 📋 Projects, 📅 Timeline, 📝 Notes
- Main content max-width 1600px, centered, 2.5rem padding
**Dashboard Tab:**
- Welcome bar: "Good [morning/afternoon/evening], [NAME]" with live date/time
- 4 metric cards in a grid: each with colored top accent bar (3px), icon, label, value, and trend indicator
Cards: [GOAL_METRIC] progress, Active Projects count, Tasks Today count, Days to Goal countdown
- Activity feed: scrollable list of recent items with timestamps (stored in localStorage)
- Top Priorities section: editable list with checkboxes, add new priority button
**Projects Tab:**
- Kanban board with 3 columns: Backlog, In Progress, Done
- Task cards: title, description preview, priority badge (high/medium/low with colors), created date
- Add task button per column, click card to edit, delete option
- All tasks persisted to localStorage
**Timeline Tab:**
- Visual roadmap with phases displayed vertically
- Each phase: title, date range, description, list of milestones with completion checkmarks
- Current phase highlighted...
````
---
## Prompt 02: The Modules
Now that you have the foundation, add power modules. Each prompt adds a new tab to your existing dashboard.
💡 **How to use:** Open a new conversation with your AI. Paste your existing `mission-control.html` file first, then paste the module prompt below it. The AI will return an updated file with the new tab integrated.
### 💰 Module A: Revenue Tracker
Track MRR, manage clients, visualize growth, and project annual revenue.
````text
Add a 💰 Revenue tab to my Mission Control. Include:
- Monthly revenue goal with visual gauge (circular or bar)
- Revenue chart showing last 6 months (simple bar chart, CSS-only or canvas)
- Client list with: name, monthly value, status (active/pending/churned), start date
- Add/edit/remove clients, auto-calculate MRR
- Revenue projections section: if current MRR continues, show projected annual + monthly growth needed to hit goal
- All data in localStorage
- Match the existing dark glassmorphism theme and animation style
````
### 🏢 Module B: AI Agent Command Center
Manage your AI agents, track their activity, send tasks, and log executive decisions.
````text
Add a 🏢 Command Center tab to my Mission Control for managing my AI agents/team. Include:
- Agent cards in a grid: each shows name, role/title, status (online/busy/offline with colored dots), model being used, last active timestamp
- Click agent card to open a slide-out detail panel with: full description, capabilities list, recent activity log, performance notes
- "Send Task" button that opens a modal with a text area (simulates sending tasks — saves to agent's activity log)
- Executive Decisions section below agents: list of key decisions made with date, question asked, decision summary, which agents were consulted
- Store all agent data in localStorage, include 3-4 sample agents to start
````
### 🎬 Module C: YouTube Studio
Plan video content, track growth milestones, and manage a content calendar.
````text
Add a 🎬 YouTube tab to my Mission Control for planning video content. Include:
- Video ideas pipeline: cards with title, topic, status (idea/scripting/filming/editing/published), target publish date
- Add/edit ideas, move between statuses
- YouTube growth tracker: current sub count (editable), milestone levels with fun titles (e.g., "Rising Creator" at 1K, "Growth Engine" at 10K), XP-style progress bar to next milestone
- Content calendar: simple month grid showing planned publish dates
- All data in localStorage, match existing theme
````
### 📞 Module D: Meeting Prep
Never walk into a meeting unprepared. Track agendas, notes, and action items.
````text
Add a 📞 Meetings tab to my Mission Control. Include:
- Upcoming meetings list: title, date/time, attendee(s), type (call/zoom/in-person), prep notes
- Add/edit/delete meetings
- Each meeting card expands to show: agenda items (editable checklist), notes textarea, action items that come out of it
- Past meetings archive (auto-moves when date passes)
- Today's meetings highlighted at top with countdown timers
- localStorage persistence, match theme
````
### 📡 Module E: Daily Intel Feed
Curate your own intel feed — AI news, trends, competitor moves, and opportunities.
````text
Add a 📡 Intel tab to my Mission Control. Include:
- Sections for different intel categories: AI News, Industry Trends, Competitor Watch, Opportunities
- Each item: title, summary, source link, date added, importance tag (🔥 hot / ⚡ notable / 📌 reference)
- Add new intel items with a simple form
- Filter by category and importance
- "Daily Brief" section at top: 3-5 most important items auto-sorted by date
- localStorage persistence, match theme
````
---
## Prompt 03: The Engine
Make Mission Control a living dashboard. This prompt builds a lightweight Node.js server for live data, weather, and backup.
````text
I need a lightweight local server to power my Mission Control dashboard with live data. Build me a complete Node.js server with these specs:
**Setup:**
- Single file: server.js (or server.mjs)
- Port: 8899
- Serve my mission-control.html file at the root
- CORS enabled for local development
- No heavy frameworks — just built-in Node http/https modules (or Express if cleaner)
**API Endpoints:**
Create RESTful endpoints that Mission Control can fetch from:
1. `GET /mc/status` — Returns system status:
- Server uptime, last data refresh timestamp, connection health: "online"
2. `GET /mc/data` — Returns dashboard data:
- Read from a local JSON file (mc-data.json) that stores all dashboard state
3. `POST /mc/data` — Save dashboard data:
- Accepts JSON body, writes to mc-data.json
- Lets Mission Control sync its localStorage to the server as backup
4. `GET /mc/weather?city=[CITY]` — Fetch current weather:
- Use wttr.in API (free, no key): https://wttr.in/[CITY]?format=j1
- Return: temperature, condition, feels_like
5. `GET /mc/activity` — Returns recent activity log:
- Read from mc-activity.json, returns last 50 entries
6. `POST /mc/activity` — Add activity entry:
- Appends to mc-activity.json with timestamp
**Auto-start (macOS):**
Also generate a LaunchAgent plist file that auto-starts this server on login:
- File: `~/Library/LaunchAgents/com.missioncontrol.server.plist`
- Points to the server.js file
- Runs on load, restarts if crashed
- Include the terminal commands to install it
**Setup instructions:**
Print clear step-by-step setup instructions:
1. Save `server.js` to a folder
2. Run `node server.js`
3. Open http://localhost:8899
4. (Optional) Install the LaunchAgent for auto-start
Keep it simple. No database, no auth, no complexity. Just a clean local server that makes Mission Control come alive.
````
### Prompt 03 — Bonus
#### Connecting Your Dashboard to the Server
Once your server is running, use this mini-prompt to wire up your dashboard:
````text
⚡ **Connection Prompt**
Update my mission-control.html to connect to the local server at http://localhost:8899. Add:
1. On page load, fetch `GET /mc/data` and merge with localStorage (server = backup, localStorage = primary)
2. Every 5 minutes, `POST` current localStorage state to `/mc/data` as backup
3. Fetch weather from `GET /mc/weather?city=[YOUR_CITY]` and display temp + condition in the header next to the status dot
4. When any data changes, `POST` to `/mc/activity` with a description of what changed
5. Update the status dot: green = server connected, red = offline (fallback to localStorage-only mode)
6. Add a small "Server: Online/Offline" indicator in the header
Keep all existing localStorage functionality as the primary data layer. The server is a backup + data enrichment layer, not a replacement.
````
💡 **Pro tip:** You don't need The Engine to use Mission Control. The HTML file works perfectly standalone. The server just adds superpowers — live weather, backup, and a clean localhost URL.
---
## You're Ready
### Now Make It Yours
These prompts are starting points. The best agent setup is the one built around _your_ life, _your_ goals, _your_ workflow. Customize relentlessly.
Change the colors. Add new tabs. Rip out what you don't need. Ask the AI to rebuild sections. This is _your_ command center.
---
**Watch the full build series on YouTube**
[youtube.com/@Zach_Babiarz_ai](https://youtube.com/@Zach_Babiarz_ai)
**Follow on all socials**: [zachbabiarz.com](https://zachbabiarz.com/)
**Questions? Ideas? Show me what you built.**
Drop a comment on any video — I read every single one.
---
### WANT EXTRA HELP?
#### Book a 1-on-1 with Zach
Get your OpenClaw setup dialed in for your specific business — workflows, memory, automations, and agents built around you.
[Book a Consult Call →](https://automatewithzach.com/)
---
BUILT WITH OPENCLAW + CLAUDE
© 2026 Zach Babiarz. Share freely.
+470
View File
@@ -0,0 +1,470 @@
# OpenClaw Ultimate Memory Upgrade
The most advanced OpenClaw memory system available. Copy-paste this prompt and your agent installs everything — 6 layers of memory, auto-curation, semantic search, and smart token loading. No manual setup required.
source: https://mission-control-prompts.vercel.app/?utm_source=youtube&utm_medium=video&utm_campaign=long-term-memory
💡 **Before you run this:** You'll need a free Google Gemini API key for the vector memory layer. Get one in 30 seconds at [aistudio.google.com](https://aistudio.google.com/) — no credit card required.
---
🧠 **Ultimate Memory Upgrade Prompt**
Paste into your OpenClaw chat — agent does the rest.
> You are about to receive a full memory system upgrade. This will install and configure every layer of the elite memory stack — without touching or deleting anything you already have. Read all instructions carefully, then execute them in order.
> ⚠️ **Do this FIRST — if you installed OpenClaw recently**
>
> **Applies to you if:** You installed or updated OpenClaw to version `2026.3.2` or newer (released March 4, 2026). New installs on this version default to limited tools and your agent won't be able to run scripts or install packages without this fix.
>
> Not sure what version you have? Open your terminal and run `openclaw --version` to check. If you're on an older version, you can skip this step.
>
> Run this command in your terminal:
> ```bash
> openclaw config set tools.profile coding
> ```
>
> **🍎 Mac**
>
> Press `Cmd + Space`, type `Terminal`, hit Enter. Paste the command above and press Enter.
>
> **🪟 Windows**
>
> Press `Win + R`, type `cmd`, hit Enter. Paste the command above and press Enter.
>
> Once done, come back here and copy the prompt below. Your agent handles everything else from chat.
---
### OVERVIEW — What you are installing
- **Layer 1: Daily Notes** — auto-written session logs (you likely already have this)
- **Layer 2: MEMORY.md** — curated long-term memory with smart structure (upgrading yours)
- **Layer 3: projects.md** — compact project registry for fast startup context loading
- **Layer 4: Vector DB** — PostgreSQL + pgvector semantic memory with AI-powered search
- **Layer 5: Smart HEARTBEAT.md loading** — 4K tokens instead of 20K per heartbeat
- **Layer 6: Twice-weekly auto-curation cron** — MEMORY.md rewrites itself automatically
---
### Step 1 — Read what you already have
Read the following files in full:
- `~/.openclaw/workspace/HEARTBEAT.md`
- `~/.openclaw/workspace/MEMORY.md`
- `~/.openclaw/workspace/AGENTS.md` (if it exists)
Note what is already there. You will upgrade, not replace.
---
### Step 2 — Create or upgrade `projects.md`
Read all files in `~/.openclaw/workspace/memory/` to understand what projects, clients, and tools are already documented.
Then create or overwrite `~/.openclaw/workspace/memory/projects.md` with a clean project registry. Include:
- Every active project with its live URL (if applicable)
- Current status (live / in progress / blocked)
- Tech stack (brief)
- Key notes or blockers
- File locations on disk
Format it as a markdown table or clean sections. Keep it under 80 lines total. This file loads at every heartbeat so lean is good.
If you cannot find enough info to populate it, ask the user:
> "What are your 3 to 5 most active projects right now? Give me the name, what it does, and the URL if it is live."
---
### Step 3 — Upgrade `HEARTBEAT.md`
Read the current `HEARTBEAT.md`. Add the following block at the very TOP of the file (above everything else). Do not remove anything that is already there:
````markdown
## SMART MEMORY LOADING (do this first, every heartbeat)
Before anything else, load context efficiently:
1. Read `memory/projects.md` — compact project registry (~1K tokens)
2. Read `MEMORY.md` — curated long-term memory (~3K tokens)
3. Only load daily notes (`memory/YYYY-MM-DD.md`) when asked about specific past work
4. Only run vector search when a specific question about past work comes up
This gives full context at ~10% of the token cost. Daily notes are archives, not runtime docs.
````
---
### Step 4 — Upgrade `MEMORY.md`
Read the current `MEMORY.md`. Add a new section called `## Memory System` (if it does not already exist) with the following content:
````markdown
## Memory System
- **Daily notes:** `memory/YYYY-MM-DD.md` — raw session logs, written automatically, load on-demand
- **MEMORY.md:** curated long-term brain — load every heartbeat (~3K tokens)
- **projects.md:** compact project registry — load every heartbeat (~1K tokens)
- **Vector DB:** PostgreSQL + pgvector, semantic search via AI embeddings
- **Smart loading:** only `projects.md` + `MEMORY.md` at startup. Daily notes + vector search = on-demand only. Saves ~80% token cost vs loading everything.
````
Also update the `Last updated` date at the top of `MEMORY.md` to today's date.
---
### Step 5 — Install Vector Memory (PostgreSQL + pgvector)
#### 5a — Check if PostgreSQL is installed
Run:
```bash
which psql
```
If not found, install it:
- **macOS:** `brew install postgresql@17 && brew services start postgresql@17 && echo 'export PATH="/opt/homebrew/opt/postgresql@17/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc`
- **Linux:** `sudo apt install postgresql postgresql-contrib`
#### 5b — Install vector-memory skill scripts
Run:
```bash
mkdir -p ~/.openclaw/workspace/skills/vector-memory/scripts/
```
Then write each of the following 4 files to disk exactly as shown:
**FILE 1: `~/.openclaw/workspace/skills/vector-memory/scripts/memory_flush.py`**
```python
#!/usr/bin/env python3
"""Flush daily memory files into vector database."""
import argparse, glob, hashlib, json, os, re, sys, urllib.request
import psycopg2
DB = "dbname=openclaw_memory"
GEMINI_KEY = os.environ.get("GEMINI_API_KEY", "")
EMBED_MODEL = "gemini-embedding-001"
WORKSPACE = os.path.expanduser("~/.openclaw/workspace")
MEMORY_DIR = os.path.join(WORKSPACE, "memory")
FLUSH_TRACKER = os.path.join(MEMORY_DIR, "vector-flush-tracker.json")
def get_embedding(text):
url = f"https://generativelanguage.googleapis.com/v1beta/models/{EMBED_MODEL}:embedContent?key={GEMINI_KEY}"
payload = json.dumps({"model": f"models/{EMBED_MODEL}", "content": {"parts": [{"text": text}]}, "outputDimensionality": 768}).encode()
req = urllib.request.Request(url, data=payload, headers={"Content-Type": "application/json"})
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read())["embedding"]["values"]
def load_tracker():
if os.path.exists(FLUSH_TRACKER):
with open(FLUSH_TRACKER) as f:
return json.load(f)
return {"flushed_files": {}}
def save_tracker(t):
with open(FLUSH_TRACKER, "w") as f:
json.dump(t, f, indent=2)
def chunk_markdown(text, source_file):
chunks, current_section, current_text = [], "", []
for line in text.split("\n"):
if re.match(r'^#{1,3}\s', line):
if current_text:
content = "\n".join(current_text).strip()
if len(content) > 20:
chunks.append({"text": content, "label": current_section.strip("# ").strip(), "source_file": source_file})
current_section, current_text = line, [line]
else:
current_text.append(line)
if current_text:
content = "\n".join(current_text).strip()
if len(content) > 20:
chunks.append({"text": content, "label": current_section.strip("# ").strip(), "source_file": source_file})
return chunks
def file_hash(fp):
with open(fp) as f:
return hashlib.md5(f.read().encode()).hexdigest()
def flush(dry_run=False, force=False):
tracker = load_tracker()
conn = psycopg2.connect(DB) if not dry_run else None
files = sorted(glob.glob(os.path.join(MEMORY_DIR, "*.md")))
memory_md = os.path.join(WORKSPACE, "MEMORY.md")
if os.path.exists(memory_md):
files.append(memory_md)
total_stored = 0
for filepath in files:
fname = os.path.basename(filepath)
fhash = file_hash(filepath)
if not force and fname in tracker["flushed_files"] and tracker["flushed_files"][fname] == fhash:
continue
with open(filepath) as f:
content = f.read()
chunks = chunk_markdown(content, fname)
if dry_run:
print(f"[DRY RUN] {fname}: {len(chunks)} chunks")
continue
cur = conn.cursor()
cur.execute("DELETE FROM memories WHERE metadata->>'source_file' = %s", (fname,))
for chunk in chunks:
embedding = get_embedding(chunk["text"])
vec_str = "[" + ",".join(str(v) for v in embedding) + "]"
cur.execute("INSERT INTO memories (text, label, category, source, embedding, metadata) VALUES (%s,%s,%s,%s,%s::vector,%s)",
(chunk["text"], chunk["label"], "daily-note", "flush", vec_str, json.dumps({"source_file": fname})))
total_stored += 1
conn.commit()
cur.close()
tracker["flushed_files"][fname] = fhash
print(f"[FLUSHED] {fname}: {len(chunks)} chunks stored")
if conn:
conn.close()
save_tracker(tracker)
print(json.dumps({"total_stored": total_stored, "files_processed": len(files)}))
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument("--dry-run", action="store_true")
p.add_argument("--force", action="store_true")
args = p.parse_args()
flush(args.dry_run, args.force)
```
**FILE 2: `~/.openclaw/workspace/skills/vector-memory/scripts/memory_search.py`**
```python
#!/usr/bin/env python3
"""Search memories by semantic similarity."""
import argparse, json, os, urllib.request
import psycopg2
DB = "dbname=openclaw_memory"
GEMINI_KEY = os.environ.get("GEMINI_API_KEY", "")
EMBED_MODEL = "gemini-embedding-001"
def get_embedding(text):
url = f"https://generativelanguage.googleapis.com/v1beta/models/{EMBED_MODEL}:embedContent?key={GEMINI_KEY}"
payload = json.dumps({"model": f"models/{EMBED_MODEL}", "content": {"parts": [{"text": text}]}, "outputDimensionality": 768}).encode()
req = urllib.request.Request(url, data=payload, headers={"Content-Type": "application/json"})
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read())["embedding"]["values"]
def search(query, limit=5, category=None, min_score=0.0):
embedding = get_embedding(query)
vec_str = "[" + ",".join(str(v) for v in embedding) + "]"
sql = "SELECT id, text, label, category, source, created_at, 1-(embedding<=>%s::vector) as similarity FROM memories"
params = [vec_str, vec_str, limit]
if category:
sql += " WHERE category=%s"
params = [vec_str, vec_str, category, limit]
sql += " ORDER BY embedding<=>%s::vector LIMIT %s"
conn = psycopg2.connect(DB)
cur = conn.cursor()
cur.execute(sql, params)
results = [{"id": r[0], "text": r[1], "label": r[2], "category": r[3], "source": r[4], "created_at": r[5].isoformat(), "similarity": round(float(r[6]),4)} for r in cur.fetchall() if float(r[6]) >= min_score]
cur.close()
conn.close()
print(json.dumps({"query": query, "count": len(results), "results": results}, indent=2))
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument("query")
p.add_argument("--limit", "-n", type=int, default=5)
p.add_argument("--category", "-c", default=None)
p.add_argument("--min-score", type=float, default=0.3)
args = p.parse_args()
search(args.query, args.limit, args.category, args.min_score)
```
**FILE 3: `~/.openclaw/workspace/skills/vector-memory/scripts/memory_store.py`**
```python
#!/usr/bin/env python3
"""Store a memory with vector embedding."""
import argparse, json, os, urllib.request
import psycopg2
DB = "dbname=openclaw_memory"
GEMINI_KEY = os.environ.get("GEMINI_API_KEY", "")
EMBED_MODEL = "gemini-embedding-001"
def get_embedding(text):
url = f"https://generativelanguage.googleapis.com/v1beta/models/{EMBED_MODEL}:embedContent?key={GEMINI_KEY}"
payload = json.dumps({"model": f"models/{EMBED_MODEL}", "content": {"parts": [{"text": text}]}, "outputDimensionality": 768}).encode()
req = urllib.request.Request(url, data=payload, headers={"Content-Type": "application/json"})
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read())["embedding"]["values"]
def store(text, label=None, category=None, source="conversation", metadata=None):
embedding = get_embedding(text)
vec_str = "[" + ",".join(str(v) for v in embedding) + "]"
conn = psycopg2.connect(DB)
cur = conn.cursor()
cur.execute("INSERT INTO memories (text,label,category,source,embedding,metadata) VALUES (%s,%s,%s,%s,%s::vector,%s) RETURNING id,created_at",
(text, label, category, source, vec_str, json.dumps(metadata or {})))
row = cur.fetchone()
conn.commit()
cur.close()
conn.close()
print(json.dumps({"id": row[0], "created_at": row[1].isoformat(), "label": label, "category": category, "text": text[:100]}))
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument("text")
p.add_argument("--label", "-l", default=None)
p.add_argument("--category", "-c", default=None)
p.add_argument("--source", "-s", default="conversation")
p.add_argument("--meta", "-m", default=None)
args = p.parse_args()
store(args.text, args.label, args.category, args.source, json.loads(args.meta) if args.meta else None)
```
**FILE 4: `~/.openclaw/workspace/skills/vector-memory/scripts/memory_forget.py`**
```python
#!/usr/bin/env python3
"""Delete memories by id, category, or age."""
import argparse, json
import psycopg2
from datetime import datetime, timedelta
DB = "dbname=openclaw_memory"
def forget(id=None, category=None, older_than_days=None):
conn = psycopg2.connect(DB)
cur = conn.cursor()
if id:
cur.execute("DELETE FROM memories WHERE id=%s RETURNING id,text", (id,))
elif category:
cur.execute("DELETE FROM memories WHERE category=%s RETURNING id,text", (category,))
elif older_than_days:
cutoff = datetime.now() - timedelta(days=older_than_days)
cur.execute("DELETE FROM memories WHERE created_at<%s RETURNING id,text", (cutoff,))
else:
print("Error: provide --id, --category, or --older-than")
return
deleted = cur.fetchall()
conn.commit()
cur.close()
conn.close()
print(json.dumps({"deleted": len(deleted), "ids": [r[0] for r in deleted]}))
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument("--id", type=int, default=None)
p.add_argument("--category", default=None)
p.add_argument("--older-than", type=int, default=None)
args = p.parse_args()
forget(args.id, args.category, args.older_than)
```
After writing all 4 files, verify they exist:
```bash
ls ~/.openclaw/workspace/skills/vector-memory/scripts/
```
#### 5c — Install Python dependency
```bash
pip3 install psycopg2-binary
```
(This is the Python driver that connects to PostgreSQL. Required for all 4 scripts.)
#### 5d — Set up the database
```bash
psql postgres -c "CREATE DATABASE openclaw_memory;" 2>/dev/null || echo "DB may already exist"
psql openclaw_memory -c "CREATE EXTENSION IF NOT EXISTS vector;"
psql openclaw_memory -c "CREATE TABLE IF NOT EXISTS memories (id SERIAL PRIMARY KEY, text TEXT NOT NULL, label TEXT, category TEXT, source TEXT, embedding vector(768), metadata JSONB DEFAULT '{}', created_at TIMESTAMPTZ DEFAULT NOW());"
psql openclaw_memory -c "CREATE INDEX IF NOT EXISTS memories_embedding_idx ON memories USING ivfflat (embedding vector_cosine_ops);"
```
#### 5e — Check for Gemini API key
The vector memory system uses Google Gemini for embeddings (free tier, no credit card needed).
Run:
```bash
echo $GEMINI_API_KEY
```
If empty, ask the user:
> "Do you have a Google Gemini API key? Get one free at aistudio.google.com. Paste it here and I will configure it."
Once you have the key, add it to your shell profile:
- **macOS/Linux:** `echo 'export GEMINI_API_KEY="your-key-here"' >> ~/.zshrc && source ~/.zshrc`
#### 5f — Run the initial memory flush
```bash
python3 ~/.openclaw/workspace/skills/vector-memory/scripts/memory_flush.py
```
Report back how many memories were stored.
---
### Step 6 — Add twice-weekly auto-curation cron
Use the OpenClaw cron tool to create a job with these settings:
- **Name:** "Twice-Weekly MEMORY.md Auto-Curation"
- **Schedule:** cron expression `"0 5 * * 3,0"` (Wednesday and Sunday at 5am local time)
- **Session target:** isolated
- **Model:** `anthropic/claude-sonnet-4-20250514` (or your default model)
- **Delivery:** announce to your chat when complete
**The cron agent message:**
> Your job is to auto-curate `MEMORY.md`.
>
> **STEP 1:** Find the 7 most recent daily note files. Run: `ls ~/.openclaw/workspace/memory/*.md | sort | tail -10` then read each one.
>
> **STEP 2:** Read current `MEMORY.md` in full.
>
> **STEP 3:** Identify what is stale (old stats, outdated project info), what is new (decisions, clients, launches), and what should be removed.
>
> **STEP 4:** Rewrite `MEMORY.md` with accurate, current information. Keep the same sections. Update numbers. Add new sections for major new things. Remove outdated info. Update the `Last Updated` date. Max 400 lines.
>
> **STEP 5:** Run: `python3 ~/.openclaw/workspace/skills/vector-memory/scripts/memory_flush.py`
>
> **STEP 6:** Update `projects.md` with any status changes you found.
>
> Announce a brief summary when done.
---
### Step 7 — Add vector memory flush to `HEARTBEAT.md`
Add this to your `HEARTBEAT.md` near the bottom:
````markdown
## Vector Memory Flush (every heartbeat)
Run: `python3 ~/.openclaw/workspace/skills/vector-memory/scripts/memory_flush.py`
If `total_stored = 0`, that is fine — means nothing new to embed.
````
---
### Step 8 — Verify everything works
Run these 4 checks and report results:
1. `python3 ~/.openclaw/workspace/skills/vector-memory/scripts/memory_search.py "recent projects"`
2. `cat ~/.openclaw/workspace/memory/projects.md`
3. `head -20 ~/.openclaw/workspace/HEARTBEAT.md`
4. List cron jobs to confirm the auto-curation cron was created
---
### Step 9 — Summary report
When all steps are complete, give me a summary:
- [ ] Layers installed (checkmark each one)
- [ ] Number of memories in vector DB
- [ ] Projects in `projects.md`
- [ ] Cron scheduled for (next run date)
- [ ] Any steps that failed or need manual attention
---
> You now have the most advanced OpenClaw memory system available. Your agent will load context in 4K tokens instead of 20K+ (80% savings), search memory semantically, auto-update its long-term memory twice a week, and never forget what you have built, decided, or discussed. Let's go.
+82
View File
@@ -0,0 +1,82 @@
Welcome back, **paweł**! 👋 Scroll down to get your prompts.
# Skills Library
## OpenClaw Skills
Free skills to supercharge your AI agents. Each skill is audited for safety and ready to install in seconds — just copy the command or paste the SKILL.md into your agent.
---
### Skill Guard
Audit any OpenClaw skill for security risks before installing it. Skill Guard teaches your AI agent to scan for prompt injection, data exfiltration, destructive commands, obfuscated code, and supply chain attacks — then produces a detailed security report with a risk rating.
`🟢 Verified Safe` `Security` `No Scripts` `No Network`
- ✓ 8-step security audit procedure
- ✓ Prompt injection pattern database
- ✓ Dependency & typosquatting checks
- ✓ Behavioral trace analysis
- ✓ Claims vs reality comparison
- ✓ Risk rating: Safe / Caution / Risky
- ✓ Zero dependencies — pure instructions
- ✓ Works with any Claude-based agent
---
### Skill Detector
Your AI skill factory. Skill Detector runs passively in every conversation — it watches your workflows, spots repeating patterns, and auto-drafts complete skills for you. It also audits your existing skills, finds gaps, and recommends improvements. One skill that builds all your other skills.
`🟢 Verified Safe` `Productivity` `No Scripts` `No Network`
- ✓ Passive pattern detection across sessions
- ✓ Auto-drafts complete, ready-to-save SKILL.md files
- ✓ Style matching — learns from your existing skills
- ✓ Skill audit & grading (A through F)
- ✓ Gap analysis — finds missing workflows
- ✓ Skill chaining — combines related skills
- ✓ Conversation-to-skill capture
- ✓ Zero dependencies — pure instructions
---
🚀 **More skills coming soon.**
Subscribe to Zach's YouTube for new skill drops and tutorials.
---
## You're Ready
### Now Make It Yours
These prompts are starting points. The best agent setup is the one built around _your_ life, _your_ goals, _your_ workflow. Customize relentlessly.
Change the colors. Add new tabs. Rip out what you don't need. Ask the AI to rebuild sections. This is _your_ command center.
**Watch the full build series on YouTube**
[youtube.com/@Zach_Babiarz_ai](https://youtube.com/@Zach_Babiarz_ai)
**Follow on all socials**: [zachbabiarz.com](https://zachbabiarz.com/)
**Questions? Ideas? Show me what you built.**
Drop a comment on any video — I read every single one.
---
### WANT EXTRA HELP?
#### Book a 1-on-1 with Zach
Get your OpenClaw setup dialed in for your specific business — workflows, memory, automations, and agents built around you.
[Book a Consult Call →](https://automatewithzach.com/)
---
BUILT WITH OPENCLAW + CLAUDE
© 2026 Zach Babiarz. Share freely.
+62
View File
@@ -0,0 +1,62 @@
Welcome back, **paweł**! 👋 Scroll down to get your prompts.
📧
An email inbox your AI agent can actually use. Send, receive, and manage emails autonomously — no shared accounts, no hacks.
[Get AgentMail →](https://agentmail.to/)
🌐
Instant web publishing for AI agents. Tell your agent to publish something — get a URL back in seconds. Works with any agent: OpenClaw, Codex, Cursor, and more.
[Get here.now →](https://here.now/)
🎬
Generate videos programmatically with React. Your agent can now create, render, and export real video files — no editing software required.
[Get Remotion →](https://remotion.dev/)
🔍
AI-powered web search built specifically for agents. Your agent can search the web, get real-time answers, and cite sources — not just guess from training data.
[Get Tavily →](https://tavily.com/)
🔥
Turn any website into clean, AI-ready data with one API call. Tavily finds the page — Firecrawl reads it. Perfect for competitor research, lead enrichment, and building knowledge bases.
[Get Firecrawl →](https://firecrawl.dev/)
More tools added regularly. Stay tuned for updates.
You're Ready
## Now Make It Yours
These prompts are starting points. The best agent setup is the one built around _your_ life, _your_ goals, _your_ workflow. Customize relentlessly.
Change the colors. Add new tabs. Rip out what you don't need. Ask the AI to rebuild sections. This is _your_ command center.
Watch the full build series on YouTube
[youtube.com/@Zach\_Babiarz\_ai](https://youtube.com/@Zach_Babiarz_ai)
Follow on all socials: [zachbabiarz.com](https://zachbabiarz.com/)
Questions? Ideas? Show me what you built.
Drop a comment on any video — I read every single one.
WANT EXTRA HELP?
### Book a 1-on-1 with Zach
Get your OpenClaw setup dialed in for your specific business — workflows, memory, automations, and agents built around you.
[Book a Consult Call →](https://automatewithzach.com/)
BUILT WITH OPENCLAW + CLAUDE
© 2026 Zach Babiarz. Share freely.
+114
View File
@@ -0,0 +1,114 @@
1. Ile stron internetowych (domen) obsługuje hosting?
Czy wystarczająco teraz i w najbliższej przyszłości?
2. Czy wystarczy miejsca na hostingu?
Ile teraz zajmują wszystkie dane (pliki, bazy, maile)? Ile mogą zajmować w przyszłości?
3. Jaki jest limit transferu?
Czy wystarczy mi teraz? Czy będzie wystarczający wraz ze wzrostem popularności i w
gorących okresach zwiększonego ruchu?
4. Ile kont pocztowych potrzebuję?
Ile skrzynek e-mail będzie potrzebne teraz i w najbliższej przyszłości? Np. konta ogólne
(kontakt@…, biuro@…), konta pracowników
4a. Jaka jest maksymalna wielkość pojedynczej wiadomości e-mail?
Czy będą wysłane większe pliki ponad ten limit (np. zdjęcia, dokumenty)?
4b. Jaka jest maksymalna liczba wysłanych maili?
Czy limit na 15 min / na dzień / na dobę będzie wystarczający?
4c. Jaka jest maksymalna liczba odbiorców pojedynczej wiadomości
e-mail?
Czy będzie wystarczająca? Czy planuję wysyłać jednego maila do wielu odbiorców?
wersja 1.1 JakWybraćHosting.pl Strona 3 z 9
Porada: Jeśli planujesz masowe wysyłki maili lub powiadomień i chcesz zwiększyć
ich dostarczalność (aby nie lądowały w spamie), zainteresuj się osobnymi usługami
dedykowanymi do takich działań (newslettery, mailingi, zewnętrzne SMTP).
4d. Jaka jest maksymalna liczba e-maili wysyłanych przez mail()?
Czy będzie wystarczająca? Czy planuję wysyłać sporo automatycznych wiadomości
(np. powiadomień e-mail)?
5. Jaki rodzaj dysków oferuje hosting?
HDD, SSD czy SSD NVMe (najszybsze)?
5a. Czy IOPS (Ilość operacji na dysku na sekundę) jest jakoś
ograniczona?
Im więcej, tym lepiej. Minimum to 100. Najlepiej 1000 i więcej.
5b. Czy maksymalna liczba plików jest jakoś ograniczona?
Im więcej, tym lepiej. Minimum to 100 000.
5c. Czy hosting ogranicza prędkość odczytu danych z dysku?
Lepiej, aby takich ograniczeń nie było.
6. Jaka jest dostępna moc procesora? Ile rdzeni lub jaki % CPU?
Im więcej, tym lepiej. Minimum 1 rdzeń procesora / 1 vCore / 1 GHz / 100% CPU.
wersja 1.1 JakWybraćHosting.pl Strona 4 z 9
6a. Jaka jest maksymalna liczba procesów PHP?
Im więcej, tym lepiej. Minimum 10.
7. Jaka jest dostępna pamięć RAM?
Im więcej, tym lepiej. Minimum 1024 MB / 1 GB.
7a. Jaki jest limit pamięci RAM dla jednego procesu? (memory_limit)
Im więcej, tym lepiej. Minimum 512 MB.
8. Czy hosting wspiera aktualną wersję PHP?
Aktualną wersję sprawdź tutaj. Przy okazji sprawdź też wersję bazy danych MySQL /
PostgreSQL.
9. Czy hosting oferuje Redis i/lub Memcached?
Jeśli tak, to dobrze.
10. Czy hosting wspiera HTTP/2?
Każdy hosting powinien wspierać. A może już wspiera HTTP/3 (QUIC)?
11. Na jakim oprogramowaniu serwera działa hosting?
LiteSpeed jest szybszy od Apache i Nginx.
wersja 1.1 JakWybraćHosting.pl Strona 5 z 9
12. Jaka jest przepustowość (szybkość) łącza serwera hostingu?
Im większa, tym lepiej. Minimum 500 MB/s.
13. Jaka jest maksymalna liczba jednoczesnych połączeń HTTP?
Czy jest takie ograniczenie? Jeśli tak, to im więcej, tym lepiej (minimum 100).
13a. Czy istnieje ograniczenie maksymalnej liczby żądań HTTP w
ciągu doby?
Lepiej, żeby nie było.
14. Jaki jest maksymalny czas wykonywania skryptu PHP czy zadania
cron?
Czy są takie limity? Jeśli tak to im większe, tym lepiej. Minimum to 30-60 sekund.
15. Jak często wykonywane są kopie zapasowe?
Im cześciej, tym lepiej. Minimum raz na dobę.
15a. Jak długo przechowywane są kopie zapasowe?
Im dłużej, tym lepiej. Minimum to 7 dni.
15b. Jak wygląda przywracanie kopii zapasowych?
Czy jest darmowe? Ile trwa? Czy można to zrobić samodzielnie?
wersja 1.1 JakWybraćHosting.pl Strona 6 z 9
16. Czy hosting wspiera darmowe certyfikaty SSL Let's Encrypt?
Powinien wspierać.
17. Czy hosting oferuje zabezpieczenia poczty?
Czy hosting oferuje SPF, DKIM i DMARC dla skrzynek e-mail?
18. Czy hosting oferuje zabezpieczenia DNS?
Czy dostępne jest DNSSEC iDNS Anycast. Dobrze, gdyby było.
19. Czy hosting jest zgodny z RODO?
Czy oferuje podpisanie umowy o powierzeniu przetwarzania danych osobowych (w
formie elektronicznej lub papierowej)?
20. Ile baz danych oferuje konto hostingowe?
Zasada: jedna strona www = jedna baza danych.
20a. Czy jest ograniczenie maksymalnej wielkości bazy danych?
Lepiej, aby nie było, jeśli zamierzamy trzymać w bazie więcej danych.
20b. Czy jest ograniczenie maksymalnej liczby jednoczesnych
połączeń do bazy danych?
Lepiej, aby nie było. Im więcej, tym lepiej.
wersja 1.1 JakWybraćHosting.pl Strona 7 z 9
Porada: Dobrze monitorować uptime hostingu zewnętrznym, niezależnym
narzędziem. Np. updown.io
Porada: Jeśli spodziewamy się odwiedzających z całego Świata, warto rozważyć
oprócz hostingu usługę CDN taką jak np. Cloudflare
Im więcej, tym lepiej. Minimum 100.
20c. Czy jest ograniczenie liczby jednoczesnych połączeń 1
użytkownika do bazy danych? (max_user_connections)
20d. Czy jest ograniczony maksymalny czas trwania pojedynczego
zapytania do bazy danych?
Jeśli tak, to im dłuższy, tym lepiej. Min. 30-60 sek.
21. Czy hosting gwarantuje SLA? Na jakim poziomie?
Jeśli tak, to im większe, tym lepiej.
22. Czy hosting oferuje dostęp przez SSH?
Dobrze, gdyby oferował.
23. Jaka jest lokalizacja hostingu?
Im bliżej odwiedzających stronę, tym lepiej. Wystarczy ten sam kontynent.
wersja 1.1 JakWybraćHosting.pl Strona 8 z 9
© Copyright by Mateusz Mazurek. Wszelkie prawa zastrzeżone.
Automatyczny instalator może ułatwić uruchamianie kilku stron www.
DODATKOWO: Czy panel hostingu ma wygodny instalator?
DODATKOWO: Czy hosting ma integrację z Cloudflare?
To miły dodatek ułatwiający pracę z tym CDN.
DODATKOWO: Czy panel hostingu ma uwierzytelnianie
dwuskładnikowe?
Dodatkowy kod wysyłany SMS, jednorasowy kod z aplikacji, U2F
DODATKOWO: Jak oceniany jest support i obsługa klienta?
W jakich godzinach pracuje? Jakie są dostępne formy kontaktu? Czy jest pomocny? Czy
szybko odpowiada na pytania? Czy odpowiedzi rozwiązują problem?
+71
View File
@@ -0,0 +1,71 @@
# Beyond the Chatbox: Building a Smarter AI Workflow
**The problem with today's AI is simple: we're using revolutionary tools like we're still in a chatroom.**
For one-off questions, brainstorming, or getting a quick code snippet, platforms like ChatGPT are fantastic. But when we try to use them for serious, repeatable work—like creating documentation, building reports, or managing project knowledge—the chat model breaks down.
This document outlines a more powerful, professional, and future-proof way to work with AI. We call it the "AI Workshop."
## The "Chat Trap": Why Your Current AI Workflow is Inefficient
Using a web-based chat interface for professional work creates three major problems:
1. **The Black Hole of Context:** Your chat history becomes a junk drawer. Important instructions, key decisions, and final outputs are buried in endless threads. Trying to get the AI to remember something specific from a week ago is a game of chance. We have no real control over what the AI "remembers," leading to inconsistent and unpredictable results.
2. **The Walled Garden:** Our prompts, our refinement techniques, and our generated content become hostages of a single platform (like OpenAI or Google). When a better, faster, or cheaper model comes along, moving our established workflows is nearly impossible. We are locked in.
3. **The Nightmare of Review:** How do you review an AI's work? You copy-paste it into a document and manually compare it to the original. It's slow, tedious, and error-prone. There's no "track changes" for AI, so you can't see *exactly* what it did.
It's time to separate our **work** from the **AI tool** we happen to be using today.
## The "AI Workshop": A File-Based, Version-Controlled Approach
The "AI Workshop" paradigm is simple but powerful:
> Your work—your documents, code, and knowledge—should live in local files, managed by a version control system like Git. The AI is a tool that operates on these files, not the place where they are stored.
This model is built on tools you already use, like VS Code, combined with AI-native extensions.
### Three Game-Changing Benefits
#### 1. You Control the Context (Not the AI)
Instead of relying on the AI's fuzzy memory, you give it precise, explicit context for every task.
* **File-Specific Instructions:** Need the AI to rewrite a chapter? Simply point it to the file: `Please review and improve the tone of @chapter_1.md.`
* **Project-Wide Rules:** Create a simple `AI_RULES.md` file in your project directory. In it, you can define the AI's persona, style guide, and a glossary of terms. The AI will automatically apply these rules every time it works on that project, ensuring perfect consistency.
**The result:** The AI behaves predictably and follows your rules every time.
#### 2. Review AI Changes in Seconds with "Diffs"
This is the biggest productivity booster. By integrating AI with Git, you unlock a professional review process:
1. **Commit:** Save the current, human-approved version of your file (`git commit`).
2. **Delegate:** Ask the AI to perform a complex task (e.g., "Refactor this function," "Translate this document").
3. **Review the `diff`:** Instantly see every single change the AI made, highlighted line-by-line. Additions are green, deletions are red.
You can accept or reject the AI's work with a single click, confident that you know exactly what happened. No more manual comparisons.
![image](https://user-images.githubusercontent.com/12345/67890123-abcde.png)
*(Image showing a side-by-side diff view)*
#### 3. Future-Proof Your Work
When `GPT-5` or a revolutionary new open-source model arrives, our team won't be stuck. Because our entire knowledge base lives in plain text files, switching AI providers is as simple as changing a setting in our editor.
Our work remains ours, independent of any single company. We use the best tool for the job, always.
## A Practical Toolkit for the AI Workshop
This new workflow doesn't mean abandoning chat. It means using the right tool for the right task:
* **For Quick Questions & Brainstorming:** Use web-based chats (ChatGPT, Claude) or AI-powered search (Perplexity).
* **For Professional, Repeatable Work:** Use your **AI Workshop** (VS Code/Cursor + Git).
* **For Standardized Tasks:** Use specialized AI features built into apps (e.g., Notion AI, email assistants).
## Why This Matters for Us
Adopting the "AI Workshop" model is a strategic shift. It moves us from treating AI as a novelty to integrating it as a professional, scalable tool. It's an investment in:
* **Quality:** Enforcing consistency and enabling rigorous review.
* **Efficiency:** Automating tedious tasks and speeding up review cycles.
* **Long-Term Value:** Building a durable, platform-independent knowledge base that will serve us for years to come.
+83
View File
@@ -0,0 +1,83 @@
# The AI Workshop: A Professional Paradigm for AI-Assisted Work
## The Gap Between Potential and Practice
Large Language Models (LLMs) represent a revolutionary leap in technology. Yet, the way most professionals interact with them—through simple, ephemeral chat windows—is fundamentally broken for serious, repeatable work. Its like trying to build an enterprise application using a notepad.
For brainstorming, answering trivia, or generating a one-off code snippet, chat interfaces are adequate. But for the core tasks of our profession—creating durable documentation, refactoring complex codebases, managing project knowledge, and enforcing standards—the chat model fails. It lacks the three pillars of professional software engineering: **control, reviewability, and persistence.**
This document outlines a superior paradigm: **The AI Workshop**. Its a methodology for integrating AI into our professional workflows in a way that is structured, scalable, and future-proof.
---
## The "Chat Trap": Why Web UIs Limit Professional Growth
Relying on web-based chat for professional tasks creates a workflow fraught with inefficiency, risk, and inconsistency. We call this the "Chat Trap."
#### 1. The Context Lottery: Unreliable and Unpredictable AI Behavior
A chat thread is a terrible place to store critical instructions. The AI's "memory" is a black box—a fleeting, probabilistic context window that we cannot inspect or control. Important rules, stylistic preferences, and key decisions get lost in the noise of the conversation. This forces us to constantly repeat ourselves and results in inconsistent output. We're gambling on the AI "remembering" the right thing at the right time.
#### 2. Platform Lock-In: Ceding Control of Our Intellectual Assets
Our prompts, our refinement techniques, and the content we generate are valuable intellectual assets. When they live exclusively inside a third-party platform (like OpenAI, Google, or Anthropic), they become hostages. Migrating our established workflows to a newer, better, or more secure model becomes a manual, painful process. We are architecturally coupled to a specific vendor, sacrificing our autonomy.
#### 3. The Review Nightmare: The Absence of Auditability
How do you reliably review AI-generated work from a chat box? The standard method is a manual, error-prone process of copy-pasting and side-by-side comparison. There is no "track changes" for AI chat. You cannot definitively prove *what* the AI changed, *why* it changed it, or verify that it didn't introduce subtle errors. This lack of a clear audit trail is unacceptable for professional-grade work.
---
## The AI Workshop: Applying Engineering Principles to AI Collaboration
The AI Workshop paradigm is a simple yet profound shift in methodology:
> **Your work—your code, your documentation, your rule sets—must live in local files, managed by a version control system (Git). The AI is a decoupled tool that operates on these files, not the container they are stored in.**
This model is built on the battle-tested tools of our trade: a local IDE (like VS Code with the Gemini extension), a version control system (Git), and plain text files.
### The Three Pillars of the AI Workshop
This approach provides three game-changing capabilities that solve the fundamental flaws of the chat model.
#### Pillar 1: Explicit, Version-Controlled Context
Instead of relying on the AI's unreliable memory, we provide it with explicit, machine-readable context for every task.
* **File-Based Instructions:** We create dedicated, version-controlled files (e.g., `.github/instructions/gemini.instructions.md`) that define the AI's persona, style guides, glossaries, and project-specific rules. The AI is directed to use these files, ensuring its behavior is consistent and deterministic.
* **Single Source of Truth:** Your instructions and your content live together in the same repository. The context is no longer an ephemeral conversation; it's a durable, reviewable part of the project.
**The Result:** The AI's behavior becomes predictable and repeatable. Onboarding a new team member (or a new AI model) is as simple as pointing them to the repository.
#### Pillar 2: Professional Review with High-Fidelity Diffs
This is the single greatest productivity multiplier. By integrating AI with Git, we transform review from a chore into a professional, high-confidence process.
1. **Commit:** You start with a known, human-approved version of a file, committed to Git.
2. **Delegate:** You instruct the AI to perform a complex task on that file (e.g., "Refactor this entire module for better readability," "Translate this document to Polish, adhering to the style guide in the instructions.").
3. **Review the `diff`:** In your IDE's source control panel, you instantly see every single change the AI made, highlighted line-by-line. Additions are green, deletions are red.
You can confidently accept or reject the AI's work with a single click, with full knowledge of the impact. The manual, error-prone comparison process is eliminated entirely.
![image](https://user-images.githubusercontent.com/12345/67890123-abcde.png)
*(Image showing a side-by-side diff view, illustrating the clarity of AI-generated changes.)*
#### Pillar 3: Architectural Decoupling and Future-Proofing
When our entire knowledge base and operational instructions live in plain text files, we are no longer locked into any single AI provider.
When `GPT-5`, `Claude 4`, or a breakthrough open-source model is released, our team can adopt it immediately. The core of our workflow—the `.md` and `.ts` files, the Git history, the instruction sets—remains ours. Switching AI providers becomes as trivial as changing a configuration setting in our editor. We use the best tool for the job, always, without sacrificing our work.
---
## The Right Tool for the Right Job
This new paradigm doesn't mean abandoning chat entirely. It means using a professional toolkit intelligently:
| Task Type | Recommended Tool | Why |
| ------------------------------- | -------------------------------- | ----------------------------------------------- |
| **Quick Questions & Brainstorming** | Web-based Chat (ChatGPT, Gemini) | Fast, conversational, low-stakes. |
| **Professional, Repeatable Work** | **Your AI Workshop (IDE + Git)** | Controlled, reviewable, persistent, secure. |
| **Standardized, Embedded Tasks** | In-App AI (Notion AI, etc.) | Convenient for platform-specific content. |
## A Strategic Imperative
Adopting the AI Workshop model is more than a productivity hack; it's a strategic decision. It moves us from being casual consumers of AI to professional, systematic integrators of AI. It is an investment in:
* **Quality & Consistency:** By enforcing standards and enabling rigorous review.
* **Efficiency & Speed:** By automating complex tasks and radically accelerating the review cycle.
* **Long-Term Value:** By building a durable, platform-independent intellectual asset base that will compound in value for years to come.
@@ -0,0 +1,18 @@
AZURE Fileshare for Offsite Backups Switzerland
subscription ID: b7789be5-9bd4-46b4-8354-c3f2ff47b157
to connect a drive to the Azure FileShare
$connectTestResult = Test-NetConnection -ComputerName chveeamoffsitebackup.file.core.windows.net -Port 445
if ($connectTestResult.TcpTestSucceeded) {
# Save the password so the drive will persist on reboot
cmd.exe /C "cmdkey /add:`"chveeamoffsitebackup.file.core.windows.net`" /user:`"localhost\chveeamoffsitebackup`" /pass:`"SS2HkMfj/KCHqcAnrMkX/olJ8WLNHBPm67u58aB3Z6/0//XHQ3bnissvic8BRRJE9e1DPcQeh5An+AStY7iWQw==`""
# Mount the drive
New-PSDrive -Name Z -PSProvider FileSystem -Root "\\chveeamoffsitebackup.file.core.windows.net\ch-sql-backup-archive-01" -Persist
} else {
Write-Error -Message "Unable to reach the Azure storage account via port 445. Check to make sure your organization or ISP is not blocking port 445, or use Azure P2S VPN, Azure S2S VPN, or Express Route to tunnel SMB traffic over a different port."
}
`"SS2HkMfj/KCHqcAnrMkX/olJ8WLNHBPm67u58aB3Z6/0//XHQ3bnissvic8BRRJE9e1DPcQeh5An+AStY7iWQw==`
+222
View File
@@ -0,0 +1,222 @@
# Współczesny ekosystem SQL Servera dlaczego to **nie** jest „tylko baza danych”
**Microsoft SQL Server** to rozbudowana platforma danych, a nie prosty komponent, jak czasem błędnie zakładają nietechniczni decydenci. U podstaw leży *pomyłka numer zero* przeświadczenie, że „baza danych to tylko kolejny moduł, który sam się sobą zajmie”. W praktyce to założenie rodzi lawinę problemów: projekty IT niedoszacowują potrzebne zasoby, pomijają zaprojektowanie porządnej warstwy dostępu do danych i nie planują utrzymania. W efekcie drobne kwestie pozostawione same sobie narastają do poważnych awarii, utrudniając dostęp do krytycznych danych i narażając biznes na straty. [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter)
Co więcej, **brak dedykowanego DBA (Database Administrator)** sprawia, że te zadania spadają na osobę bez odpowiedniego doświadczenia powstaje *„przypadkowy administrator”* (ang. *accidental DBA*), najczęściej deweloper lub administrator systemów, który nagle musi „utrzymać jakoś bazę” obok swoich codziennych obowiązków. Taka osoba, rzucona na głęboką wodę, często działa reaktywnie gasi pożary zamiast zapobiegać problemom bo brakuje jej czasu i wiedzy, by proaktywnie dbać o stabilność, bezpieczeństwo i wydajność systemu. [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter) [\[solarwinds.com\]](https://www.solarwinds.com/blog/the-secret-life-of-accidental-dbas)
## 1. Pomyłka numer zero lekceważenie bazy danych
**„Przecież to tylko baza danych”** to zdanie bywa punktem wyjścia wielu kłopotów. Wypowiadają je zwykle osoby spoza świata baz danych: architekci oprogramowania, kierownicy projektów czy analitycy biznesowi. Gdy w fazie planowania systemu zabraknie eksperta od baz, łatwo uwierzyć, że warstwa danych nie wymaga specjalnej troski. Konsekwencje pojawiają się później: brak **odrębnego budżetu i czasu** na zaprojektowanie solidnego modelu danych i mechanizmów dostępu skutkuje prowizorycznymi rozwiązaniami. Często nie przewiduje się osobnej roli **DBA** do administracji i monitoringu dopiero w obliczu problemów ktoś „dorabia” jako administrator bazy.
**Rezultat?** Wiele projektów informatycznych cierpi na chroniczne problemy wydajności, awarie lub incydenty bezpieczeństwa, którym można było zapobiec. Małe błędy (np. brak indeksu, nieprzetestowana kopia zapasowa) początkowo niezauważone, z czasem urastają do poważnych usterek ograniczających dostępność aplikacji. Gdy baza „się dusi” albo traci dane, nagle okazuje się, że to przecież **krytyczny element systemu** i zaczyna się nerwowe ratowanie sytuacji. [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter)
Załóżmy, że firma nie zatrudniła doświadczonego administratora SQL. Obowiązki rozdzielono między programistę a administratora systemów. Obaj mają ograniczony czas i tylko pobieżną wiedzę o SQL Server. *Na starcie wszystko działa*, więc temat bazy schodzi na dalszy plan. Jednak po kilku miesiącach: zapytania zwalniają, bo nikt nie optymalizował indeksów; baza rośnie, bo nikt nie czyści ani nie archiwizuje danych; kopie zapasowe niby są, ale nikt nie próbował odtworzyć aż do awarii serwera, kiedy okazuje się, że backup jest uszkodzony. Taki scenariusz nie jest teoretyczny to codzienność organizacji, które zlekceważyły złożoność warstwy danych.
**Z biznesowego punktu widzenia**, pomyłka „to tylko DB” może kosztować bardzo dużo. Przykładowo, brak dbałości o bezpieczeństwo bazy to prosta droga do wycieku lub utraty danych. Średni globalny koszt naruszenia danych szacuje się na **3,92 mln USD**, a wykrycie i opanowanie incydentu trwa przeciętnie 279 dni. Ponadto nieplanowane przestoje systemów (spowodowane np. awarią bazy bez posiadania klastra zapasowego) przekładają się na straty finansowe i reputacyjne. Dlatego już na etapie planowania należy traktować bazę danych **jako serce systemu**, a nie black box, który „jakoś będzie działał sam”. [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter)
## 2. Ekosystem SQL Servera nie tylko silnik bazy
Dlaczego SQL Server wymaga specjalistycznej uwagi? Ponieważ to **cały ekosystem usług** do zarządzania danymi. Sam **Database Engine** (silnik bazy danych) to tylko jedna z części choć fundamentalna, bo odpowiada za przechowywanie danych, transakcje, zapytania i integralność. Oprócz tego typowa instancja SQL Servera obejmuje: [\[learn.g2.com\]](https://learn.g2.com/what-is-sql-server)
* **SQL Server Integration Services (SSIS)** narzędzie ETL do ekstrakcji, transformacji i ładowania danych z różnych źródeł. Umożliwia budowę hurtowni danych, migracje i integracje danych między systemami. [\[learn.g2.com\]](https://learn.g2.com/what-is-sql-server)
* **SQL Server Analysis Services (SSAS)** moduł analityczny i OLAP. Służy do tworzenia wielowymiarowych kostek OLAP lub modeli tabelarycznych, na podstawie których można szybko agregować i analizować duże wolumeny danych (Business Intelligence). [\[learn.g2.com\]](https://learn.g2.com/what-is-sql-server)
* **SQL Server Reporting Services (SSRS)** usługa generowania raportów. Pozwala projektować raporty operacyjne i zestawienia menedżerskie pobierające dane z bazy SQL (lub innych źródeł) i publikować je w formie przeglądarkowej, PDF, Excel itp.. [\[learn.g2.com\]](https://learn.g2.com/what-is-sql-server)
* **Master Data Services (MDS)** komponent do zarządzania danymi podstawowymi (słownikowymi) w organizacji. Pomaga utrzymać jednorodność kluczowych słowników (np. tabela Produktów, Klientów) w różnych systemach. [\[learn.g2.com\]](https://learn.g2.com/what-is-sql-server)
* **Data Quality Services (DQS)** narzędzie zapewniające jakość danych. Pozwala profilować i oczyszczać dane (np. wykrywać duplikaty, błędne formaty) w oparciu o reguły biznesowe. [\[learn.g2.com\]](https://learn.g2.com/what-is-sql-server)
* **Replication Services** mechanizmy replikacji transakcji i migawkowej, umożliwiające kopiowanie danych między serwerami (np. do rozproszonej synchronizacji lub tworzenia czytelni danych tylko do odczytu). [\[learn.g2.com\]](https://learn.g2.com/what-is-sql-server)
* **SQL Agent** usługa harmonogramu zadań na serwerze SQL. Automatyzuje cykliczne prace, takie jak kopie zapasowe, indeksowanie, alerty itp. (często niedoceniana część ekosystemu).
* **Always On / Failover Clustering** rozwiązania zapewniające wysoką dostępność (HA) i usuwanie skutków awarii (DR). Always On Availability Groups umożliwiają utrzymanie wielu kopii bazy na różnych serwerach (replika główna + wtórne), z automatycznym przełączeniem w razie awarii. Klastry failover na poziomie instancji z kolei chronią całą instancję SQL.
* **Bezpieczeństwo i audyt** SQL Server oferuje zaawansowane funkcje bezpieczeństwa: szyfrowanie danych (TDE, Always Encrypted), kontrolę dostępu (role, uprawnienia), inspekcję (SQL Audit, trace flags) i mechanizmy ochrony przed atakami (np. **SQL injection**) poprzez odpowiednie procedury i konfigurację. [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter)
* **Monitorowanie i diagnostyka** w skład platformy wchodzą narzędzia do monitoringu wydajności (Profiler w starszych wersjach, *Extended Events*, dynamiczne widoki zarządzające **DMV**). Poprzez nie można śledzić aktywność serwera, blokady, wykorzystanie zasobów oraz diagnozować problemy.
We współczesnych wersjach (SQL Server 2016+ i nowszych) pojawiły się też **Machine Learning Services** integracja z językami R i Python, pozwalająca trenować modele uczenia maszynowego bezpośrednio na serwerze baz danych. W SQL Server 2022 i 2025 Microsoft rozwija podejście „DB jako platforma danych”: np. wprowadza natywne wsparcie dla formatów Big Data (Polygot storage, integracja z Hadoop), obsługę JSON jako pełnoprawnego typu danych czy streaming zdarzeń do chmury (np. *Change Data Capture* do Azure Event Hubs). Wszystko to oznacza, że SQL Server stał się **centralnym hubem danych** łączy cechy bazy OLTP, hurtowni, silnika analitycznego i platformy AI. [\[learn.g2.com\]](https://learn.g2.com/what-is-sql-server) [\[sqlservercentral.com\]](https://www.sqlservercentral.com/blogs/sql-server-2025-not-just-a-database-a-data-engine-reimagined)
Z powyższego przeglądu widać jasno: **SQL Server to rozległy ekosystem**. Aby w pełni wykorzystać jego możliwości (i uniknąć kłopotów), potrzeba wiedzy z wielu obszarów: projektowania baz relacyjnych, programowania T-SQL, administracji systemowej, bezpieczeństwa, a nawet BI. **Błędem jest myślenie, że wystarczy go „zainstalować i zostawić”** domyślna konfiguracja działa poprawnie tylko w prostych scenariuszach, a i tak nie jest zoptymalizowana. Profesjonalna administracja polega na dostrojeniu tego ekosystemu do potrzeb danej aplikacji i firmy.
## 3. Przypadkowy administrator typowe błędy i zaniedbania
Gdy obowiązki DBA pełni osoba bez doświadczenia (nasz *przypadkowy admin*), pewne **błędy powtarzają się szczególnie często**. Nie wynika to ze złej woli, ale z braku świadomości dobrych praktyk. Oto najczęstsze potknięcia „DBA z przypadku”:
* **Brak całościowej strategii backupów i DR:** Początkujący administratorzy często ograniczają się do podstawowych kopii zapasowych (np. tylko pełne backupy bazy raz na dobę), **nie testując odtwarzania** ani nie uwzględniając wymogów biznesu. Może brakować backupów binarnych logów transakcyjnych, kopii konfiguracji czy planu awaryjnego na wypadek awarii serwera. W efekcie przy awarii odzyskanie danych w wymaganym czasie (RTO) lub z minimalną utratą (RPO) bywa niemożliwe. Zdarza się, że dopiero katastrofa ujawnia np. brak backupu kluczowej bazy lub uszkodzone pliki kopii zapasowej. [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas)
* **Korzystanie z ustawień domyślnych:** Domyślna instalacja SQL Server działa, ale nie jest od razu gotowa na produkcję. Przykładowo, **domyślny model odzyskiwania** bazy to *Full* (pełny) jeśli admin tego nie wie i nie zleci regularnych backupów logu transakcyjnego, log będzie rósł bez kontroli aż zapełni dysk. Inny przykład to **niski domyślny limit pamięci** niepodniesienie go sprawi, że serwer nie wykorzysta dostępnego RAM, działając poniżej optymalnej wydajności. Lista takich ustawień (ilosć plików TempDB, brak planu konserwacji indeksów, brak powiadomień alertów itp.) jest długa. Niestety *„przypadkowi DBA”* często nie zmieniają konfiguracji po instalacji, ufając niewłaściwie wartościom domyślnym. [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas) [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas), [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas)
* **Ignorowanie konserwacji bazy (maintenance):** Aby baza działała długo sprawnie, wymaga okresowych prac porządkowych. Typowe zadania to **reorganizacja lub odbudowa indeksów**, **aktualizacja statystyk optymalizatora**, **DBCC CHECKDB** (sprawdzanie integralności) czy oczyszczanie zbędnych danych. Niedoświadczony administrator może nie wiedzieć o tych czynnościach lub odkładać je, dopóki problem sam nie da znać (np. spadkiem wydajności). Brak dbałości o indeksy prowadzi do ich fragmentacji i spowolnienia zapytań, a zaniedbanie statystyk skutkuje złymi planami zapytań i np. nadmiernym obciążeniem CPU czy pamięci. Ignorowanie **DBCC CHECKDB** bywa szczególnie groźne uszkodzenia danych pozostają niewykryte, a potem okazuje się, że backupy również zawierają korupcję, uniemożliwiając pełne przywrócenie bazy. [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter)
* **Brak monitoringu i proaktywnego nadzoru:** Przypadkowi administratorzy działają często „po omacku” skupiają się na bieżącym działaniu aplikacji, nie wdrażając narzędzi monitorujących parametry pracy serwera SQL. W praktyce brakuje alertów na niski wolny obszar dysku, na rosnący czas wykonania zapytań czy blokady. Nie ma **ustalonej metody diagnostyki** problemy rozwiązuje się ad hoc. To powoduje, że **małe symptomy są przeoczone**, a reaguje się dopiero, gdy użytkownicy zgłaszają poważny kłopot. Brak podejścia *troubleshooting* skutkuje wolniejszym rozwiązywaniem incydentów i może prowadzić do dłuższych przestojów. [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas)
* **„Zabezpieczenia przyjdą później”:** Często bezpieczeństwo bazy jest traktowane po macoszemu. Konto administratora (sa) bywa zostawione z domyślnym hasłem lub co gorsza aplikacja łączy się do bazy jako **użytkownik sysadmin**. Uprawnienia nadawane są hurtowo („dbo na wszystko”) zamiast modelu najmniejszych uprawnień. *Accidental DBA* może też nie śledzić aktualnych poprawek bezpieczeństwa SQL Servera, odkładając aktualizacje na potem. To wszystko otwiera drogę atakom: niezałatane instancje są podatne np. na znane exploity, zaś brak walidacji danych w aplikacji umożliwia ataki SQL Injection. Konsekwencje bywają katastrofalne od wycieku danych po całkowite skasowanie bazy przez złośliwy kod. [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas)
* **Indeksy i zapytania either/or:** Deweloperzy pełniący rolę DBA miewają też problemy z optymalizacją zapytań i indeksów. Często błędnie zakładają, że **„silny serwer uciągnie wszystko”**, więc nie analizują planów zapytań. Tymczasem brak kluczowych indeksów lub tworzenie ich w złych miejscach dramatycznie wpływa na szybkość działania aplikacji. Typowe błędy to: brak indeksów na kolumnach używanych w JOIN/WHERE, *nadmiarowe indeksy* spowalniające modyfikacje, nieusuwanie **nieużywanych indeksów**. Profesjonalni DBA wiedzą, że trzeba balansować — monitorować użycie indeksów i reagować na zmiany w obciążeniu. Przypadkowy admin często odkrywa te kwestie dopiero, gdy użytkownicy zgłaszają, że „raporty się nie generują” albo aplikacja „wisi”.
* **Brak izolacji środowisk i kontroli zmian:** Niedoświadczeni opiekunowie baz zdarza się, że dokonują zmian bezpośrednio na produkcji (np. zmieniają schemat tabeli w locie, bez testów). Brakuje procesu **Dev/Test/Prod** dla bazy skrypty nie są wersjonowane w kontroli źródła, a migracje struktury wykonuje się manualnie. To rodzi chaos: trudno odtworzyć kto i kiedy zmienił strukturę albo przywrócić poprzedni stan po błędnej modyfikacji.
**Podsumowując**, *accidental DBA* skupia się na tym, by „baza działała” tu i teraz. Długofalowe aspekty wydajność za pół roku, odtwarzanie po awarii, konsekwencje rosnącej liczby użytkowników, zgodność z politykami bezpieczeństwa schodzą na dalszy plan (czasem z braku wiedzy, czasem z braku czasu). To, co odróżnia działania przypadkowego administratora od profesjonalisty, najlepiej widać w bezpośrednim zestawieniu.
### 📊 Porównanie: przypadkowy administrator vs. profesjonalny DBA
| **Obszar** | **„Przypadkowy” administrator** (niedoświadczony) | **Profesjonalny DBA** (doświadczony) |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Planowanie i architektura** | Traktuje bazę jako czarną skrzynkę; brak zaangażowania w projektowanie modelu danych. Często **brak odrębnego planu** dla warstwy danych, warstwa ta jest dodana na końcu projektu. | Angażuje się od początku w architekturę danych. Projektuje **model bazy, indeksy i warstwę dostępu** tak, by spełniały wymagania aplikacji. Planuje skalowanie, pojemność i integrację z resztą systemu. |
| **Kopie zapasowe i odtwarzanie (DR)** | Ustawia podstawowe backupy, *nie testuje* odtwarzania. Może brakować strategii RPO/RTO dopóki nic się nie stanie, zakłada że „backupy są, więc jest ok”. **Brak testów** = niepewność co do skuteczności przywracania [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas). | Definiuje politykę backupów zgodnie z potrzebami biznesu (RPO/RTO). Regularnie **testuje odtwarzanie** (pełne i częściowe) i **dokumentuje plan DR**. Zna czasy potrzebne na recovery. Zapewnia redundantne kopie (np. off-site) i ćwiczy scenariusze awaryjne. |
| **Wysoka dostępność (HA)** | Często niezaimplementowana jedna instancja serwera bez zapasowych mechanizmów. Liczy, że awarie się nie zdarzą. W razie poważnej usterki długi przestój. | Wdraża rozwiązania **HA** odpowiednie do wymagań (np. klaster **Always On** lub mirroring). Konfiguruje monitorowanie failover. Omawia z biznesem wymaganą dostępność (ilość „9”) i **balansuje koszt vs. ryzyko** [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter). |
| **Wydajność i optymalizacja** | Działa reaktywnie: **interweniuje przy spadku wydajności**, zwykle poprzez dodanie sprzętu lub doraźne zmiany. Nie prowadzi ciągłego tuningowania. Często pozostawia ustawienia domyślne (np. nie zmienia MAXDOP, cost threshold). | Prowadzi **ciągły tuning**: monitoruje kluczowe zapytania, analizuje plany i wprowadza usprawnienia (indeksy, refaktoryzacja SQL). Ustawia parametry instancji pod obciążenie (pamięć, wątki, TempDB). **Kieruje się metrykami** i trendami obciążenia, planując przyszłe potrzeby. |
| **Monitorowanie i automatyzacja** | Ograniczone monitorowanie reaguje, gdy użytkownicy zgłoszą problem. Rzadko ma automatyczne alerty na błędy czy wydajność. Mało automatyzacji wiele zadań (backupy, reorganizacja indeksów) wykonywanych ręcznie lub wcale. | Korzysta z **narzędzi monitorujących** (wbudowanych lub zewnętrznych). Ma skonfigurowane alerty (np. brak backupu, niski wolny dysk, długo trwające zapytanie). Automatyzuje rutynowe zadania przez SQL Agent lub skrypty (backupy, maintenance, raporty). Dzięki temu wcześniej wychwytuje anomalie i szybciej reaguje. |
| **Bezpieczeństwo i aktualizacje** | Może **zaniedbywać aktualizacje** serwera SQL (obawa przed zmianami) serwer pozostaje z lukami bezpieczeństwa. Konfiguracja bezpieczeństwa uproszczona: jedna wspólna login dla aplikacji o szerokich uprawnieniach, brak szyfrowania, brak audytu. | **Regularnie patchuje** SQL Server (po testach). Stosuje zasadę **minimalnych uprawnień** każde konto ma dostęp tylko do potrzebnych danych [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter). Wdraża szyfrowanie danych wrażliwych i mechanizmy audytu logowań oraz operacji uprzywilejowanych. Dba o kopie bezpieczeństwa haseł i kluczy szyfrujących. |
| **Dokumentacja i procesy** | Dokumentacja szczątkowa lub żadna. Wiedza o konfiguracji bazy „w głowie” administratora. Brak ustalonych procesów wdrażania zmian (często zmiany na produkcji ad hoc). | **Dokumentuje** środowisko: konfiguracje, konta, harmonogram zadań, zależności aplikacji. Ustala procesy change management dla bazy (np. *migracje* wersjonowane, zatwierdzanie zmian schematu przed wdrożeniem). Dba o to, by wiedza nie była single point of failure dzieli się nią z zespołem. |
*(Źródło: Opracowanie własne na podstawie doświadczeń i zaleceń dla DBA m.in. w **DNSstuff** i **SolarWinds**)* [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter), [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter)
Jak widać, doświadczony DBA działa **proaktywnie** i metodycznie, podczas gdy osoba przypadkowa zwykle ogranicza się do działań reaktywnych i „gaszenia pożarów”. Wiele błędów popełnianych przez niedoświadczonych administratorów wynika nie z braku zdolności, lecz z braku czasu i narzędzi próbują oni łączyć tę rolę z innymi obowiązkami IT. W rezultacie łatwo pomijają *„małe rzeczy”*, które u profesjonalisty są na checklistach (np. cotygodniowy test odtwarzania backupu, comiesięczny przegląd uprawnień, kwartalna aktualizacja serwera itp.). Niestety, pominięcia te kumulują się, a gdy wywołają kryzys, firma często decyduje się jednak sięgnąć po eksperta.
## 4. Jak unikać typowych błędów? Dobre praktyki
Świadomość opisanych pułapek to pierwszy krok. Co zatem zrobić, by nie wpaść w scenariusz „pomyłki nr 0” i **nie produkować kolejnych przypadkowych administratorów**? Kluczowe zalecenia to:
* **Uwzględniaj bazę w planie projektu:** Już na etapie inicjowania projektu IT załóż, że warstwa danych wymaga osobnej atencji. Zaplanuj **role i zasoby**: kto zaprojektuje schemat bazy? Kto zadba o wydajność zapytań? Kto będzie utrzymywał bazę po wdrożeniu? Idealnie w zespole projektowym powinien znaleźć się specjalista od baz (lub skonsultować krytyczne decyzje z zewnętrznym ekspertem). Koszt zaangażowania DBA od początku zwróci się wielokrotnie dzięki uniknięciu kosztownych przeróbek i problemów w przyszłości.
* **Zadbaj o szkolenie „przypadkowych DBA”:** Jeśli już masz w firmie sytuację, że deweloper lub kto inny musi pełnić rolę admina bazy, **zainwestuj w ich rozwój**. Dostępne są dedykowane kursy i materiały dla *Accidental DBA* uczą one praktycznego minimum: od podstaw administracji SQL Server (architektura, backupy, logi, indeksy) po narzędzia diagnostyczne. Wdrożenie takiej osoby w dobre praktyki może szybko poprawić stan waszej bazy. Warto też rozważyć wsparcie mentoringowe np. okresowe konsultacje z doświadczonym SQL DBA, który sprawdzi konfigurację, doradzi ulepszenia i pomoże ułożyć plan działania. [\[solarwinds.com\]](https://www.solarwinds.com/blog/the-secret-life-of-accidental-dbas), [\[linkedin.com\]](https://www.linkedin.com/pulse/sql-server-accidental-dbas-from-chaos-control-sanket-muley-vtmqf/)
* **Automatyzuj i korzystaj z narzędzi:** Współczesny DBA ma do dyspozycji wiele narzędzi nie trzeba wszystkiego robić ręcznie. Np. **skrypty od społeczności DBA** (jak popularny zestaw *sp\_Blitz* od Brent Ozar) automatycznie diagnozują dziesiątki typowych problemów konfiguracji i wydajności. Narzędzia monitorujące potrafią wysyłać alarmy o nieprawidłowościach, zanim użytkownicy je odczują. Wreszcie, wykorzystaj SQL Agent do harmonogramu zadań nawet prosty **plan automatyczny**: backup co noc + indeksy/statystyki co weekend + checkDB co miesiąc, znacząco podniesie bezpieczeństwo i wydajność środowiska. Innymi słowy, pozwól technologii wspierać Cię tam, gdzie to możliwe DBA „pracują mądrzej, nie ciężej” właśnie dzięki automatyzacji. [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas)
* **Wprowadź procesy DevOps dla bazy:** Baza danych nie powinna być wyjątkiem w podejściu **CI/CD**. Stosuj *kontrolę wersji* dla skryptów baz danych (schemat, procedury, funkcje) tak samo jak dla kodu aplikacji. Każda zmiana w bazie (migracja) powinna przechodzić przez środowisko testowe zanim trafi na produkcję. Takie podejście zmniejsza ryzyko błędów oraz pozwala nowym osobom w zespole zrozumieć historię zmian w bazie. Nowoczesne narzędzia (np. migracje EF, Flyway, SSDT) potrafią zintegrować zmiany bazy z pipelinem wydawniczym. Dzięki temu unikniesz „tajemniczych” różnic między środowiskami i zapewnisz spójność. [\[manning.com\]](https://www.manning.com/books/100-sql-server-mistakes-and-how-to-avoid-them)
* **Dokumentuj i dziel się wiedzą:** Dobra dokumentacja *nie jest luksusem* to część profesjonalnego utrzymania. Spisz gdzie trzymane są backupy i jak je odtwarzać, jakie konta mają dostęp do bazy, jakie zadania są zaplanowane (joby) i co robią. W przypadku audytu czy nagłej zmiany personelu, taka dokumentacja bywa wybawieniem. Ponadto, opisanie własnymi słowami konfiguracji czy procesu backupu działa edukacyjnie dla samego administratora pomaga uporządkować wiedzę i dostrzec ewentualne luki. Upewnij się, że więcej niż jedna osoba w firmie orientuje się w podstawach działania waszego SQL Servera (np. poprzez wewnętrzne prezentacje, sesje wiedzy). To zmniejsza ryzyko, że „jedyna osoba znająca bazę” stanie się wąskim gardłem. [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter)
* **Korzystaj ze wsparcia społeczności i producenta:** Ekosystem SQL Servera posiada ogromną społeczność ekspertów dzielących się wiedzą (fora, blogi, konferencje, grupy **PASS**). Istnieją również oficjalne **najlepsze praktyki Microsoftu** oraz podręczniki (np. *SQL Server Best Practices*, *SQL Infrastructure Planning*). Regularnie konsultuj swoje działania z tymi źródłami. Często problem, z którym się borykasz, ktoś już opisał i rozwiązał. Szczególnie dla *accidental DBA* bez formalnego zaplecza, społeczność jest bezcenna pozwala uczyć się od tych, którzy przeszli podobną drogę.
Wdrożenie powyższych kroków stopniowo **przekształci „przypadkowego” admina w świadomego opiekuna bazy**. Organizacja zaś zyska stabilniejsze i bezpieczniejsze środowisko danych. Warto zaznaczyć, że wiele z tych praktyk jest uniwersalnych i odnosi się nie tylko do SQL Servera, ale do **wszystkich relacyjnych baz danych**.
## 5. Wyzwania nowoczesnego środowiska SQL Server
Świat IT ewoluuje, zatem rola DBA i podejście do baz danych też się zmienia. Współczesne środowiska często odbiegają od klasycznego układu „aplikacja + baza na jednym serwerze w serwerowni”. Pojawiły się nowe **trendy i wyzwania**, którym musi sprostać zarówno SQL Server, jak i jego administratorzy:
* **Chmura i rozwiązania hybrydowe:** Coraz więcej baz danych działa w chmurze (Azure, AWS) lub w modelu hybrydowym (część zasobów on-premises, część w chmurze). Platforma SQL Server dostosowała się do tego trendu mamy usługę *Azure SQL Database* czy *Azure SQL Managed Instance*, a także możliwość uruchamiania SQL Server na maszynach w chmurze. Dla administratora oznacza to **nowy zakres kompetencji**: trzeba rozumieć modele usług (IaaS vs PaaS), umieć zapewnić bezpieczeństwo i wydajność w środowisku zautomatyzowanym przez dostawcę oraz **kontrolować koszty**. Przykładowo, w chmurze każde zapytanie może przekładać się na opłatę (model pay-as-you-go), co sprawia, że tuning wydajności ma bezpośredni wymiar finansowy zoptymalizowanie kilku ciężkich zapytań może obniżyć rachunek miesięczny, co doceni dyrekcja finansowa. Wyzwaniem jest też integracja środowisk: np. synchronizacja danych między bazą on-prem a chmurą (tu z pomocą przychodzą funkcje jak Azure Arc, replikacje, czy usługi integracyjne). [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter)
* **Skalowanie i Big Data:** Dzisiejsze aplikacje generują niespotykane dotąd wolumeny danych. DBA musi planować **skalowalność** zarówno skalowanie w pionie (mocniejsze serwery, więcej rdzeni, więcej pamięci), jak i w poziomie (partycjonowanie danych, rozpraszanie obciążeń na replikach, cache poza bazą). SQL Server 2019 wprowadził koncepcję *Big Data Clusters* integrującą **Hadoop/Spark** choć niszowa, pokazuje kierunek, w którym baza relacyjna współpracuje z nierelacyjnymi magazynami danych. Nawet jeśli nie używamy tych technologii, typowy DBA coraz częściej współdziała z zespołami od data science czy big data, zapewniając im zasilanie danymi. Trzeba rozumieć koncepcje **Data Lake, strumieni przetwarzania (Kafka)**, by efektywnie wpiąć SQL Server w architekturę danych firmy. Przykład nowości: SQL Server 2022+ potrafi publikować strumienie zmian danych (CDC) do Event Hubów czy obsługiwać zewnętrzne źródła przez PolyBase to pokazuje, że baza staje się elementem większego ekosystemu real-time data. [\[sqlservercentral.com\]](https://www.sqlservercentral.com/blogs/sql-server-2025-not-just-a-database-a-data-engine-reimagined)
* **Polityki bezpieczeństwa i zgodność (compliance):** W dobie regulacji typu GDPR, HIPAA, itp., dbałość o dane to nie tylko kwestia techniczna, ale i prawna. **Nowoczesny DBA** musi ściśle współpracować z działami bezpieczeństwa i zgodności. Przykładowo, jeśli baza zawiera dane osobowe, wymagane może być szyfrowanie *dynamiczne* (Always Encrypted) tak, by nawet administrator bazy nie widział danych wrażliwych w czystej postaci. Trzeba zapewnić mechanizmy anonimizacji, kontrolować kto i kiedy ma dostęp (audit trail). SQL Server dostarcza narzędzia np. funkcjonalność **Data Masking** czy wspomniany Audit ale ich skuteczne użycie wymaga wiedzy i stałego nadzoru. Wyzwanie stanowi też **częste zastosowanie kilku różnych technologii naraz** dane mogą płynąć między SQL Server, bazami NoSQL, usługami chmurowymi a wszędzie muszą zachować odpowiednią ochronę. Dbanie o to to teraz część roli DBA.
* **DevOps i ciągłe dostarczanie:** Tempo wytwarzania oprogramowania przyspieszyło dzięki metodykom Agile/DevOps. Baza danych musi nadążyć. W praktyce coraz częściej **zmiany w bazie wdrażane są kilka razy w tygodniu**, automatycznie, wraz z nowymi wersjami aplikacji. Dla administratora oznacza to konieczność zaufania automatyzacji, ale też przygotowania odpowiednich **testów** szczególnie regresyjnych dla wydajności. Każda zmiana indeksu czy procedury może potencjalnie pogorszyć działanie innej części aplikacji. Dlatego DBA staje się strażnikiem jakości: powinien uczestniczyć w code review zapytań SQL, ustalać standardy (np. unikanie konstrukcji powodujących blokady, stosowanie indeksów pokrywających itp.), a także wykorzystywać środowiska stagingowe do symulacji obciążenia przed puszczeniem zmiany na produkcję. Ponadto, praktyki *Infrastructure as Code* obejmują już bazę skrypty konfiguracyjne (np. ustawienia serwera) również można trzymać jako kod i wersjonować, co zwiększa powtarzalność i spójność konfiguracji w różnych środowiskach. [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas)
* **Wielo-platformowość baz danych:** Wspomnieliśmy, że firma może używać różnych systemów baz danych jednocześnie. Często spotyka się środowiska mieszane: **Microsoft SQL Server obok PostgreSQL czy MySQL**, a w korporacjach również **Oracle**. Dla zespołu IT oznacza to potrzebę posiadania kompetencji w różnych technologiach lub bardzo precyzyjnego podziału obowiązków. *Przypadkowy administrator* staje przed niemal niemożliwym zadaniem, gdy ma jednocześnie zarządzać kilkoma różnymi bazami **nawet doświadczeni DBA przyznają, że ciężko być ekspertem od wszystkich jednocześnie**. Dlatego tak ważne jest zrozumienie, że **każda platforma baz danych ma swoją złożoność** i dedykowany zestaw dobrych praktyk. Oracle słynie z rozbudowanych opcji (RAC, Data Guard, GoldenGate) i od zawsze wymagał wyspecjalizowanych administratorów mało kto odważy się powiedzieć „Oracle to tylko baza, nie potrzebujemy DBA”. Z kolei **MySQL czy PostgreSQL** bywają w małych projektach stawiane i obsługiwane przez deweloperów (bo open-source i prosty start), ale w miarę skalowania również one wymagają profesjonalnego podejścia: konfiguracji parametrów, tuningu zapytań, replikacji master-slave czy klastrów typu Galera, regularnych *VACUUM* (w Postgres) itp. Innymi słowy, **nie istnieje „magicznie łatwa” baza danych**, której można w ogóle nie administr ować. Różnice polegają raczej na dostępnych narzędziach i społeczności. Microsoft ułatwia życie DBA bogatym ekosystemem narzędzi graficznych i integracją Windows, podczas gdy przy Postgresie czy MySQL DBA częściej sięga po skrypty i narzędzia open-source. Jednak cel jest wspólny: zapewnić niezawodne, bezpieczne i wydajne przechowywanie danych. Firmy powinny mieć tego świadomość planując swoje zasoby nawet jeśli dziś obywa się bez dedykowanego DBA, jutro przy większej skali ten specjalista może okazać się niezbędny. [\[solarwinds.com\]](https://www.solarwinds.com/blog/the-secret-life-of-accidental-dbas)
## 6. Podsumowanie baza danych to **fundament**, nie dodatek
Ignorowanie złożoności systemów baz danych jest jak budowanie domu na piasku. **Baza danych to fundament aplikacji:** odpowiada za to, że dane są poprawne, dostępne na czas i bezpieczne. Jeśli ten fundament jest źle zaprojektowany lub zaniedbany, cały system prędzej czy później zacznie pękać czy to pod ciężarem użytkowników, czy w obliczu incydentu.
Pomyłka numer zero myślenie, że „to tylko baza” skutkuje szeregiem dalszych błędów, które szczegółowo omówiliśmy. Projekty, które na starcie nie inwestują w architekturę danych i kompetentne zarządzanie bazą, wypłacają „techniczny dług” z nawiązką w późniejszych etapach. Często objawia się to właśnie tym, że ktoś nieplanowanie staje się *DBA z przypadku*, próbując leczyć skutki niedociągnięć projektu. Tak rodzą się „przypadkowi administratorzy” często bohaterowie drugiego planu, którzy w trudzie utrzymują systemy przy życiu, ale z racji ograniczeń mogą nie zapobiec pewnym błędom.
Z drugiej strony pokazaliśmy, że istnieją sprawdzone praktyki i narzędzia, które pozwalają te błędy eliminować. Podstawą jest **świadomość** zrozumienie, że baza danych wymaga tak samo profesjonalnego podejścia jak warstwa aplikacji. Dalej idą: odpowiednie zasoby ludzkie (dobry DBA lub przeszkolenie kogoś do tej roli), procesy (backupy, monitoring, DevOps dla DB) i wykorzystanie pełni możliwości oferowanych przez nowoczesny SQL Server.
Na koniec warto zaznaczyć pozytywny aspekt: kiedy baza danych jest dobrze zarządzana, staje się ogromnym **atutem konkurencyjnym** dla firmy. Szybki dostęp do informacji, brak przestojów, pewność co do integralności danych to wszystko przekłada się na zadowolenie użytkowników i sprawność biznesu. **Profesjonalny DBA** często pozostaje w cieniu, bo jeśli robi wszystko dobrze, „nic złego się nie dzieje” a firma może nawet nie odczuwać, ile problemów zostało w zarodku rozwiązanych. Jak ujął to ekspert Kevin Kline, **wiele poważnych błędów bazodanowych wynika nie z braku umiejętności technicznych, lecz z zaniedbań procesowych i biznesowych**. Odrobina przewidywania i stosowanie najlepszych praktyk czyni różnicę między chaosem a stabilnością. [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas)
**Konkluzja:** Baza danych *nigdy* nie jest „tylko bazą”. To skomplikowany organizm część większego ekosystemu który wymaga troski i kompetencji. Firmy, które to rozumieją, inwestują w architekturę danych i specjalistów, zbierają owoce w postaci bezawaryjnych, wydajnych systemów. Te zaś, które popełniają *pomyłkę numer zero*, prędzej czy później muszą zainwestować wielokrotność oszczędności w gaszenie pożarów. Lepiej więc od początku budować solidne podstawy, bo w świecie danych **jakość fundamentu decyduje o trwałości całej konstrukcji**. [\[dnsstuff.com\]](https://www.dnsstuff.com/top-10-sql-server-mistakes-made-by-dbas), [\[dnsstuff.com\]](https://www.dnsstuff.com/5-common-challenges-companies-without-a-dba-encounter)
Świetnie — poniżej dodaję **porównanie SQL Server ↔ PostgreSQL ↔ Oracle ↔ MySQL**, tak aby uzupełniało Twoje artykułowe kompendium „dlaczego to nie jest tylko baza danych”. Na końcu znajdziesz też **drugą tabelę**: przekrojowe zestawienie typowych błędów i wymaganych kompetencji *per platforma*, aby łatwiej było rozpoznać ryzyka w środowiskach mieszanych.
***
## Porównanie platform: architektura, HA/DR, backupy, bezpieczeństwo, monitoring
### 1) Architektura i dzienniki transakcyjne
* **SQL Server** transakcyjność oparta o **Transaction Log**; model odzyskiwania (*SIMPLE/FULL/BULK LOGGED*). Błędy „domyślnych ustawień” (np. FULL bez harmonogramu backupów logu) prowadzą do „puchnięcia” logu i zapełnienia dysku. Silne wsparcie dla JSON, in-memory OLTP, integracje BI (SSIS/SSAS/SSRS) i nowoczesnych funkcji (CDC/streaming, ML Services)【12†L58-L69】【10†L26-L34】.
* **PostgreSQL** **WAL (Write-Ahead Log)**; brak natywnego „diff/log backup” jak w SQL Server, odtwarzanie opiera się o bazowe kopie + archiwizację WAL. Krytyczne są mechanizmy **autovacuum/analyze** (usuwanie martwych wersji), bez nich szybko narasta bloat i spada wydajność.
* **Oracle** **Redo/Archive Log**; wieloletni, rozbudowany stos (ASM, RMAN, Data Guard, RAC). Modele CDB/PDB (multitenant). Bogaty zestaw narzędzi do odzyskiwania, flashback, izolacji i audytu.
* **MySQL (InnoDB)** **Redo/Undo + Binary Log (binlog)**; różne tryby replikacji (statement/row), ważne rozumienie różnic między mysqldump/XtraBackup i PITR z binloga. Typowe błędy: brak WHERE przy DML, zła konfiguracja backupów, zbyt agresywne pule połączeń【17†L10-L21】【17†L28-L45】.
### 2) HA/DR (wysoka dostępność i usuwanie skutków awarii)
* **SQL Server** **Always On Availability Groups** i/lub **Failover Clustering**; rozróżnienie **HA vs DR** jest krytyczne (HA chroni lokalnie, DR — na poziomie ośrodka) oraz dopasowanie RPO/RTO i wymagań dostępności („ilość dziewiątek”)【8†L72-L88】【23†L18-L26】.
* **PostgreSQL** **Streaming replication** + orkiestracja (np. **Patroni**, **pg\_auto\_failover**, BDR); DR przez archiwizację WAL do obszarów zewnętrznych i testy odtworzeń.
* **Oracle** **Data Guard** (DR), **RAC** (HA poziomu klastra instancji); scenariusze Active/Standby, switchover/failover, często z warstwą ASM.
* **MySQL** **Group Replication/InnoDB Cluster** (HA), **Percona XtraDB Cluster/Galera** (multi-master), DR przez binlog + replikacje.
### 3) Kopie zapasowe i odtwarzanie
* **SQL Server** **Full/Differential/Log** + testy odtwarzania; częsty błąd: backupy bez weryfikacji i brak testów pełnego „ground-up restore” (niepewne RPO/RTO)【13†L107-L116】.
* **PostgreSQL** **pg\_basebackup/pgBackRest** + archiwizacja **WAL**; PITR przez odtworzenie kopii bazowej i odtworzenie WAL do wskazanego punktu.
* **Oracle** **RMAN** jako standard; **Flashback** do błyskawicznego odwracania wybranych operacji; backupy kontrolowane przez polityki retencji i archiwizacji.
* **MySQL** **mysqldump** (logiczne) lub **Percona XtraBackup** (fizyczne, bez zatrzymania); PITR przez **binlog**.
### 4) Bezpieczeństwo i zgodność
* **SQL Server** **TDE**, **Always Encrypted**, **Row-Level Security**, **SQL Audit**; standardy twardnienia i audytu w organizacji (m.in. polityki haseł, rozmiary kluczy, minimalizacja powierzchni ataku) są sformalizowane w wewnętrznych dokumentach takich jak [DB-STD-ALL-GSR-0025 Windows SQL Server Hardening Standard\_RELEASED](https://mydnb.sharepoint.com/sites/intranet/Technology/security/DefaultDocuments/DB-STD-ALL-GSR-0025%20Windows%20SQL%20Server%20Hardening%20Standard_RELEASED.pdf?web=1\&EntityRepresentationId=f3715c63-4d40-4bf5-ae39-f8edd3ff457a) (np. zasady szyfrowania AES\_128+ i bezpieczeństwo CLR). [\[Windows SQ...ard - 2023 | PDF\]](https://mydnb.sharepoint.com/sites/intranet/Technology/Databasemanagement/DefaultDocuments/Windows%20SQL%20Server%20Hardening%20Standard%20-%202023.pdf?web=1)
* **PostgreSQL** **RLS (Row-Level Security)**, **pgcrypto**, TLS, listy kontroli dostępu; w naszej organizacji obowiązuje [D\&B-STD-ALL-GSR-0032-PostgreSQL Configuration standard\_RELEASED](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/D\&B-STD-ALL-GSR-0032-PostgreSQL%20Configuration%20standard_RELEASED.pdf?web=1\&EntityRepresentationId=e559b650-2200-4316-b685-cae56a00d913), odwołujący się m.in. do CIS i wymagań IAM/logowania【turn3search55】. [\[D&B-STD-AL...d_RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/D&B-STD-ALL-GSR-0032-PostgreSQL%20Configuration%20standard_RELEASED.pdf?web=1)
* **Oracle** **TDE**, **Virtual Private Database**, **Data Redaction**, Fine-Grained Auditing; bogate możliwości segmentacji i audytu, często w wymagających środowiskach regulowanych.
* **MySQL** szyfrowanie InnoDB-at-rest, TLS, pluginy audytowe; w naszej organizacji obowiązuje [DB-STD-ALL-GSR-0028-MySQL\_Configuration\_standard-RELEASED](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/DB-STD-ALL-GSR-0028-MySQL_Configuration_standard-RELEASED.pdf?web=1\&EntityRepresentationId=80099ca1-1045-4b4e-9ee8-7b6ea7f8fa9e) (m.in. brak ekspozycji do Internetu, IAM, zasada najmniejszych uprawnień). [\[DB-STD-ALL...d-RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/DB-STD-ALL-GSR-0028-MySQL_Configuration_standard-RELEASED.pdf?web=1)
### 5) Monitoring i tuning
* **SQL Server** **DMV/DMF**, **Extended Events**, **SQL Agent**; dobre praktyki monitoringu i progów alertów zdefiniowane w [MS SQL - Monitoring Standards](https://mydnb.sharepoint.com/sites/theHub-Technology/Documents%20Database%20Management/MS%20SQL%20-%20Monitoring%20Standards.pdf?web=1\&EntityRepresentationId=9c1dc9af-69d6-4cc9-9e8a-37cfd7694e78) (np. alerty 80/90% dla dysków i RAM; trending zużycia zasobów). [\[MS SQL - M...Standards | PDF\]](https://mydnb.sharepoint.com/sites/theHub-Technology/Documents%20Database%20Management/MS%20SQL%20-%20Monitoring%20Standards.pdf?web=1)
* **PostgreSQL** **pg\_stat\_statements**, **auto\_explain**, **pg\_stat\_**\*, obserwacja autovacuum i checkpointów.
* **Oracle** **AWR/ASH**, **OEM**, **Statspack**; systemowe raporty wydajności i pełna ścieżka diagnostyczna.
* **MySQL** **performance\_schema**, **sys**, narzędzia Percona; monitoring blokad, długich zapytań, łączności i I/O.
***
## Typowe błędy „accidental DBA” — rozpoznawalne wzorce per platforma
> **Wspólny mianownik:** większość najgroźniejszych błędów wynika z **procesów i organizacji**, nie czystej techniki: brak testów DR, brak podziału ról, zmiany bez kontroli jakości, domyślne ustawienia niewłaściwe dla produkcji【13†L148-L156】.
* **SQL Server:** brak testów restore, pełny model bez backupów logu, „domyślne” TempDB, brak indeks/maintenance, „security później”【13†L52-L60】【13†L143-L147】.
* **PostgreSQL:** zbyt słabe **autovacuum/analyze**, brak archiwizacji WAL, zły sizing checkpointów, brak RLS/TLS i audytu.
* **Oracle:** brak RMAN/Flashback w praktyce, źle dobrany redo/archivelog, ignorowanie Data Guard/RAC i polityk LDAP/IAM.
* **MySQL:** „DELETE bez WHERE”, błędne backupy bez testów, nadmierne pule połączeń, brak indexów/analizy planów【17†L10-L21】【17†L28-L45】.
***
## Tabela: porównanie funkcji i pułapek (platformy)
> **Uwaga:** poniższa tabela agreguje praktykę operacyjną w trybie „co najczęściej ma znaczenie w utrzymaniu”.
| **Obszar** | **SQL Server** | **PostgreSQL** | **Oracle** | **MySQL** |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Logi transakcyjne** | Transaction Log; modele odzyskiwania SIMPLE/FULL/BULK\_LOGGED; PITR przez log backups (częsty błąd: FULL bez log backupów)【13†L143-L147】 | WAL; PITR przez kopię bazową + archiwizację WAL | Redo/Archive Log; Flashback i RMAN | Redo/Undo + Binlog; PITR przez binlog |
| **HA/DR** | Always On AG, Failover Cluster; precyzyjne rozróżnienie HA vs DR jest krytyczne【8†L72-L88】 | Streaming replication + Patroni/pg\_auto\_failover | Data Guard (DR), RAC (HA) | Group Replication/InnoDB Cluster; Percona/Galera |
| **Backup/Restore** | Full/Diff/Log + testy; błąd: brak testów „ground-up”【13†L107-L116】 | pgBaseBackup/pgBackRest + WAL | RMAN + polityki retencji; Flashback | mysqldump/XtraBackup + binlog |
| **Bezpieczeństwo** | TDE, Always Encrypted, RLS, Audit; twardnienie wg [DB-STD-ALL-GSR-0025 Windows SQL Server Hardening Standard\_RELEASED](https://mydnb.sharepoint.com/sites/intranet/Technology/security/DefaultDocuments/DB-STD-ALL-GSR-0025%20Windows%20SQL%20Server%20Hardening%20Standard_RELEASED.pdf?web=1\&EntityRepresentationId=f3715c63-4d40-4bf5-ae39-f8edd3ff457a) [\[DB-STD-ALL...d_RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/theHub-Security/Shared%20Documents/DB-STD-ALL-GSR-0025%20Windows%20SQL%20Server%20Hardening%20Standard_RELEASED.pdf?web=1) | RLS, pgcrypto, TLS; [D\&B-STD-ALL-GSR-0032-PostgreSQL Configuration standard\_RELEASED](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/D\&B-STD-ALL-GSR-0032-PostgreSQL%20Configuration%20standard_RELEASED.pdf?web=1\&EntityRepresentationId=e559b650-2200-4316-b685-cae56a00d913) [\[D&B-STD-AL...d_RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/D&B-STD-ALL-GSR-0032-PostgreSQL%20Configuration%20standard_RELEASED.pdf?web=1) | TDE, VPD, Data Redaction, FGA | Szyfrowanie at-rest, TLS, audyt; [DB-STD-ALL-GSR-0028-MySQL\_Configuration\_standard-RELEASED](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/DB-STD-ALL-GSR-0028-MySQL_Configuration_standard-RELEASED.pdf?web=1\&EntityRepresentationId=80099ca1-1045-4b4e-9ee8-7b6ea7f8fa9e) [\[DB-STD-ALL...d-RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/DB-STD-ALL-GSR-0028-MySQL_Configuration_standard-RELEASED.pdf?web=1) |
| **Monitoring** | DMV/Extended Events; standardy: [MS SQL - Monitoring Standards](https://mydnb.sharepoint.com/sites/theHub-Technology/Documents%20Database%20Management/MS%20SQL%20-%20Monitoring%20Standards.pdf?web=1\&EntityRepresentationId=9c1dc9af-69d6-4cc9-9e8a-37cfd7694e78) (alerty, trending) [\[MS SQL - M...Standards | PDF\]](https://mydnb.sharepoint.com/sites/theHub-Technology/Documents%20Database%20Management/MS%20SQL%20-%20Monitoring%20Standards.pdf?web=1) | pg\_stat\_statements, auto\_explain | AWR/ASH/OEM | performance\_schema, sys |
| **Typowe „accidental”** | Domyślne ustawienia, brak log backupów, brak maintenance, bezpieczeństwo „później”【13†L52-L60】 | Autovacuum/analyze „za słabe”, brak WAL archiving, niekontrolowane checkpointy | Brak RMAN/Flashback w praktyce, DR niećwiczone | DELETE bez WHERE, nadmierne pule, brak testów backupów【17†L10-L21】【17†L28-L45】 |
***
## Tabela: typowe błędy i kompetencje — *accidental DBA* vs **profesjonalny DBA** (uaktualniona o różnice platformowe)
| **Obszar** | **Accidental DBA** | **Profesjonalny DBA** |
| ---------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Backup/DR** | Backupy „jakieś są”, brak testów, nieznane RPO/RTO; mylą HA z DR【13†L107-L116】【8†L72-L80】 | Polityki RPO/RTO ustalone z biznesem; regularne **testy restore**; świadome rozróżnienie HA/DR i dobór rozwiązań |
| **HA** | Jedna instancja „bez awaryjnego”; brak failover | AG/Patroni/Data Guard/Group Replication poprawnie wdrożone; testy przełączeń |
| **Bezpieczeństwo** | „dbo/sysadmin wszędzie”; brak audytu; ekspozycja do public Internet | Zasada najmniejszych uprawnień, szyfrowanie, audyt; w naszej org.: standardy [DB-STD-ALL-GSR-0025 Windows SQL Server Hardening Standard\_RELEASED](https://mydnb.sharepoint.com/sites/intranet/Technology/security/DefaultDocuments/DB-STD-ALL-GSR-0025%20Windows%20SQL%20Server%20Hardening%20Standard_RELEASED.pdf?web=1\&EntityRepresentationId=f3715c63-4d40-4bf5-ae39-f8edd3ff457a), [D\&B-STD-ALL-GSR-0032-PostgreSQL Configuration standard\_RELEASED](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/D\&B-STD-ALL-GSR-0032-PostgreSQL%20Configuration%20standard_RELEASED.pdf?web=1\&EntityRepresentationId=e559b650-2200-4316-b685-cae56a00d913), [DB-STD-ALL-GSR-0028-MySQL\_Configuration\_standard-RELEASED](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/DB-STD-ALL-GSR-0028-MySQL_Configuration_standard-RELEASED.pdf?web=1\&EntityRepresentationId=80099ca1-1045-4b4e-9ee8-7b6ea7f8fa9e) egzekwowane przez IAM/Logging【turn3search42】【turn3search55】【turn3search65】 [\[DB-STD-ALL...d_RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/theHub-Security/Shared%20Documents/DB-STD-ALL-GSR-0025%20Windows%20SQL%20Server%20Hardening%20Standard_RELEASED.pdf?web=1), [\[D&B-STD-AL...d_RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/D&B-STD-ALL-GSR-0032-PostgreSQL%20Configuration%20standard_RELEASED.pdf?web=1), [\[DB-STD-ALL...d-RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/DB-STD-ALL-GSR-0028-MySQL_Configuration_standard-RELEASED.pdf?web=1) |
| **Performance/Tuning** | „Damy więcej CPU/RAM”; brak analizy planów; indeksy ad hoc | DMV/pg\_stat/ASH/PerfSchema + plany; regularny maintenance (SQL: indeksy/statystyki/DBCC; PG: vacuum/analyze; ORA: DBMS\_STATS; MySQL: analyze/optimize) |
| **Procesy/DevOps** | Zmiany „na produkcji”; brak wersjonowania skryptów | CI/CD dla DB; migracje wersjonowane; code review TSQL/PL/SQL |
***
## Co z tego wynika dla Twojej organizacji?
1. **Platforma nie zwalnia z odpowiedzialności.** Każda z czterech technologii ma własne „pułapki” i dobre praktyki — *nie istnieje* „magicznie łatwa baza”, której nie trzeba administr ować.
2. **Standaryzuj i egzekwuj.** Mamy już firmowe standardy:
• [DB-STD-ALL-GSR-0025 Windows SQL Server Hardening Standard\_RELEASED](https://mydnb.sharepoint.com/sites/intranet/Technology/security/DefaultDocuments/DB-STD-ALL-GSR-0025%20Windows%20SQL%20Server%20Hardening%20Standard_RELEASED.pdf?web=1\&EntityRepresentationId=f3715c63-4d40-4bf5-ae39-f8edd3ff457a) (twardnienie, szyfrowanie, audyt)
• [D\&B-STD-ALL-GSR-0032-PostgreSQL Configuration standard\_RELEASED](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/D\&B-STD-ALL-GSR-0032-PostgreSQL%20Configuration%20standard_RELEASED.pdf?web=1\&EntityRepresentationId=e559b650-2200-4316-b685-cae56a00d913) (CIS, IAM, logowanie)
• [DB-STD-ALL-GSR-0028-MySQL\_Configuration\_standard-RELEASED](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/DB-STD-ALL-GSR-0028-MySQL_Configuration_standard-RELEASED.pdf?web=1\&EntityRepresentationId=80099ca1-1045-4b4e-9ee8-7b6ea7f8fa9e) (IAM, sieć, brak ekspozycji publicznej)
• [MS SQL - Monitoring Standards](https://mydnb.sharepoint.com/sites/theHub-Technology/Documents%20Database%20Management/MS%20SQL%20-%20Monitoring%20Standards.pdf?web=1\&EntityRepresentationId=9c1dc9af-69d6-4cc9-9e8a-37cfd7694e78) (alerty, trending zasobów)
— warto w artykule odwołać się do nich jako do punktów kontrolnych w projekcie. [\[DB-STD-ALL...d_RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/theHub-Security/Shared%20Documents/DB-STD-ALL-GSR-0025%20Windows%20SQL%20Server%20Hardening%20Standard_RELEASED.pdf?web=1) [\[D&B-STD-AL...d_RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/D&B-STD-ALL-GSR-0032-PostgreSQL%20Configuration%20standard_RELEASED.pdf?web=1) [\[DB-STD-ALL...d-RELEASED | PDF\]](https://mydnb.sharepoint.com/sites/Policies/Shared%20Documents/DB-STD-ALL-GSR-0028-MySQL_Configuration_standard-RELEASED.pdf?web=1) [\[MS SQL - M...Standards | PDF\]](https://mydnb.sharepoint.com/sites/theHub-Technology/Documents%20Database%20Management/MS%20SQL%20-%20Monitoring%20Standards.pdf?web=1)
3. **Uświadom pomyłkę numer zero.** Cytuj wprost, że „to nie jest tylko baza” — dane są **fundamentem** i wymagają architektury, procesów i ról. Gdy brakuje dedykowanego DBA, ryzyko „reaktywnego utrzymania” rośnie i wcześniej czy później kończy się kosztownym gaszeniem pożarów【23†L8-L15】.
***
### Źródła kontekstowe (do przypięcia w artykule)
* Przegląd komponentów SQL Server i ekosystem BI/ML: \[What Is SQL Server?]
* „Accidental DBA” — charakterystyka i wyzwania: \[SolarWinds: The Secret Life of Accidental DBAs]
* Najczęstsze błędy DBA w SQL Server (procesowe i techniczne): \[DNSstuff: Top 10 SQL Server Mistakes]
* Przykłady błędów w MySQL (Pinal Dave): \[SQLAuthority: Common Mistakes in MySQL]
* HA/DR — rozróżnienie i planowanie w SQL Server: \[Manning: 100 SQL Server Mistakes — FAQ]
***
Jeśli chcesz, mogę **zintegrować te dwie tabele** i krótkie podrozdziały bezpośrednio w Twoim artykule (w odpowiednich miejscach: po sekcji o ekosystemie oraz po sekcji o typowych błędach), tak aby całość była spójna edycyjnie.
View File
@@ -0,0 +1,22 @@
* Migracja bazy LICS z 11g do 19c
** Przygotowania do instalacji
1. instalacja oprogramowania Oracle 11 musi być zainstalowany .NET stary
2. instalacja oprogramowania Oracle 12
3. instalacja oprogramowania Oracle 19c
4. Utworzenie pustej bazy LICS na serwerze docelowym. Baza powinna być utworzona w wersji 11i.
1. Należy bazie docelowej przydzielić 80% pamięci dostępnej na serwerze
2. Należy przydzielić dużo zasobów do FRA, w przeciwnym razie podczas upgrade będzie pojawiał się błąd i operację będzie trzeba powtórzyć
5. Wykonany pełny backup bazy źródłowej
6. Przeniesione pliki backupu na server docelowy
7. odtworzenie bazy LICS na maszynie docelowej - w trybie recovery
1. rman
2. connect target /
3. restore controlfile from 'Z:\backup\LICS_14329_20240701'; -> nalezy wprowadzić poprawny plik z controlfile
4. alter database mount;
5. catalog start with 'Z:\backup'; -> skąd będzie pobierany backup
6. restore database
7. w innej sesji uruchamiamy SQLPlus i wyłączamy plik numer 14
1. alter database datafile 14 offline;
8. recover database using backup controlfile; -> w tym miejscu powinniśmy mieć w odpowiedniej lokalizacji wszystkie pliki logów
9. REM -> nie roimy tego w tym miejsu -> recover database using backup controlfile until cancel;
+27
View File
@@ -0,0 +1,27 @@
# Oracle-Scripts
## Rerpozytoria Oracle na GitHub
[Oracle Examples](https://github.com/oracle/oracle-db-examples)
[Oracle Data Tools](https://github.com/oracle/oracle-db-tools)
[Oracle Sample Schema](https://github.com/oracle/db-sample-schemas)
https://oracle-base.com/dba/scripts
https://oracle-base.com/articles/rac/articles-rac
## Lista skryptów
### Sesje użytkownika
[Top Session](./session/top_sessions.sql)
### Backup
[Backup postęp](./backup/backup_postep.sql)
[Backup RMAN](./backup/backup_rman.sql)
[Klonowanie RMAN](./backup/cloning_rman.md)
@@ -0,0 +1,26 @@
run
{
ALLOCATE CHANNEL ch11 TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET skip inaccessible
FORMAT '/backup/%T_D_%d_DBID_%I_%u_s%s_p%p.bck'
DATABASE
CURRENT CONTROLFILE
FORMAT '/backup/%T_C_%d_DBID_%I_%u.bck'
SPFILE
FORMAT '/backup/%T_S_%d_DBID_%I_%u.bck'
PLUS ARCHIVELOG
FORMAT '/backup/%T_A_%d_DBID_%I_%u_s%s_p%p.bck';
RELEASE CHANNEL ch11;
}
set lines 250 pages 9999
col opname form a40
col operation form a20
col status form a30
alter session set nls_date_format = "YYYY-MM-DD HH24:MI:SS";
 
SELECT sysdate, OPNAME, SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK, start_time, last_update_time, ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE" FROM gV$SESSION_LONGOPS WHERE OPNAME LIKE 'RMAN%' AND OPNAME NOT LIKE '%aggregate%' AND TOTALWORK != 0 AND SOFAR <> TOTALWORK;
@@ -0,0 +1,18 @@
$ rman target / nocatalog
spool log to /tmp/backup.teta.log
run
{
ALLOCATE CHANNEL ch11 TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET skip inaccessible
FORMAT '/backup_teta/%T_D_%d_DBID_%I_%u_s%s_p%p.bck'
DATABASE
CURRENT CONTROLFILE
FORMAT '/backup_teta/%T_C_%d_DBID_%I_%u.bck'
SPFILE
FORMAT '/backup_teta/%T_S_%d_DBID_%I_%u.bck'
PLUS ARCHIVELOG
FORMAT '/backup_teta/%T_A_%d_DBID_%I_%u_s%s_p%p.bck';
RELEASE CHANNEL ch11;
}
@@ -0,0 +1,127 @@
CLONING RMAN FROM A BACKUP IN 10G
[oracle@boss ~]$ cd rmanbackup/
[oracle@boss rmanbackup]$ ls
01nsnp5o_1_1 02nsnp5r_1_1 03nsnp6k_1_1 control_filebkc-1965345038-20121213-01
[oracle@boss rmanbackup]$ vi control_filebkc-1965345038-20121213-01
Now go down and copy the pfile from the backup piece.
Copy the pfile from the backup piece and past it inthe clone db.
[oracle@boss ~]$ mkdir db6
[oracle@boss ~]$ cd db6
[oracle@boss db6]$ mkdir admin oradata
[oracle@boss db6]$ cd admin/
[oracle@boss admin]$ mkdir pfile bdump cdump udump create
[oracle@boss admin]$ cd pfile/
[oracle@boss pfile]$ vi initdb6.ora
[oracle@boss pfile]$ cd ../../oradata/
[oracle@boss oradata]$ mkdir data log ctrl arch
[oracle@boss oradata]$
[oracle@boss oradata]$ ls
arch ctrl data log
[oracle@boss oradata]$
Open the pfile add the db_unique_name=db6.
Change the db_name as same as the source db
background_dump_dest='/home/oracle/db6/admin/bdump/'
compatible='10.2.0'
control_files='/home/oracle/db6/oradata/ctrl/control1.ctrl'
core_dump_dest='/home/oracle/db6/admin/cdump/'
db_name='db2'-- snap db
db_unique_name=db6-- clone db
pga_aggregate_target=500m
sga_target=800m
undo_management='auto'
undo_tablespace='undo'
user_dump_dest='/home/oracle/db6/admin/udump/'
[oracle@boss ~]$ export ORACLE_SID=db6
[oracle@boss ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Dec 13 20:33:39 2012
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to an idle instance.
SQL> startup pfile='/home/oracle/db6/admin/pfile/initdb6.ora' nomount;
ORACLE instance started.
Total System Global Area 838860800 bytes
Fixed Size 1270244 bytes
Variable Size 213913116 bytes
Database Buffers 620756992 bytes
Redo Buffers 2920448 bytes
SQL>
[oracle@boss ~]$ export ORACLE_SID=db6
[oracle@boss ~]$ rman target /
Recovery Manager: Release 10.2.0.4.0 - Production on Thu Dec 13 20:49:35 2012
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: db2 (not mounted)
RMAN> set dbid=1965345038
executing command: SET DBID
RMAN> restore controlfile from '/home/oracle/rmanbackup/control_filebkc-1965345038-20121213-01';
Starting restore at 13-DEC-12
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=35 devtype=DISK
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time:00:00:01
output filename=/home/oracle/db6/oradata/ctrl/control1.ctrl
Finished restore at 13-DEC-12
RMAN> alter database mount;
database mounted
released channel: ORA_DISK_1
RMAN> run
2> {
3> set newname for datafile 1 to '/home/oracle/db6/oradata/data/system.dbf';
4> set newname for datafile 2 to '/home/oracle/db6/oradata/data/undo.dbf';
5> set newname for datafile 3 to '/home/oracle/db6/oradata/data/sysaux.dbf';
6> sql"alter database rename file ''/home/oracle/db2/oradata/log/log1.log'' to
''/home/oracle/db6/oradata/log/log1.log''";
7> sql"alter database rename file ''/home/oracle/db2/oradata/log/log2.log''to
''/home/oracle/db6/oradata/log/log2.log''";
8> restore database;
9> switch datafile all;
10> recover database;
11> }
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
Starting restore at 13-DEC-12
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backupset restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
restoring datafile 00001 to /home/oracle/db6/oradata/data/system.dbf
restoring datafile 00002 to /home/oracle/db6/oradata/data/undo.dbf
restoring datafile 00003 to /home/oracle/db6/oradata/data/sysaux.dbf
channel ORA_DISK_1: reading from backup piece
/u01/app/oracle/product/10.2.0/db_1/dbs/0anspjtv_1_1
channel ORA_DISK_1: restored backup piece 1
piece handle=/u01/app/oracle/product/10.2.0/db_1/dbs/0anspjtv_1_1
tag=TAG20121213T202119
channel ORA_DISK_1: restore complete, elapsed time:00:01:16
Finished restore at 13-DEC-12
datafile 1 switched to datafile copy
input datafile copy recid=4 stamp=801956019
filename=/home/oracle/db6/oradata/data/system.dbf
datafile 2 switched to datafile copy
input datafile copy recid=5 stamp=801956019
filename=/home/oracle/db6/oradata/data/undo.dbf
datafile 3 switched to datafile copy
input datafile copy recid=6 stamp=801956019
filename=/home/oracle/db6/oradata/data/sysaux.dbf
Starting recover at 13-DEC-12
using channel ORA_DISK_1
starting media recovery
archive log thread 1 sequence 3 is already on disk as file
/home/oracle/db2/oradata/log/log1.log
archive log filename=/home/oracle/db2/oradata/log/log1.log thread=1 sequence=3
media recovery complete, elapsed time: 00:00:06
Finished recover at 13-DEC-12
RMAN> alter database open resetlogs;
database opened
RMAN>exit
@@ -0,0 +1,44 @@
TTITLE LEFT '% Completed. Aggregate is the overall progress:'
SET LINE 132
SELECT opname, round(sofar/totalwork*100) "% Complete"
FROM gv$session_longops
WHERE opname LIKE 'RMAN%'
AND totalwork != 0
AND sofar <> totalwork
ORDER BY 1;
TTITLE LEFT 'Channels waiting:'
COL client_info FORMAT A15 TRUNC
COL event FORMAT A20 TRUNC
COL state FORMAT A7
COL wait FORMAT 999.90 HEAD "Min waiting"
SELECT s.sid, p.spid, s.client_info, status, event, state, seconds_in_wait/60 wait
FROM gv$process p, gv$session s
WHERE p.addr = s.paddr
AND client_info LIKE 'rman%';
TTITLE LEFT 'Files currently being written to:'
COL filename FORMAT a50
SELECT filename, bytes, io_count
FROM v$backup_async_io
WHERE status='IN PROGRESS'
/
TTITLE OFF
SET HEAD OFF
SELECT 'Throughput: '||
ROUND(SUM(v.value/1024/1024),1) || ' Meg so far @ ' ||
ROUND(SUM(v.value /1024/1024)/NVL((SELECT MIN(elapsed_seconds)
FROM v$session_longops
WHERE opname LIKE 'RMAN: aggregate input'
AND sofar != TOTALWORK
AND elapsed_seconds IS NOT NULL
),SUM(v.value /1024/1024)),2) || ' Meg/sec'
FROM gv$sesstat v, v$statname n, gv$session s
WHERE v.statistic# = n.statistic#
AND n.name = 'physical write total bytes'
AND v.sid = s.sid
AND v.inst_id = s.inst_id
AND s.program LIKE 'rman@%'
GROUP BY n.name
/
SET HEAD ON
@@ -0,0 +1,5 @@
run
{
set archivelog destination to '/tetap/arch/RFC-543';
restore archivelog from logseq=70108 until logseq=70125;
}
@@ -0,0 +1,70 @@
-- -----------------------------------------------------------------------------------
-- File Name : https://oracle-base.com/dba/script_creation/user_ddl.sql
-- Author : Tim Hall
-- Description : Displays the DDL for a specific user.
-- Call Syntax : @user_ddl (username)
-- Last Modified: 07/08/2018
-- -----------------------------------------------------------------------------------
set long 20000 longchunksize 20000 pagesize 0 linesize 1000 feedback off verify off trimspool on
column ddl format a1000
begin
dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'SQLTERMINATOR', true);
dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'PRETTY', true);
end;
/
variable v_username VARCHAR2(30);
exec :v_username := upper('&1');
select dbms_metadata.get_ddl('USER', u.username) AS ddl
from dba_users u
where u.username = :v_username
union all
select dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA', tq.username) AS ddl
from dba_ts_quotas tq
where tq.username = :v_username
and rownum = 1
union all
select dbms_metadata.get_granted_ddl('ROLE_GRANT', rp.grantee) AS ddl
from dba_role_privs rp
where rp.grantee = :v_username
and rownum = 1
union all
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', sp.grantee) AS ddl
from dba_sys_privs sp
where sp.grantee = :v_username
and rownum = 1
union all
select dbms_metadata.get_granted_ddl('OBJECT_GRANT', tp.grantee) AS ddl
from dba_tab_privs tp
where tp.grantee = :v_username
and rownum = 1
union all
select dbms_metadata.get_granted_ddl('DEFAULT_ROLE', rp.grantee) AS ddl
from dba_role_privs rp
where rp.grantee = :v_username
and rp.default_role = 'YES'
and rownum = 1
union all
select to_clob('/* Start profile creation script in case they are missing') AS ddl
from dba_users u
where u.username = :v_username
and u.profile <> 'DEFAULT'
and rownum = 1
union all
select dbms_metadata.get_ddl('PROFILE', u.profile) AS ddl
from dba_users u
where u.username = :v_username
and u.profile <> 'DEFAULT'
union all
select to_clob('End profile creation script */') AS ddl
from dba_users u
where u.username = :v_username
and u.profile <> 'DEFAULT'
and rownum = 1
/
set linesize 80 pagesize 14 feedback on trimspool on verify on
+215
View File
@@ -0,0 +1,215 @@
#primary database destination folders
echo "enter primary database name"
read primary
mkdir $primary
cd $primary
mkdir admin oradata
cd admin
mkdir pfile create bdump cdump udump
cd ..
cd oradata
mkdir control data log arch
cd
#standby datadase
echo "enter standby database name"
read a
mkdir $a
cd $a
mkdir admin oradata
cd admin
mkdir pfile create bdump cdump udump
cd ..
cd oradata
mkdir control data log arch
cd
#Listener entry for primary and stand by
cd $ORACLE_HOME/network/admin
echo "following listeners currently used"
cat listener.ora |grep SID_LIST_|cut -d "_" -f3
echo "enter new listener name"
read l
for ip in `hostname -i`
do
echo "following ports are curently used in Server"
cat listener.ora | grep PORT|cut -d "=" -f5|cut -c 2-5
echo "port number"
read port
echo "SID_LIST_$l =
(SID_LIST =
(SID_DESC =
(SID_NAME = $primary)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(GLOBAL_DBNAME= $primary)
)
(SID_DESC =
(SID_NAME = $a)
(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)
(GLOBAL_DBNAME= $a)
)
)
$l =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = $ip)(PORT = $port))
))
">> listener.ora
cd
lsnrctl start $l
cd $ORACLE_HOME/network/admin
echo "
$primary =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = $ip)(PORT = $port))
)
(CONNECT_DATA =
(SERVICE_NAME = $primary)
)
)
$a =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.54)(PORT = 1585))
)
(CONNECT_DATA =
(SERVICE_NAME = $a)
)
)
">> tnsnames.ora
cd
tnsping $primary 5
tnsping $a 5
cd $ORACLE_HOME/dbs
echo "enter $primary database password"
read pass1
export ORACLE_SID=$primary
orapwd file=orapw$primary password=$pass1 entries=5 force=y
echo "enter $a database password (must be same as primary database password)"
read pass2
export ORACLE_SID=$a
orapwd file=orapw$a password=$pass2 entries=5 force=y
cd
cd $primary/admin/pfile
echo " db_name=$primary
background_dump_dest='/home/oracle/$primary/admin/bdump/'
core_dump_dest='/home/oracle/$primary/admin/cdump/'
user_dump_dest='/home/oracle/$primary/admin/udump/'
control_files='/home/oracle/$primary/oradata/control/ctrl.ctl'
db_unique_name=$primary
fal_client='$primary'
fal_server='$a'
log_archive_dest_1='location=/home/oracle/$primary/oradata/arch/'
log_archive_dest_2='service=$a'
log_file_name_convert='$a','$primary'
remote_login_passwordfile='exclusive'
sga_target=700m
standby_file_management=auto
standby_archive_dest='/home/oracle/$primary/oradata/arch'
db_file_name_convert='$a','$primary'
" >> init$primary.ora
cd
cd $primary/admin/create/
echo "create database $primary
datafile '/home/oracle/$primary/oradata/data/system.dbf' size 300m
sysaux datafile '/home/oracle/$primary/oradata/data/sysaux.dbf' size 300m
logfile group 1 '/home/oracle/$primary/oradata/log/log1.log' size 10m,
group 2 '/home/oracle/$primary/oradata/log/log2.log' size 10m;" >> $primary.sql
cd
export ORACLE_SID=$primary
sqlplus /nolog << eof
conn sys/$pass1 as sysdba
startup pfile='/home/oracle/$primary/admin/pfile/init$primary.ora' nomount;
@/home/oracle/$primary/admin/create/$primary.sql;
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
create spfile from pfile='/home/oracle/$primary/admin/pfile/init$primary.ora';
conn system/manager
@?/sqlplus/admin/pupbld.sql
conn sys/$pass1
alter database close
alter database archivelog;
shut immediate
startup
conn sys/sys as sysdba
spool on tbs1.sql replace
set heading off
select file_name from dba_data_files;
spool off
shut immediate
eof
cd
cd $a/admin/pfile/
echo " db_name=$primary
background_dump_dest='/home/oracle/$a/admin/bdump/'
core_dump_dest='/home/oracle/$a/admin/cdump/'
user_dump_dest='/home/oracle/$a/admin/udump/'
control_files='/home/oracle/$a/oradata/control/ctrl.ctl'
db_unique_name=$a
fal_client='$a'
fal_server='$primary'
log_archive_dest_1='location=/home/oracle/$a/oradata/arch/'
log_archive_dest_2='service=$primary'
log_file_name_convert='$primary','$a'
remote_login_passwordfile='exclusive'
sga_target=700m
standby_file_management=auto
standby_archive_dest='/home/oracle/$a/oradata/arch'
db_file_name_convert='$primary','$a'
" >> init$a.ora
cd
export ORACLE_SID=$a
conn sys/$pass1 as sysdba
startup pfile='/home/oracle/$a/admin/pfile/init$a.ora' nomount
eof
cd
cd /home/oracle/$primar/oradata/data/
cp * /home/oracle/$a/oradata/data/
cd
export ORACLE_SID=$primary
sqlplus /nolog << eof
conn sys/$pass1 as sysdba
startup mount
alter database add standby logfile group 3 '/home/oracle/$a/oradata/log/log3.log' size 10m;
alter database add standby logfile group 4 '/home/oracle/$a/oradata/log/log4.log' size 10m;
alter database create standby controlfile as '/home/oracle/$a/oradata/control/ctrl.ctl';
eof
cd
export ORACLE_SID=$a
sqlplus /nolog << eof
conn sys/$pass2 as sysdba
alter database mount standby database;
eof
done
@@ -0,0 +1,49 @@
These scripts should work on all versions of PostgreSQL up to 9.4
Most have options to specify host and port.
./<script> -h shows all options
cache_hit_ratio.sh -> Shows the cache hit ration for all databases
cancel_all_queries.sh -> Terminates all queries in progress
check_postgresql_log.sh -> greps the postgres log file for ERROR, WARNING and ref's to pg_hba. You will probably need to edit and adjust the directory path and suffix for your cluster.
columns_of_type_x -> Shows all tables and columns with specific character type
connect_count.sh -> Shows connection count for each database
current_locks.sh -> Shows status for all current locks
current_queries.sh -> Shows information on all current queries, will loop continuously unless -x option is specified. -s option specifies sleeptime, default is 5 secs. -i will ignore <IDLE> queries
database_sizes.sh -> shows size of all databases
filename_tables.sh -> shows physical directory, filename, owner & size for all tables in specified database
flip_database_connect.sh -> Flips state of datallowconn for database
get_trans_min_cnt.sh -> shows transaction count per minute for cluster
groups_users.sh -> shows all groups & members in cluster and if group or user is a superuser
index_bloat.sh -> shows index ration to table size for all indexes of all or specified table in database.
index_comments.sh -> shows comments on all or specified index for database
logins_block.sh -> prevents all non-superusers from future logins. MUST be run as user postgres
logins_allow.sh -> re-allows login access to all normal users. MUST be run as user postgres
pg_backup.sh -> generic backup script for postgres database. You will need to edit and adjust for your needs.
pg_runtime.sh -> shows startup and continuous runtime for the cluster
pg_stat_all_indexes.sh -> shows stats and status of all indexes or just for specified table
pg_stat_all_tables.sh -> shows stats for all or specified table
pg_vacuum_time.sh -> Shows total time to vacuum a database
remove_ctrl.sh -> removes control characters from a script. Useful if script was created on a windows PC and then copied to Linux
role_members.sh -> Shows roles and all members
slony_status.sh -> shows status and lag time of slony cluster. Should be run on master node.
table_column_stats.sh -> shows stats for all columns of specified table
table_comments.sh -> shows comments for all or specified table
table_dependents.sh -> shows foreign key constraints for all or specified table
table_in_functions.sh -> shows all functions that reference specified table
table_in_trogger.sh -> shows all triggerss that reference specified table
tables_and_owners.sh -> shows owners and permits on all tables
tables-filenames.sh -> shows physical directory, filename, owner & size for all tables in specified database
table_sizes.sh -> shows tuple count and size for all or specified table
tablespace_use.sh -> shows tablespace used by all or specified table/index
tables_with_column_name.sh -> shows all tables that have a column name LIKE specified column name
tables_with_FKS.sh -> shows all tables taht have a foreign key constraint
tables_with_no_public_grants.sh -> shows tables that have no public grants (restricted table)
triggers_and_constraints.sh -> shows all triggers and called functions for all or specified table
user_table_access_detail.sh -> shows table access for specified user
user_table_access.sh -> shows permit and position in permit for specified user
@@ -0,0 +1,49 @@
#!/bin/bash
# Shows cache hit ratio for all databases
USER=""
PORT=""
DBNAME="postgres"
usage() {
echo "Usage: $0 [-d <dbname> -h <host> -U <user> -p <port>]"
exit 1
}
while getopts "d:h:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
psql $USER $HOST $PORT $DBNAME <<_EOF_
SELECT pg_stat_database.datname,
pg_stat_database.blks_read,
pg_stat_database.blks_hit,
round((pg_stat_database.blks_hit::double precision
/ (pg_stat_database.blks_read
+ pg_stat_database.blks_hit
+1)::double precision * 100::double precision)::numeric, 2) AS cachehitratio
FROM pg_stat_database
WHERE pg_stat_database.datname !~ '^(template(0|1)|postgres)$'::text
ORDER BY round((pg_stat_database.blks_hit::double precision
/ (pg_stat_database.blks_read
+ pg_stat_database.blks_hit
+ 1)::double precision * 100::double precision)::numeric, 2) DESC;
_EOF_
@@ -0,0 +1,52 @@
#!/bin/bash
usage() {
echo "Usage: $0 [-h <host> -p <port>]"
echo "-p will default to 5432"
exit 1
}
while getopts "h:p:" OPT;
do case "${OPT}" in
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
getver()
{
VER=$(psql -t $HOST $PORT -U postgres <<_QRYVER_
SELECT substring(version() from 12 for 1);
_QRYVER_
)
}
cancel_pids()
{
psql -t $HOST $PORT -U postgres <<_QRYVER_
--SELECT pg_cancel_backend($PID)
SELECT pg_terminate_backend($PID)
FROM pg_stat_activity WHERE pg_backend_pid() <> $PID);
_QRYVER_
}
##### MAIN #####
getveri
declare -i VER
if [ "$VER" -lt 9 ]
then
PID="procpid"
else
PID="pid"
fi
cancel_pids
exit 0;
@@ -0,0 +1,35 @@
#!/bin/bash
# if arguments > 0, set count option
if [ $# -eq 0 ]
then
cntflg='-c'
else
cntflg=''
fi
set $(date '+%m%d')
MMDD=$1
#set $(date)
## if day number less than 10, prefix a '0'
#if [ $3 -le 9 ]
# then
# DD=0${3}
# else
# DD=${3}
#fi
set $(date +%m)
MM=${1}
logdir=/var/log/postgresql/
echo "Current error log is: ${logdir}postgresql.${MMDD}"
echo
echo -n "ERROR: "
grep ${cntflg} -i ERROR ${logdir}postgresql.${MMDD}
echo -n "WARNING: "
grep ${cntflg} -i WARNING ${logdir}postgresql.${MMDD}
echo -n "pg_hba: "
grep ${cntflg} -i pg_hba ${logdir}postgresql.${MMDD}
@@ -0,0 +1,77 @@
#!/bin/bash
# Shows tables and columns that are of type specified
PORT=""
USER=""
COLTYPE="?"
usage() {
echo "Usage: $0 -d <dbname> -t <coltype> [-h <host> -U <user> -p <port>]"
exit 1
}
while getopts "d:t:h:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
t) COLTYPE="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="postgres"
fi
choose_qry ()
{
if [ "$COLTYPE" = "?" ]
then
echo "Usage: $0 -d <dbname> -t <coltype> [-h <host> -U <user> -p <port>]"
echo
echo "Available Data Types"
QRY="SELECT DISTINCT (c.data_type)
FROM information_schema.columns c
ORDER BY c.data_type;"
else
QRY="SELECT quote_ident(c.table_schema) as schema,
quote_ident(c.table_name) as table,
quote_ident(c.column_name) as column,
c.data_type as type,
case when c.data_type LIKE '%char%'
then COALESCE(character_maximum_length::text, 'N/A')
when c.data_type LIKE '%numeric%'
then '(' || c.numeric_precision::text || ', ' || c.numeric_scale::text || ')'
when c.data_type LIKE '%int%'
then c.numeric_precision::text
else COALESCE(character_maximum_length::text, 'N/A')
end as size
FROM information_schema.columns c
WHERE c.table_schema NOT LIKE 'pg_%'
AND c.table_schema NOT LIKE 'information%'
AND c.table_name NOT LIKE 'sql_%'
AND c.data_type LIKE '%$COLTYPE%'
AND c.is_updatable = 'YES'
ORDER BY 1, 2, 3;"
fi
psql $HOST $USER $PORT $DBNAME <<_CODE_
${QRY}
_CODE_
}
choose_qry
@@ -0,0 +1,131 @@
#!/bin/bash
DBNAME="postgres"
USER="-U postgres"
PORT="-p 5432"
usage() {
echo "Usage: $0 [-d <dbname> -h <host> -U <user> -p <port> u]"
exit 1
}
while getopts "d:h:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
set $(date '+%m%d')
MMDD=$1
LOGDIR='/var/log/postgresql'
getver()
{
VER=$(psql $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT version();
_QUERY_
)
#VER=$(cat ${PGDATA}/PG_VERSION)
#use next line only if PGDATA has version in path
#VER=$(echo $PGDATA | cut -d / -f 5)
}
clear
getver
echo "PostgreSQL Version is $VER"
connect_cnts() {
DBLIST=$(psql -q -t $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT d.datname
FROM pg_database d
WHERE datallowconn = TRUE
AND datistemplate = FALSE
ORDER BY 1;
_QUERY_
)
}
get_cnt() {
CNT=$(psql -t $PORT $USER $DBNAME <<_QUERY_
/*
SELECT count(*)
FROM pg_stat_activity
WHERE datname = '$DB';
*/
SELECT usename,
count(*)
FROM pg_stat_activity
WHERE datname = '$DB'
GROUP BY usename;
_QUERY_
)
}
all_count() {
CNT=$(psql -t $PORT $USER $DBNAME <<_QUERY_
SELECT count(*)
FROM pg_stat_activity;
_QUERY_
)
}
###############################################################
# MAIN #
###############################################################
connect_cnts
for DB in $DBLIST;
do
echo -n "$DB "
get_cnt
# grep -E -c "$DB.*connection auth" #LOGDIR/postgresql.${MMDD}
echo -e "\t$CNT"
done
all_count
echo
echo -e "TOTAL \t\t$CNT"
#exit 0
#echo "$(hostname -f) CONNECTION COUNTS"
#echo "Current log file is: $logdir/postgresql.$MMDD"
#echo
#for DB in $DBLIST
# do
# echo -n "$DB: "
# grep 'connection authorized' $LOGDIR/postgresql.${MMDD} | grep -c "$DB"
#done
#exit 0
@@ -0,0 +1,109 @@
#!/bin/bash
USER="-U postgres"
PORT="-p 5432"
usage() {
echo "Usage: $0 -d <dbname> [-h <host> -U <user> -p <port>]"
exit 1
}
while getopts "d:h:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="postgres"
fi
#Column names changed from procpid $ current_query to pid & query from 9.2 up
gettstver()
{
TSTVER=$(psql -q -t $HOST $PORT $USER $DBNAME <<_QRY_
SELECT CASE WHEN SUBSTRING(version() FROM 12 FOR 3) < '9.2'
THEN 'procpid'
ELSE 'pid'
END;
_QRY_
)
TSTVER=${TSTVER:1:7}
}
gettstver
if [ "${TSTVER}" = "procpid" ]
then
COL="procpid"
QRY="current_query"
else
COL="pid"
QRY="query"
fi
getver()
{
VER=$(psql -t $HOST $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
current_locks() {
LCKLIST=$(psql -q $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT l.database,
d.datname,
l.relation,
n.nspname,
c.relname,
l.pid,
a.usename,
l.locktype,
l.mode,
l.granted,
l.tuple
FROM pg_locks l
JOIN pg_class c ON (c.oid = l.relation)
JOIN pg_database d ON (CASE WHEN l.database = 0 THEN d.oid = 0 ELSE d.oid = l.database END)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_stat_activity a ON (a.$COL = l.pid)
ORDER BY l.database,
l.relation,
l.pid;
_QUERY_
)
}
if [ "$DBNAME" = "" ]
then
usage
fi
current_locks
echo "${LCKLIST}"
exit 0
@@ -0,0 +1,127 @@
#!/bin/bash
DBNAME="postgres"
USER="-U postgres"
PORT="-p 5432"
SLEEPTIME=5
CANCEL="F"
NOIDLE=""
usage() {
echo "Usage: $0 [-s <sleeptime> -d <dbname> -h <host> -U <user> -p <port> -x -i]"
echo "-x will exit after 1 iteration"
echo "-i will exclude <IDLE> queries"
exit 1
}
while getopts "d:s:h:p:uU:xi" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
s) SLEEPTIME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
x) CANCEL="T"
;;
i) NOIDLE="AND current_query <> '<IDLE>'"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
getver() {
VER=$(psql -q -t $HOST $PORT $USER $DBNAME <<_VER_
SELECT SUBSTR(version(), 1, 16);
_VER_
)
}
#Column names changed from procpid $ current_query to pid & query from 9.2 up
gettstver()
{
TSTVER=$(psql -q -t $HOST $PORT $USER $DBNAME <<_QRY_
SELECT CASE WHEN SUBSTRING(version() FROM 12 FOR 3) < '9.2'
THEN 'procpid'
ELSE 'pid'
END;
_QRY_
)
TSTVER=${TSTVER:1:7}
}
gettstver
if [ "${TSTVER}" = "procpid" ]
then
COL="procpid"
QRY="current_query"
else
COL="pid"
QRY="query"
fi
getver
echo "$VER"
sleep 2
current_qry() {
QRYLIST=$(psql -q $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT datname,
$COL as pid,
-- procpid as pid,
client_addr,
usename as user,
-- regexp_replace(current_query, ' (..)', ' ', 'g') as query,
regexp_replace($QRY, ' (..)', ' ', 'g') as query,
waiting,
query_start,
clock_timestamp() - query_start as duration
FROM pg_stat_activity
--WHERE procpid != pg_backend_pid()
WHERE $COL != pg_backend_pid()
$NOIDLE
ORDER BY datname,
query_start;
_QUERY_
)
}
#### MAIN ####
while [ 1 -ge 0 ]
do
clear
current_qry
echo "${QRYLIST}"
if [ "$CANCEL" = "T" ]
then
exit 0
fi
echo "Sleeping $SLEEPTIME"
sleep $SLEEPTIME
done
@@ -0,0 +1,46 @@
#!/bin/bash
# Reports sizes for all or selected database
PORT=""
USER=""
DBNAME="%"
usage() {
echo "Usage: $0 [-d <dbname> -U <user> -p <port>]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
psql $PORT $USER postgres <<_EOF_
SELECT datname,
rolname as owner,
pg_size_pretty(pg_database_size(datname) )as size_pretty,
pg_database_size(datname) as size,
(SELECT pg_size_pretty (SUM( pg_database_size(datname))::bigint)
FROM pg_database) AS total,
((pg_database_size(datname) / (SELECT SUM( pg_database_size(datname))
FROM pg_database) ) * 100)::numeric(6,3) AS pct
FROM pg_database d
JOIN pg_authid a ON a.oid = datdba
WHERE datname LIKE '%$DBNAME%'
ORDER BY datname;
_EOF_
@@ -0,0 +1,55 @@
#!/bin/bash
# SHOWS TABLES AND SIZES FOR ALL TABLES
# SHOULD BE RUN AS a SUPERUSER
HOST=""
PORT=""
USER=""
usage() {
echo "Usage: $0 -d <dbname> [-h <host> -p <port> -U <user>]"
exit 1
}
while getopts "d:h:p:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
h) HOST="-h $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
psql $HOST $PORT $USER $DBNAME <<_CODE_
SELECT d.oid as directory,
c.relfilenode as filename,
n.nspname as schema,
c.relname as table,
a.rolname as owner,
pg_size_pretty(pg_relation_size(quote_ident(n.nspname) || '.' || quote_ident(c.relname))) as size
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_authid a ON ( a.oid = c.relowner ),
pg_database d
WHERE d.datname = current_database()
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relkind = 'r'
ORDER BY relfilenode;
_CODE_
@@ -0,0 +1,63 @@
#!/bin/bash
# Disables or Enables connections to specified database
PORT=""
USER=""
usage() {
echo "Usage: $0 -d <dbname> [-p <port> -U <user>]"
echo Database name to disable/enable is required
exit 1
}
while getopts "d:p:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
if [ $DBNAME == "postgres" ]
then
echo Disable of postgres is prohibited
exit
fi
echo changing $DBNAME
psql $PORT $USER -v ON_ERROR_STOP=on postgres <<_EOF_
SELECT datname, datallowconn
FROM pg_database
WHERE datname = '$DBNAME' ;
UPDATE pg_database
SET datallowconn = CASE
WHEN datallowconn = TRUE THEN
FALSE
ELSE
TRUE
END
WHERE datname = '$DBNAME' ;
SELECT datname, datallowconn
FROM pg_database
WHERE datname = '$DBNAME' ;
\echo Connect status for $DBNAME has been reversed
_EOF_
@@ -0,0 +1,48 @@
#!/bin/bash
# Counts transaction per minute
# for postgresql server
# Note: transactions are actual / not potential
PORT=""
USER=""
DBNAME="postgres"
usage() {
echo "Usage: $0 [-d <dbname> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:U:u" OPT;
do case "${OPT}" in
d) DBNAME="$OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
get_procnum() {
PROCNUM=$(psql $PORT -q -t $USER $DBNAME <<_QUERY_
SELECT SUM(xact_commit + xact_rollback)
FROM pg_stat_database;
_QUERY_
)
}
get_procnum
echo "$PROCNUM"
FIRST_CNT=$PROCNUM
sleep 60
get_procnum
LAST_CNT=$PROCNUM
echo "$PROCNUM"
(( TOT_QRY = $LAST_CNT - $FIRST_CNT ))
echo "Total queries = $TOT_QRY"
@@ -0,0 +1,19 @@
#!/bin/bash
psql -U postgres postgres <<_EOF_
SELECT g.rolname as group,
u.rolname as user,
r.admin_option,
CASE WHEN g.rolsuper = TRUE
THEN 'SUPERUSER'
ELSE 'f'
END as g_super,
CASE WHEN u.rolsuper = TRUE
THEN 'SUPERUSER'
ELSE 'f'
END as u_super
FROM pg_auth_members r
JOIN pg_authid g ON (r.roleid = g.oid)
JOIN pg_authid u ON (r.member = u.oid)
ORDER BY 1;
_EOF_
@@ -0,0 +1,56 @@
#!/bin/bash
# SHOWS TABLES AND SIZES FOR ALL TABLES
# SHOULD BE RUN AS SUPERUSER
PORT=""
USER=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:t:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT quote_ident(N.nspname),
quote_ident(T.relname) AS "table",
quote_ident(C.relname) AS idx_name,
round(100 * pg_relation_size(indexrelid) / pg_relation_size(indrelid) ) / 100 AS "index_ratio %",
pg_size_pretty(pg_relation_size(indexrelid) ) AS index_size,
pg_size_pretty(pg_relation_size(indrelid) ) AS table_size_size
FROM pg_index I
LEFT JOIN pg_class C ON (c.oid = I.indexrelid)
LEFT JOIN pg_class T ON (T.oid = I.indrelid)
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
AND c.relkind = 'i'
AND pg_relation_size(indrelid) > 0
AND C.relname LIKE '%$TBL%'
ORDER BY 4 DESC, 2;
_CODE_
@@ -0,0 +1,75 @@
#!/bin/bash
#Shows commnets on all or selected index
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> [-i <index> -U <user> -p <port>]"
exit 1
}
while getopts "d:i:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
i) IDX=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver()
{
VER=$(psql $PORT -t $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
QRY="SELECT quote_ident(n.nspname) as schema,
quote_ident(c.relname),
d.description as comment
FROM pg_class c
LEFT JOIN pg_description d ON (d.objoid = c.oid)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE n.nspname NOT LIKE 'information%'
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relname LIKE '%$IDX%'
AND relkind = 'i'
AND d.description IS NOT NULL
ORDER BY 2;"
current_stats() {
STATLIST=$(psql $PORT -q $USER $DBNAME <<_QUERY_
${QRY}
_QUERY_
)
}
current_stats
echo "${STATLIST}"
exit 0
@@ -0,0 +1,78 @@
#!/bin/bash
DBNAME="postgres"
USER="-U postgres"
PORT="-p 5432"
usage() {
echo "Usage: $0 [-d <dbname> -h <host> -U <user> -p <port> u]"
exit 1
}
while getopts "d:h:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
allow_logins()
{
CNT=$(psql $HOST $PORT $USER $DBNAME <<_QUERY_
UPDATE pg_authid au
SET rolcanlogin = TRUE
FROM pg_lockout lo
WHERE au.rolname = lo.rolname;
_QUERY_
)
}
current_user()
{
CUSER=$(psql -t $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT TRIM(BOTH FROM current_user);
_QUERY_
)
}
###############################################################
# MAIN #
###############################################################
current_user
if [ $CUSER != "postgres" ]
then
echo "You must be postgres to execute this script."
echo "Aborting."
exit 1
fi
allow_logins
echo "Users allowed to login = $CNT"
exit 0
@@ -0,0 +1,90 @@
#!/bin/bash
DBNAME="postgres"
USER="-U postgres"
PORT="-p 5432"
usage() {
echo "Usage: $0 [-d <dbname> -U <user> -p <port> u]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
lockout()
{
CNT=$(psql $PORT $USER $DBNAME <<_QUERY_
DROP TABLE IF EXISTS pg_lockout;
CREATE TABLE pg_lockout
AS SELECT rolname,
rolsuper,
rolcanlogin
FROM pg_authid
WHERE rolsuper IS FALSE;
ALTER TABLE pg_lockout
ADD CONSTRAINT pg_lockout_pkey PRIMARY KEY (rolname);
UPDATE pg_authid au
SET rolcanlogin = FALSE
FROM pg_lockout lo
WHERE lo.rolcanlogin = TRUE
AND au.rolname = lo.rolname;
_QUERY_
)
}
current_user()
{
CUSER=$(psql -t $PORT $USER $DBNAME <<_QUERY_
SELECT TRIM(BOTH FROM current_user);
_QUERY_
)
}
###############################################################
# MAIN #
###############################################################
current_user
echo "current user is $CUSER"
if [ $CUSER != "postgres" ]
then
echo "You must be postgres to execute this script."
echo "Aborting."
exit 1
fi
lockout
echo "Users locked out = $CNT"
exit 0
@@ -0,0 +1,3 @@
BACKFILE=pgbackup.`date +%C%y%m%d%H%M`
pg_dump -f /home/pgsql/backup/$BACKFILE -F c postgres
@@ -0,0 +1,54 @@
#!/bin/bash
# Show start and runtime for postgresql server
DBNAME="postgres"
PORT=""
USER=""
usage() {
echo "Usage: $0 [-d <dbname> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:U:u" OPT;
do case "${OPT}" in
d) DBNAME="$OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
getver()
{
VER=$(psql -t $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
show_runtime() {
RUNTIME=$(psql -q $PORT $USER $DBNAME <<_QUERY_
SELECT pg_postmaster_start_time() as pg_start,
current_timestamp - pg_postmaster_start_time() as runtime;
_QUERY_
)
}
show_runtime
echo "${RUNTIME}"
exit 0
@@ -0,0 +1,140 @@
#!/bin/bash
# Shows statistics for all indexes on all selected table
PORT=""
USER=""
TBL="%"
COLS=""
usage() {
echo "Usage: $0 -d <dbname> [-U <user> -p <port> -t <table> -s ]"
echo "dbname REQUIRED"
echo "-s will show columns used in index"
exit 1
}
getver()
{
VER=$(psql -t $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
set_qry_cols() {
QRY="SELECT n.nspname as schema,
i.relname as table,
i.indexrelname as index,
i.idx_scan,
i.idx_tup_read,
i.idx_tup_fetch,
CASE WHEN idx.indisprimary
THEN 'pkey'
WHEN idx.indisunique
THEN 'uidx'
ELSE 'idx'
END AS type,
pg_get_indexdef(idx.indexrelid, 1, FALSE) as idxcol1,
pg_get_indexdef(idx.indexrelid, 2, FALSE) as idxcol2,
pg_get_indexdef(idx.indexrelid, 3, FALSE) as idxcol3,
pg_get_indexdef(idx.indexrelid, 4, FALSE) as idxcol4,
CASE WHEN idx.indisvalid
THEN 'valid'
ELSE 'INVALID'
END as status,
pg_relation_size( quote_ident(n.nspname) || '.' || quote_ident(i.relname) ) as size_in_bytes,
pg_size_pretty(pg_relation_size(quote_ident(n.nspname)|| '.' || quote_ident(i.relname) )) as size
FROM pg_stat_all_indexes i
JOIN pg_class c ON (c.oid = i.relid)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_index idx ON (idx.indexrelid = i.indexrelid )
WHERE i.relname LIKE '%$TBL%'
AND n.nspname NOT LIKE 'pg_%'
ORDER BY 1, 2, 3;"
}
set_qry_nocols() {
QRY="SELECT n.nspname as schema,
i.relname as table,
i.indexrelname as index,
i.idx_scan,
i.idx_tup_read,
i.idx_tup_fetch,
CASE WHEN idx.indisprimary
THEN 'pkey'
WHEN idx.indisunique
THEN 'uidx'
ELSE 'idx'
END AS type,
CASE WHEN idx.indisvalid
THEN 'valid'
ELSE 'INVALID'
END as status,
pg_relation_size(quote_ident(n.nspname) || '.' || quote_ident(i.relname) ) as size_in_bytes
FROM pg_stat_all_indexes i
JOIN pg_class c ON (c.oid = i.relid)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_index idx ON (idx.indexrelid = i.indexrelid )
WHERE i.relname LIKE '%$TBL%'
AND n.nspname NOT LIKE 'pg_%'
ORDER BY 1, 2, 3;"
}
current_stats() {
STATLIST=$(psql -q -U postgres $DBNAME <<_QUERY_
$QRY
_QUERY_
)
}
###########################################################
# MAIN #
###########################################################
while getopts "d:p:st:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
s) COLS="TRUE"
;;
t) TBL="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
if [ "$COLS" = "TRUE" ]
then
set_qry_cols
else
set_qry_nocols
fi
current_stats
echo "${STATLIST}"
exit 0
@@ -0,0 +1,100 @@
#!/bin/bash
# Reports statistics for all tables
PORT=""
USER=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -U <user> -p <port>]"
exit 1
}
while getopts "d:p:t:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL=$OPTARG
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver()
{
VER=$(psql -t $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
if [ "${VER:11:3}" \< "8.3" ]
then
QRY="SELECT n.nspname as schema,
s.relname as table,
c.reltuples::bigint,
n_tup_ins,
n_tup_upd,
n_tup_del,
date_trunc('second', last_vacuum) as last_vacuum,
date_trunc('second', last_autovacuum) as last_autovacuum,
date_trunc('second', last_analyze) as last_analyze,
date_trunc('second', last_autoanalyze) as last_autoanalyze
FROM pg_stat_all_tables s
JOIN pg_class c ON c.oid = s.relid
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE s.relname NOT LIKE 'pg_%'
AND s.relname NOT LIKE 'sql_%'
AND s.relname LIKE '%$TBL%'
ORDER by 1, 2;"
else
QRY="SELECT n.nspname as schema,
s.relname as table,
c.reltuples::bigint,
n_live_tup,
n_tup_ins,
n_tup_upd,
n_tup_del,
date_trunc('second', last_vacuum) as last_vacuum,
date_trunc('second', last_autovacuum) as last_autovacuum,
date_trunc('second', last_analyze) as last_analyze,
date_trunc('second', last_autoanalyze) as last_autoanalyze
FROM pg_stat_all_tables s
JOIN pg_class c ON c.oid = s.relid
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE s.relname NOT LIKE 'pg_%'
AND s.relname NOT LIKE 'sql_%'
AND s.relname LIKE '%$TBL%'
ORDER by 1, 2;"
fi
current_stats() {
STATLIST=$(psql -q $PORT $USER $DBNAME <<_QUERY_
${QRY}
_QUERY_
)
}
current_stats
echo "${STATLIST}"
exit 0
@@ -0,0 +1,66 @@
#!/bin/bash
# Shows vacuum time for all or selected table.
PORT=""
USER=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:t:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
t) TBL="$OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver()
{
VER=$(psql $PORT -t $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
vacuum_time() {
TIMEINFO=$(psql -q $PORT $USER $DBNAME <<_QUERY_
SELECT max(last_vacuum) - min(last_vacuum) as vacuum_time
FROM pg_stat_all_tables s
WHERE s.relname NOT LIKE 'pg_%'
AND s.relname NOT LIKE 'sql_%'
AND s.relname LIKE '%$TBL%'
ORDER by 1;
_QUERY_
)
}
vacuum_time
echo "${TIMEINFO}"
exit 0
@@ -0,0 +1,24 @@
#!/bin/bash
#!/bin/bash
OLDFILE=$1
usage() {
echo "Usage: $0 oldfile"
exit 1
}
if [ -z "$OLDFILE" ]
then
usage
exit 1
fi
OLDFILE=$1
NEWFILE=x$1
col -bp < $OLDFILE >> $NEWFILE
chmod +x $NEWFILE
rm $OLDFILE
mv $NEWFILE $OLDFILE
@@ -0,0 +1,64 @@
#!/bin/bash
#Shows roles and members
PORT=""
USER="-U postgres"
DBNAME="postgres"
usage() {
echo "Usage: $0 [-d <dbname> -U <user> -p <port>]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
getver()
{
VER=$(psql -t $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
show_members() {
MEMBERS=$(psql -q $PORT $USER $DBNAME <<_QUERY_
SELECT a.rolname as role,
u.rolname as member,
CASE
WHEN m.admin_option THEN
'YES'
ELSE
'no'
END as admin
FROM pg_auth_members m
JOIN pg_authid a ON (a.oid = m.roleid)
JOIN pg_authid u ON (u.oid = m.member)
ORDER BY 1, 2
_QUERY_
)
}
show_members
echo "${MEMBERS}"
exit 0
@@ -0,0 +1,55 @@
#!/bin/bash
PORT=""
usage() {
echo "Usage: $0 [-p <port>]"
exit 1
}
while getopts "p:u" OPT;
do case "${OPT}" in
p) PORT="-p $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
getver()
{
VER=$(psql $PORT -t -U postgres postgres <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
slony_status() {
STATUS=$(psql $PORT -q <<_QUERY_
BEGIN;
SELECT st_origin as org,
st_last_event as last_event,
st_lag_num_events as lag_events,
st_lag_time
FROM _slony.sl_status;
COMMIT;
_QUERY_
)
}
slony_status
echo "${STATUS}"
exit 0
@@ -0,0 +1,83 @@
#!/bin/bash
# Reports statistics for all tables
HOST=""
PORT=""
USER=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> -t <table> [-h <host> -U <user> -p <port>]"
exit 1
}
while getopts "d:h:p:t:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
t) TBL=$OPTARG
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="playmaker"
fi
if [ "$TBL" = "" ]
then
usage
fi
getver()
{
VER=$(psql -t $PORT $HOST $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
current_stats() {
STATLIST=$(psql -q $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT schemaname,
tablename,
attname As colname,
n_distinct,
array_to_string(most_common_vals, E'\n') AS common_vals,
array_to_string(most_common_freqs, E'\n') As dist_freq
FROM pg_stats
WHERE tablename = '$TBL'
ORDER BY schemaname,
tablename,
attname;
_QUERY_
)
}
##### MAIN #####
echo "HOST=$HOST"
echo "PORT=$PORT"
echo "USER=$USER"
echo "TBL=$TBL"
echo "DBNAME=$DBNAME"
current_stats
echo "${STATLIST}"
exit 0
@@ -0,0 +1,101 @@
#!/bin/bash
# Shows comments for all or specified table
USER=""
PORT=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -U <user> -p <port>]"
exit 1
}
while getopts "d:t:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL=$OPTARG
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver()
{
VER=$(psql $PORT -t $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
QRY="SELECT DISTINCT ON (c.relname)
n.nspname as schema,
c.relname,
a.rolname as owner,
0 as col_seq,
'' as column,
d.description as comment
FROM pg_class c
LEFT JOIN pg_attribute col ON (col.attrelid = c.oid)
LEFT JOIN pg_description d ON (d.objoid = col.attrelid AND d.objsubid = 0)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_authid a ON ( a.OID = c.relowner )
WHERE n.nspname NOT LIKE 'information%'
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relname LIKE '%$TBL%'
AND relkind = 'r'
-- AND d.description IS NOT NULL
UNION
SELECT n.nspname as schema,
c.relname,
'' as owner,
col.attnum as col_seq,
col.attname as column,
d.description
FROM pg_class c
JOIN pg_attribute col ON (col.attrelid = c.oid)
LEFT JOIN pg_description d ON (d.objoid = col.attrelid AND d.objsubid = col.attnum)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_authid a ON ( a.OID = c.relowner )
WHERE n.nspname NOT LIKE 'information%'
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relname LIKE '%$TBL%'
AND relkind = 'r'
-- AND d.description IS NOT NULL
AND col.attnum >= 0
ORDER BY 1, 2, 4;"
current_stats() {
STATLIST=$(psql $USER $PORT -q $DBNAME <<_QUERY_
${QRY}
_QUERY_
)
}
current_stats
echo "${STATLIST}"
exit 0
@@ -0,0 +1,70 @@
#!/bin/bash
USER=""
PORT=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:t:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL=$OPTARG
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver()
{
VER=$(psql $PORT -t $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
get_dependents() {
DEPLIST=$(psql $PORT -q $USER $DBNAME <<_QUERY_
SELECT n.nspname as schema,
pa.relname as parent,
ch.relname as dependent,
cn.conname as constraint_name
FROM pg_constraint cn
JOIN pg_class pa ON (pa.oid = cn.confrelid)
JOIN pg_class ch ON (ch.oid = cn.conrelid)
JOIN pg_namespace n ON (n.oid = pa.relnamespace)
WHERE pa.relname LIKE '%$TBL%'
AND contype = 'f'
ORDER BY 1, 2, 3;
_QUERY_
)
}
get_dependents
echo "${DEPLIST}"
exit 0
@@ -0,0 +1,58 @@
#!/bin/bash
# Shows functions that specified table occurs in
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> -t <table> [-U <user> -p <port>]"
exit 1
}
while getopts "d:t:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
t) TBL=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="enf"
fi
if [ "$TBL" = "" ]
then
usage
exit 1
fi
echo "$TBL"
psql $USER $PORT $DBNAME <<_CODE_
SELECT p.proname,
CASE WHEN p.proretset = TRUE
THEN 'SET OF '
ELSE ''
END ||
UPPER( (SELECT typname
FROM pg_type
WHERE oid = p.prorettype) ) AS return_type,
proargnames as parameters
FROM pg_proc p
WHERE prosrc LIKE '%$TBL%'
ORDER BY p.proname;
_CODE_
exit 0
@@ -0,0 +1,53 @@
#!/bin/bash
# Shows trigger functions that specified table occurs in
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> -t <table> [-U <user> -p <port>]"
exit 1
}
while getopts "d:t:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
t) TBL=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="enf"
fi
if [ "$TBL" = "" ]
then
usage
exit 1
fi
echo "$TBL"
psql $USER $PORT $DBNAME <<_CODE_
SELECT c.relname,
t.tgname,
p.proname
FROM pg_proc p
JOIN pg_trigger t ON (t.tgfoid = p.oid)
JOIN pg_class c ON (c.oid = t.tgrelid)
WHERE prosrc LIKE ('%$TBL%')
ORDER BY c.relname;
_CODE_
exit 0
@@ -0,0 +1,69 @@
#!/bin/bash
# SHOWS TABLES AND SIZES FOR ALL TABLES
# SHOULD BE RUN AS SUPERUSER
PORT=""
USER=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:t:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT n.nspname as schema,
c.relname as table,
a.rolname as owner,
d.oid as directory,
c.relfilenode as filename,
c.reltuples::integer,
pg_size_pretty(pg_relation_size( quote_ident( n.nspname ) || '.' || quote_ident( c.relname ) )) as size,
pg_size_pretty(pg_relation_size( quote_ident( n.nspname ) || '.' || quote_ident( c.relname ) )
+ pg_relation_size( i.indexrelid ) ) as total_size,
pg_relation_size( quote_ident( n.nspname ) || '.' || quote_ident( c.relname ) ) as size_bytes,
pg_total_relation_size( quote_ident( n.nspname ) || '.' || quote_ident( c.relname ) ) as total_size_bytes,
CASE WHEN c.reltablespace = 0
THEN 'pg_default'
ELSE (SELECT t.spcname
FROM pg_tablespace t WHERE (t.oid = c.reltablespace) )
END as tablespace
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_index i ON (i.indrelid = c.oid )
JOIN pg_authid a ON ( a.oid = c.relowner ),
pg_database d
WHERE d.datname = current_database()
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relname LIKE '%$TBL%'
AND relkind = 'r'
ORDER BY 9 DESC, 1, 2;
_CODE_
@@ -0,0 +1,49 @@
#!/bin/bash
# SHOWS TABLES AND OWNERS FOR ALL TABLES
# SHOULD BE RUN AS SUPERUSER
PORT=""
USER="-U postgres"
usage() {
echo "Usage: $0 -d <dbname> [-U <user> -p <port>]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT n.nspname as schema,
c.relname as table,
a.rolname as owner,
c.relacl as permits
FROM pg_class c
JOIN pg_namespace n ON ( n.oid = c.relnamespace )
JOIN pg_authid a ON ( a.OID = c.relowner )
WHERE relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relkind = 'r'
-- AND position('useradmin' in ARRAY_TO_STRING(c.relacl, '') )> 0
ORDER BY n.nspname,
c.relname;
_CODE_
@@ -0,0 +1,55 @@
#!/bin/bash
# SHOWS TABLES AND SIZES FOR ALL TABLES
# SHOULD BE RUN AS postgres user
PORT=""
USER=""
usage() {
echo "Usage: $0 -d <dbname> [-p <port> -U <user>]"
exit 1
}
while getopts "d:p:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT n.nspname as schema,
c.relname as table,
-- c.relkind,
a.rolname as owner,
d.oid as directory,
c.relfilenode as filename,
pg_size_pretty(pg_relation_size( quote_ident(n.nspname ) || '.' || quote_ident( c.relname ) )) as size
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_authid a ON ( a.oid = c.relowner ),
pg_database d
WHERE d.datname = current_database()
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relkind = 'r'
-- AND relkind IN ('i', 'r')
ORDER BY 1, 2;
_CODE_
@@ -0,0 +1,58 @@
#!/bin/bash
# SHOWS FOREIGN KEY COUNT FOR EACH TABLE
# THEN SHOWS FOREIGN KEYS FOR EACH TABLE
PORT=""
USER=""
usage() {
echo "Usage: $0 -d <dbname> [-U <user> -p <port>]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT n.nspname as schema,
t.relname as table,
count(c.conname)
FROM pg_class t
JOIN pg_constraint c ON ( c.conrelid = t.OID AND c.contype = 'f')
JOIN pg_namespace n ON (n.oid = t.relnamespace)
WHERE relkind = 'r'
AND t.relname NOT LIKE 'pg_%'
AND t.relname NOT LIKE 'sql_%'
GROUP BY 1, 2
ORDER BY 1, 3;
SELECT n.nspname as schema,
t.relname as table,
c.conname as fk_name
FROM pg_class t
JOIN pg_constraint c ON ( c.conrelid = t.OID AND c.contype = 'f')
JOIN pg_namespace n ON (n.oid = t.relnamespace)
WHERE relkind = 'r'
AND t.relname NOT LIKE 'pg_%'
AND t.relname NOT LIKE 'sql_%'
ORDER BY 1, 2, 3;
_CODE_
@@ -0,0 +1,65 @@
#!/bin/bash
# SHOWS ALL TABLES WITH A COLUMN NAME LIKE <ColumnName>
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> -c <colname> [-U <user> -p <port>]"
exit 1
}
while getopts "d:c:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
c) COLNAME="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
echo "col=$COLNAME"
if [ "$DBNAME" = "" ]
then
DBNAME="enf"
fi
if [ "$COLNAME" = "" ]
then
usage
exit 1
fi
psql -a $USER $PORT $DBNAME <<_CODE_
SELECt c.table_schema as schema,
c.table_name as table,
c.column_name as column,
c.data_type as type,
case when c.data_type LIKE '%char%'
then COALESCE(character_maximum_length::text, 'N/A')
when c.data_type LIKE '%numeric%'
then '(' || c.numeric_precision::text || ', ' || c.numeric_scale::text || ')'
when c.data_type LIKE '%int%'
then c.numeric_precision::text
else COALESCE(character_maximum_length::text, 'N/A')
end as size
FROM information_schema.columns c
WHERE c.table_schema NOT LIKE 'pg_%'
AND c.table_schema NOT LIKE 'information%'
AND c.table_name NOT LIKE 'sql_%'
AND c.column_name LIKE '%$COLNAME%'
AND c.is_updatable = 'YES'
ORDER BY c.table_name, c.column_name;
_CODE_
exit 0
@@ -0,0 +1,49 @@
#!/bin/bash
# SHOWS TABLES AND OWNERS FOR ALL TABLES
# That have no public grants
# SHOULD BE RUN AS SUPERUSER
USER="-U postgres"
PORT=""
usage() {
echo "Usage: $0 -d <dbname> [-U <user> -p <port>]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT n.nspname as schema,
c.relname,
a.rolname as owner,
array_to_string(ARRAY[c.relacl], '|') as permits
FROM pg_class c
JOIN pg_authid a ON (a.OID = c.relowner)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE relkind = 'r'
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND position('|=' in array_to_string(ARRAY[relacl], '|')) = 0
ORDER BY 1, 2;
_CODE_
@@ -0,0 +1,103 @@
#!/bin/bash
# Shows tablespace use for all or selected table
# that are not in default tablespace
PORT=""
USER=""
TBL="%"
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -U <user> -p <port>]"
exit 1
}
while getopts "d:t:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL=$OPTARG
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
getver()
{
VER=$(psql -t $USER $PORT $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
gettstver()
{
TSTVER=$(psql -q -t $HOST $PORT $USER $DBNAME <<_QRY_
SELECT CASE WHEN SUBSTRING(version() FROM 12 FOR 3) < '9.2'
THEN 'oid'
ELSE 'func'
END;
_QRY_
)
TSTVER=${TSTVER:1:4}
}
gettstver
if [ "${TSTVER}" = "oid" ]
then
TSL="t.spclocation"
else
TSL="pg_tablespace_location(t.oid)"
fi
tspace_use() {
TSPACELIST=$(psql -q $USER $PORT $DBNAME <<_QUERY_
SELECT CASE WHEN t.spcname IS NULL
THEN 'pg_default'
ELSE t.spcname
END as tablespace,
$TSL as location,
n.nspname as schema,
c.relname as relation,
a.rolname as owner,
c.relkind as type
FROM pg_class c
LEFT JOIN pg_tablespace t ON (t.oid = c.reltablespace)
JOIN pg_authid a ON ( a.oid = c.relowner )
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE relname LIKE '%$TBL%'
AND relkind IN ('i', 'r')
AND c.relname NOT LIKE 'pg_%'
AND c.relname NOT LIKE 'sql_%'
ORDER BY 1, 2;
_QUERY_
)
}
tspace_use
echo "${TSPACELIST}"
exit 0
@@ -0,0 +1,125 @@
#!/bin/bash
PORT=""
USER=""
TBL="%"
CONSTR=""
# Shows trigger function on all or selected trigger
usage() {
echo "Usage: $0 -d <dbname> [-U <user> -p <port> -t <trigger> -s ]"
echo "dbname REQUIRED"
echo "-s will show constraints"
exit 1
}
getver()
{
VER=$(psql -t $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
set_qry_noconstraints() {
QRY="SELECT c.relname AS table,
t.tgname,
p.proname AS function_called,
-- t.tgisconstraint AS is_constraint,
cn.conname AS constraint_nm,
CASE WHEN t.tgconstrrelid > 0
THEN (SELECT relname
FROM pg_class
WHERE oid = t.tgconstrrelid)
ELSE ''
END AS constr_tbl
FROM pg_trigger t
INNER JOIN pg_proc p ON ( p.oid = t.tgfoid)
INNER JOIN pg_class c ON ( c.oid = t.tgrelid)
LEFT JOIN pg_constraint cn ON ( cn.oid = t.tgconstraint )
WHERE tgname NOT LIKE 'pg_%'
AND tgname NOT LIKE 'RI_%' -- < comment out to see constraints
AND tgname LIKE '%$TRG%'
ORDER BY 1;"
}
set_qry_constraints() {
QRY="SELECT c.relname AS table,
t.tgname,
p.proname AS function_called,
-- t.tgisconstraint AS is_constraint,
cn.conname AS constraint_nm,
CASE WHEN t.tgconstrrelid > 0
THEN (SELECT relname
FROM pg_class
WHERE oid = t.tgconstrrelid)
ELSE ''
END AS constr_tbl
FROM pg_trigger t
INNER JOIN pg_proc p ON ( p.oid = t.tgfoid)
INNER JOIN pg_class c ON ( c.oid = t.tgrelid)
LEFT JOIN pg_constraint cn ON ( cn.oid = t.tgconstraint )
WHERE tgname NOT LIKE 'pg_%'
AND tgname LIKE '%$TRG%'
ORDER BY 1;"
}
list_triggers() {
LIST=$(psql -q $PORT $USER $DBNAME <<_QUERY_
$QRY
_QUERY_
)
}
###########################################################
# MAIN #
###########################################################
while getopts "d:p:st:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
s) CONSTR="TRUE"
;;
t) TRG="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
if [ "$CONSTR" = "TRUE" ]
then
set_qry_constraints
else
set_qry_noconstraints
fi
list_triggers
echo "${LIST}"
exit 0
@@ -0,0 +1,59 @@
#!/bin/bash
# Shows Tables access for user specified
# SHOULD BE RUN AS SUPERUSER
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> -a <user2check> [-U <user> -p <port>]"
exit 1
}
while getopts "d:a:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
a) CKUSER=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="enf"
fi
if [ "$CKUSER" = "" ]
then
usage
exit 1
fi
psql $USER $PORT $DBNAME <<_CODE_
SELECT n.nspname,
c.relname,
array_to_string(ARRAY[c.relacl], '|') as permits,
position('useradmin' in array_to_string(ARRAY[relacl], '|'))
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE n.nspname not like 'pg_%'
AND n.nspname not like 'inform_%'
AND relkind = 'r'
AND (position('$CKUSER' in array_to_string(ARRAY[relacl], '|')) > 0
OR position( (SELECT g.rolname
FROM pg_auth_members r
JOIN pg_authid g ON (r.roleid = g.oid)
JOIN pg_authid u ON (r.member = u.oid)
AND u.rolname LIKE '$CKUSER%') in array_to_string(ARRAY[relacl], '|')) > 0 )
ORDER BY 1,2;
_CODE_
@@ -0,0 +1,76 @@
#!/bin/bash
# Shows table access detail for user specified
# SHOULD BE RUN AS SUPERUSER
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> -a <user2check> [-U <user> -p <port>]"
exit 1
}
while getopts "d:a:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
a) CKUSER=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="enf"
fi
if [ "$CKUSER" = "" ]
then
usage
exit 1
fi
psql $USER $PORT $DBNAME <<_CODE_
SELECT n.nspname,
c.relname,
CASE WHEN has_table_privilege('$CKUSER', quote_ident(n.nspname) || '.' || quote_ident(c.relname), 'SELECT')
THEN 'YES'
ELSE 'no'
END AS "SEL",
CASE WHEN has_table_privilege('$CKUSER', quote_ident(n.nspname) || '.' || quote_ident(c.relname), 'INSERT')
THEN 'YES'
ELSE 'no'
END AS "INS",
CASE WHEN has_table_privilege('$CKUSER', quote_ident(n.nspname) || '.' || quote_ident(c.relname), 'UPDATE')
THEN 'YES'
ELSE 'no'
END AS "UPD",
CASE WHEN has_table_privilege('$CKUSER', quote_ident(n.nspname) || '.' || quote_ident(c.relname), 'DELETE')
THEN 'YES'
ELSE 'no'
END AS "DEL",
array_to_string(ARRAY[c.relacl], '|') as permits
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE n.nspname not like 'pg_%'
AND n.nspname not like 'inform_%'
AND relkind = 'r'
/*
AND (position('$CKUSER' in array_to_string(ARRAY[relacl], '|')) > 0
OR position( (SELECT g.rolname
FROM pg_auth_members r
JOIN pg_authid g ON (r.roleid = g.oid)
JOIN pg_authid u ON (r.member = u.oid)
AND u.rolname LIKE '$CKUSER%') in array_to_string(ARRAY[relacl], '|')) > 0 )
*/
ORDER BY 1,2;
_CODE_
@@ -0,0 +1,43 @@
METHOD:1
select distinct
a.tablespace_name,
SUM(a.bytes)/1024/1024 "Used Size MB",
SUM(decode(b.maxextend, null, A.BYTES/1024/1024, b.maxextend*8192/1024/1024)) "Max Size Mb",
(SUM(a.bytes)/1024/1024 - round(c."Free"/1024/1024)) "Total Used MB",
(SUM(decode(b.maxextend, null, A.BYTES/1024/1024, b.maxextend*8192/1024/1024)) - (SUM(a.bytes)/1024/1024 - round(c."Free"/1024/1024))) "Total Free MB",
round(100*(SUM(a.bytes)/1024/1024 - round(c."Free"/1024/1024))/(SUM(decode(b.maxextend, null, A.BYTES/1024/1024, b.maxextend*8192/1024/1024)))) "Used Percentage"
from
dba_data_files a,
sys.filext$ b,
(SELECT d.tablespace_name , sum(nvl(c.bytes,0)) "Free" FROM dba_tablespaces d,DBA_FREE_SPACE c where d.tablespace_name = c.tablespace_name(+) group by d.tablespace_name) c
where a.file_id = b.file#(+)
and a.tablespace_name = c.tablespace_name
GROUP by a.tablespace_name, c."Free"/1024
order by round(100*(SUM(a.bytes)/1024/1024 - round(c."Free"/1024/1024))/(SUM(decode(b.maxextend, null, A.BYTES/1024/1024, b.maxextend*8192/1024/1024)))) desc/
METHOD:2
select substr(A.tablespace_name,1,16) "Tablespace",
MAX(A.contents) "Type",
MAX(A.status) "Status",
MAX(A.initial_extent)/1024 "Initial extent(Kb)",
MAX(A.next_extent)/1024 "Next extent(Kb)",
MAX(A.max_extents) "Max extents",
MAX(A.pct_increase) "Pct_increase",
(SUM(B.BYTES)*COUNT(DISTINCT B.FILE_ID)/COUNT(B.FILE_ID)/1024/1024)-(ROUND(SUM(C.BYTES)/1024/1024/COUNT(DISTINCT B.FILE_ID))) "USED SIZE(Mb)",
(SUM(B.BLOCKS)*COUNT(DISTINCT B.FILE_ID)/COUNT(B.FILE_ID))-(SUM(C.BLOCKS)/COUNT(DISTINCT B.FILE_ID)) "USED BLOCKS",
TO_CHAR(100-(SUM(C.BLOCKS)*100*COUNT(B.FILE_ID)/(SUM(B.BLOCKS)*COUNT(DISTINCT B.FILE_ID)))/COUNT(DISTINCT B.FILE_ID),'999.99')||'%' "USED USAGE",
ROUND(SUM(C.BYTES)/1024/1024/COUNT(DISTINCT B.FILE_ID)) "FREE SIZE(MB)",
SUM(C.BLOCKS)/COUNT(DISTINCT B.FILE_ID) "FREE BLOCKS",
TO_CHAR((SUM(C.BLOCKS)*100*COUNT(B.FILE_ID)/(SUM(B.BLOCKS)*COUNT(DISTINCT B.FILE_ID)))/COUNT(DISTINCT B.FILE_ID),'999.99')||'%' "FREE USAGE",
SUM(B.BYTES)*COUNT(DISTINCT B.FILE_ID)/COUNT(B.FILE_ID)/1024/1024 "TOTAL SIZE(Mb)",
SUM(B.BLOCKS)*COUNT(DISTINCT B.FILE_ID)/COUNT(B.FILE_ID) "TOTAL BLOCKS"
from dba_tablespaces A,
DBA_DATA_FILES B,
DBA_FREE_SPACE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME
AND A.TABLESPACE_NAME=C.TABLESPACE_NAME
GROUP BY A.TABLESPACE_NAME
order by 1
+272
View File
@@ -0,0 +1,272 @@
Steps followed to shutdown:
1. Shutdown Oracle Home process accessing database.
> emctl stop dbconsole
> srvctl stop listener -n node1
2. Shutdown RAC Database Instances on all nodes.
> srvctl status database -d oradb
> srvctl stop database -d oradb
3. Shutdown All ASM instances from all nodes.
> srvctl status asm
> srvctl stop asm -n node1 -f
> srvctl stop asm -n node2 -f
4. Shutdown Node applications running on nodes.
> srvctl status nodeapps -n node1
> srvctl stop nodeapps -n node1 -f
5. Shut down the Oracle Cluster ware or CRS. ( Run as root user)
> crsctl check cluster -all
> crsctl stop crs
Steps followed to startup:
1. Start Oracle Clusterware or CRS. (Run as root user)
> crsctl start crs
> crsctl check cluster -all
( DBA can see "CRS-4639: Could not contact Oracle High Availability Services" or "CRS-4535: Cannot communicate with Cluster Ready Services" messages.
Wait 5 minutes and then again check with "crsctl check cluster -all" command.
This time Database administrator will get "CRS-4537: Cluster Ready Services is online".
If still same issue DBA can start ora.crsd process to resolve this issue. Below is the command
> crsctl start res ora.crsd -init
2. Start Node applications running on nodes.
> srvctl start nodeapps -n node1
> srvctl status nodeapps -n node1
3. Start All ASM instances from all nodes.
> srvctl start asm -n node1
> srvctl status asm -n node1
4. Start RAC Database Instances on all nodes.
> srvctl start database -d oradb
> srvctl status database -d oradb
5. Start Oracle Home process accessing database.
> srvctl start listener -n node1
> srvctl status listener -n node1
> emctl start dbconsole
Start and Stop the One node services: ------------------> one by one node down query.
> srvctl stop listener -n node_name
> srvctl stop instance -d <db_name> -i <instance_name> -o immediate
> srvctl stop asm -n node_name
> srvctl stop nodeapps -n node_name
> srvctl start listener -n node_name
> srvctl start instance -d <db_name> -i <instance_name> -o immediate
> srvctl start asm -n node_name
> srvctl start nodeapps -n node_name
Check scan IP using OS command nslookup
# nslookup rac-scan.localdomain
Server: 192.168.0.4
Address: 192.168.0.4#53
Name: rac-scan.localdomain
Address: 192.168.0.121
Name: rac-scan.localdomain
Address: 192.168.0.122
Name: rac-scan.localdomain
Address: 192.168.0.123
# nslookup 192.168.0.121
Server: 192.168.0.4
Address: 192.168.0.4#53
121.0.168.192.in-addr.arpa name = rac-scan.localdomain.
# nslookup 192.168.0.122
Server: 192.168.0.4
Address: 192.168.0.4#53
122.0.168.192.in-addr.arpa name = rac-scan.localdomain.
# nslookup 192.168.0.123
Server: 192.168.0.4
Address: 192.168.0.4#53
123.0.168.192.in-addr.arpa name = rac-scan.localdomain.
============================================================================================================================================
CRSCTL CheatSheet
Amit Bansal / 21 May, 2008
You can find below various commands which can be used to administer Oracle Clusterware using crsctl. This is for purpose of easy reference.
Start Oracle Clusterware
#crsctl start crs
Stop Oracle Clusterware
#crsctl stop crs
Enable Oracle Clusterware
#crsctl enable crs
It enables automatic startup of Clusterware daemons
Disable Oracle Clusterware
#crsctl disable crs
It disables automatic startup of Clusterware daemons. This is useful when you are performing some
operations like OS patching and does not want clusterware to start the daemons automatically.
Checking Voting disk Location
$crsctl query css votedisk
0. 0 /dev/sda3
1. 0 /dev/sda5
2. 0 /dev/sda6
Located 3 voting disk(s).
Note: -Any command which just needs to query information can be run using oracle user. But anything which alters Oracle Clusterware requires root privileges.
Add Voting disk
#crsctl add css votedisk path
Remove Voting disk
#crsctl delete css votedisk path
Check CRS Status
$crsctl check crs
Cluster Synchronization Services appears healthy
Cluster Ready Services appears healthy
Event Manager appears healthy
You can also see particular daemon status
$crsctl check cssd
Cluster Synchronization Services appears healthy
$crsctl check crsd
Cluster Ready Services appears healthy
$crsctl check evmd
Event Manager appears healthy
You can also check Clusterware status on both the nodes using
$crsctl check cluster
prod01 ONLINE
prod02 ONLINE
Checking Oracle Clusterware Version
To determine software version (binary version of the software on a particular cluster node) use
$crsctl query crs softwareversion
Oracle Clusterware version on node [prod01] is [11.1.0.6.0]
For checking active version on cluster, use
$ crsctl query crs activeversion
Oracle Clusterware active version on the cluster is [11.1.0.6.0]
As per documentation, multiple versions are used while upgrading.
There are other options for CRSCTL too which can be seen using
$crsctl
Or
$crsctl help
11.2 Reference
11.2 introduced few changes to crsctl usage. Most important is clusterized commands which allows you to perform remote operations. They are
crsctl check cluster
crsctl start cluster
crsctl stop cluster
All these commands allow following usage
Default Stop local server
-all Stop all servers
-n Stop named servers
server [...] One or more blank-separated server names
-f Force option
Let's see usage
% crsctl check cluster -all
**************************************************************
prod01:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
prod02:
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
**************************************************************
crsctl pin css is used to associate node name with node number. i.e if olsnodes shows prod01 as 1, then it should persist. This is helpful if you intend to run pre 11.2 database
?
1
2
#crsctl pin css -n prod01
#crsctl pin css -n prod02
To check daemon status, following commands need to be used
Check crsd - crsctl check crs
Check cssd - crsctl check crs
check evmd - crsctl check evm
crs_unregister is replaced by crsctl delete resource <resource_name>
crs_stat has been deprecated (though still works) and you need to use
@@ -0,0 +1,16 @@
set lines 1000 pages 1000
connect / as sysdba
startup mount
alter system set "_system_trig_enabled" = false scope=memory;
alter database open;
@?/javavm/install/initjvm.sql
@?/xdk/admin/initxml.sql
@?/xdk/admin/xmlja.sql
@?/rdbms/admin/catjava.sql
@?/rdbms/admin/catexf.sql
shutdown immediate
startup
REM Recompile all
@?/rdbms/admin//utlrp.sql
column comp_name format a50
SELECT COMP_ID, COMP_NAME, STATUS FROM DBA_REGISTRY;
@@ -0,0 +1,8 @@
select sessionid,
username,
min(decode(action_name,'LOGON',TIMESTAMP)) logon_time,
min(decode(action_name,'LOGOFF',TIMESTAMP)) logoff_time
from dba_audit_session
group by sessionid, username
order by 2
;
@@ -0,0 +1,867 @@
------%%%% Session Related Queries %%%%------
alter system kill session '
alter system kill session 'sid,serial#' immediate;
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,PROCESS, to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from gv$session where sid= '388';
col USERNAME for a15
col OSUSER for a13
col SCHEMANAME for a15
col MACHINE for a20
select SID,SERIAL#,USERNAME, MACHINE from gv$session where MACHINE like 'wawplappp10%';
SELECT spid
FROM v$session a, v$process b WHERE a.paddr = b.addr AND sid = '388';
1) Session details (status, logon time etc.)
2) Blocking sessions/Wait events etc.
3) SQL text
4) No. Of rows processed
5) Any change in the Access plan
6) Any long running sessions
select instance_name, name, open_mode from v$instance, v$database;
set lines 900
set pagesize 900
Finding details using username:
*************************************
set lines 900
set pagesize 900
col USERNAME for a15
col OSUSER for a13
col SCHEMANAME for a15
col MACHINE for a20
col LOGON_TIME for a30
col SQL_ID for a15
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from gv$session where
osuser like '%%' order by LOGON_TIME;
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from v$session order by SID;
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from v$session order by STATUS;
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from gv$session where STATUS='ACTIVE';
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from v$session where username= 'SAS_ANALISTA' order by status;
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from gv$session where username='H3G_TRAFFICO' order by LOGON_TIME;
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from gv$session order by LOGON_TIME;
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from v$session where username='EBIS_DWH' and OSUSER = 'dsadmc' order by LOGON_TIME;
select SID,SERIAL#,USERNAME,OSUSER,inst_id,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from v$session order by LOGON_TIME;
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from gv$session where MACHINE='h3fah055' order by LOGON_TIME;
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char(logon_time, 'hh24:mi:ss dd/mm/yy') login_time from gv$SESSION where OSUSER='dsadmc' and machine='h3fah055' order by LOGIN_TIME;
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from v$session where SQL_ID='6sbr8wusrcy8a';
Sessions sorted by logon time:-
**********************************
set lines 100 pages 999
col ID format a15
col osuser format a15
col login_time format a14
select username
, osuser
, sid || ',' || serial# "ID"
, status
, to_char(logon_time, 'hh24:mi dd/mm/yy') login_time
, last_call_et
from v$session
where username is not null
order by login_time;
Finding details using sid:
*****************************
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from gv$session where sid= '2191';
select SID,SERIAL#,USERNAME,OSUSER,SCHEMANAME,MACHINE,SQL_ID,STATUS,to_char (LOGON_TIME,'DD-MON-YY:HH24:MI:SS') from v$session where sid in ('1334', '2573', '2664') order by status;
To Find Blocking Sessions :
*************************************
Query 1:
***********
select s1.username || '@' || s1.machine
|| ' ( SID=' || s1.sid || ', SERIAL#='||s1.serial#||' ) is blocking'
|| s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ', SERIAL#='||s2.serial#||' ) ' AS blocking_status
from v$lock l1, v$session s1, v$lock l2, v$session s2
where s1.sid=l1.sid and s2.sid=l2.sid
and l1.BLOCK=1 and l2.request > 0
and l1.id1 = l2.id1
and l2.id2 = l2.id2;
## output ## BLOCKING_SESSION_STATUS
--------------------------------------------------------------------------------
OPS$GBC@htcfh006 ( SID=2622) is blocking OPS$GBC@htcfh006 ( SID=2561)
OPS$GBC@htcfh006 ( SID=2561) is blocking OPS$GBC@htcfh006 ( SID=2622)
In this example the 2622 session is blocking 2561. ##
Query 2:
***********
select blocking_session,sid,serial#,wait_class,seconds_in_wait from gv$session where blocking_session is not NULL order by blocking_session;
## output ##
BLOCKING_SESSION SID SERIAL# WAIT_CLASS SECONDS_IN_WAIT
---------------- ---------- ---------- -------------------- ---------------
148 135 61521 Idle 64
Finding Locks:
*****************
set linesize 180 pagesize 90
break on Kill on username on terminal
column Kill heading 'Kill String' format a18
column res heading 'Resource Type' format 999
column id1 format 9999990
column id2 format 9999990
column lmode heading 'Lock Held' format a20;
column request heading 'Lock Requested' format a20;
column serial# format 99999
column username format a15 heading "Username"
column terminal heading Term format a11
column tab format a45 heading "Table Name"
column owner format a9
column Address format a18
select /*+RULE*/ nvl(S.USERNAME,'Internal') username,
nvl(S.TERMINAL,'None') terminal,
L.SID||','||S.SERIAL# ||' '|| P.spid Kill,
U1.NAME||'.'||substr(T1.NAME,1,30) tab,
decode(L.LMODE,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive',null) lmode,
decode(L.REQUEST,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive',null) request
from V$LOCK L,
GV$SESSION S,
V$PROCESS P,
SYS.USER$ U1,
SYS.OBJ$ T1
where L.SID = S.SID
and P.addr=S.paddr
and T1.OBJ# = decode(L.ID2,0,L.ID1,L.ID2)
and U1.USER# = T1.OWNER#
and S.TYPE != 'BACKGROUND'
--and S.SID= 1243
order by 1,2,5;
To find statement running on session:
*************************************************
Query 1 if sid is known:
*****************************
set pages 1000
set lines 132
col SQL_TEXT for a127
select SQL_TEXT from gv$sqltext
where hash_value = (select sql_hash_value from v$session where sid =2791)
order by piece;
Query 2 if sql_id is known:
*********************************
select sql_text from gv$sql where sql_id='00p5pgs2cgnnn';
No.Of Rows processed for given Session:
********************************************************
select spid, osuser, s.program from v$process p, v$session s where p.addr=s.paddr and SID=139;
select rows_processed from v$sql where hash_value= (select sql_hash_value from v$session where paddr = (select addr from v$process where spid='&spid'));
We could see 0 rows processed with the mentioned SID.
SQL> select
rows_processed
from
v$sql
where
hash_value=
(select
sql_hash_value
from
v$session
where paddr=
(select addr from v$process where spid='&spid')
); 2 3 4 5 6 7 8 9 10 11 12 13
Enter value for spid: 28914
old 12: (select addr from v$process where spid='&spid')
new 12: (select addr from v$process where spid='28914')
ROWS_PROCESSED
--------------
0
Accessplan comparision (running same/diff ):
**********************************************************
select BEGIN_INTERVAL_TIME, PLAN_HASH_VALUE PHV from DBA_HIST_SQLSTAT s,
DBA_HIST_SNAPSHOT a where SQL_ID=<sql_id found from v$session>'
and s.snap_id=a.snap_id
and s.instance_number=1
and a.instance_number=1
order by 1;
col BEGIN_INTERVAL_TIME for a35
select BEGIN_INTERVAL_TIME, PLAN_HASH_VALUE PHV from DBA_HIST_SQLSTAT s,
DBA_HIST_SNAPSHOT a where SQL_ID='adj06zhwr5n39'
and s.snap_id=a.snap_id
and s.instance_number=1
and a.instance_number=1
order by 1;
Long running Sessions:
*******************************
SELECT sid,opname,sofar, totalwork, units,elapsed_seconds,time_remaining FROM v$session_longops WHERE sofar != totalwork;
set lines 100 pages 999
col username format a15
col message format a40
col remaining format 9999
select SID,username
, to_char(start_time, 'hh24:mi:ss dd/mm/yy') started
, time_remaining remaining
, message
from v$session_longops
where time_remaining = 0
order by time_remaining desc;
select SID,SERIAL#,SOFAR,START_TIME,TIME_REMAINING,ELAPSED_SECONDS,MESSAGE from v$session_longops where SQL_ID = '62z84b4rzzscu';
select SID,SERIAL#,SOFAR,START_TIME,TIME_REMAINING,ELAPSED_SECONDS,MESSAGE from v$session_longops where SQL_ID = '62z84b4rzzscu' and SID='1460';
How long the query is runnig and how much completed:-
*************************************************************
set linesize 1000
column username format a15
column target format a29
column OPNAME format a25
SELECT USERNAME,SID,SERIAL#,TARGET,OPNAME,START_TIME,LAST_UPDATE_TIME,ELAPSED_SECONDS,TIME_REMAINING,MESSAGE FROM V$SESSION_LONGOPS WHERE TIME_REMAINING>0;
SELECT USERNAME,SID,SERIAL#,TARGET,OPNAME,START_TIME,LAST_UPDATE_TIME,ELAPSED_SECONDS,TIME_REMAINING,MESSAGE FROM V$SESSION_LONGOPS WHERE TIME_REMAINING>0 and SID='1460';
set linesize 200
column username format a15
column target format a25
column OPNAME format a25
SELECT USERNAME,TARGET,TOTALWORK,SOFAR,OPNAME,ELAPSED_SECONDS,TIME_REMAINING FROM V$SESSION_LONGOPS WHERE TOTALWORK<>SOFAR;
SELECT * FROM (SELECT USERNAME,OPNAME,SID,SERIAL#,CONTEXT,SOFAR,TOTALWORK,TARGET,ROUND(SOFAR/TOTALWORK*100,2) "% COMPLETE" FROM V$SESSION_LONGOPS) WHERE "% COMPLETE" != 100;
SELECT SID,USERNAME,TARGET,(sofar*100/TOTALWORK) "Percent work",OPNAME,ELAPSED_SECONDS,TIME_REMAINING FROM V$SESSION_LONGOPS WHERE TOTALWORK<>SOFAR and totalwork>0;
SQL to find the Session details and associated statement in excel format:
***********************************************************
SET MARKUP HTML ON ENTMAP ON SPOOL ON PREFORMAT OFF;
spool session_detail.xls
set pagesize 9999
column username format a10
column machine format a25
column type format a15
column sql_text format a40
column sid format 99999
column serial# 99999
set line 200
--
-- query metadata
--
select b.sid, b.serial#,a.spid spid,
to_char(b.LOGON_TIME,'dd/mm/yyyy hh:mi:ss'),
floor(b.last_call_et / 60) "Idle (min)",
b.machine machine,
b.inst_id INST_ID,
b.process process,
b.program,
b.type type,
b.status status,
b.username username,
c.sql_text sql_text
from v$process a,
v$session b,
v$sql c
where b.paddr = a.addr
and b.sql_address = c.address(+)
and b.type<>'BACKGROUND'
order by 2,4
/
Plan Table Output: Checked Xplan:
******************************
select * from table(dbms_xplan.display_cursor('ckg31y8rg6psa','','typical'));
Finding spid:
***********
select spid, osuser, s.program from v$process p, v$session s where p.addr=s.paddr and SID=889;
Sessions sorted by logon time/status:
******************************
set lines 100
set pages 999
col ID format a15
col osuser format a15
col login_time format a14
select username, osuser, sid, serial# "ID", status, to_char(logon_time, 'hh24:mi dd/mm/yy') login_time, last_call_et from v$session where username is not null order by status;
Time since last user activity:
************************
set lines 100 pages 999
select username, floor(last_call_et / 60) "Last Activity (Minutes)", status from v$session where username is not null order by last_call_et;
Show all connected users:
*********************
set lines 100 pages 999
col ID format a15
select username, sid, serial# "ID", status, last_call_et "Last Activity" from v$session where username is not null order by status desc, last_call_et desc;
Show a users current sql:
********************
select sql_text from v$sqlarea where (address, hash_value) in(select sql_address, sql_hash_value from v$session where username like '&username');
Show user info including os pid:
**************************
col username format a15
col osuser format a15
col program format a30
select s.sid, s.serial# "SID/SERIAL", s.username, s.osuser, p.spid "OS PID", s.program from v$session s, v$process p where s.paddr = p.addr order by to_number(p.spid);
Session status associated with the specified os process id:
**********************************************
select s.username, s.sid, s.serial#, p.spid, last_call_et, status from V$SESSION s, V$PROCESS p where s.PADDR = p.ADDR and p.spid='&pid';
Finding OS PID for a specific sid:
****************************
select s.sid, s.username, s.serial#, s.osuser, p.spid "OS PID", s.program from v$session s, v$process p where s.paddr=p.addr and s.sid='691';
Display any long operations:
************************
set lines 300 pages 999
col username format a15
col started format a25
col message format a40
col remaining format 9999
select SID, username, to_char(start_time, 'hh24:mi:ss dd/mm/yy') started, time_remaining remaining, message from v$session_longops
where time_remaining = 0 order by time_remaining desc;
select username, to_char(start_time, 'hh24:mi:ss dd/mm/yy') started, time_remaining remaining, message from v$session_longops where sid = '911';
List open cursors per user:
***********************
set pages 999
select sess.username, sess.sid, sess.serial#, stat.value cursors from v$sesstat stat, v$statname sn, v$session sess
where sess.username is not null and sess.sid = stat.sid
and stat.statistic# = sn.statistic#
and sn.name = 'opened cursors current'
order by value;
Show all connected users:
*********************
set lines 100 pages 999
select username, sid, serial# "ID", status, last_call_et "Last Activity" from v$session where username is not null order by status desc, last_call_et desc;
Finding Locks in DB:
******************
Set lines 200
col OBJECT_NAME for a25
col OBJECT_TYPE for a25
select a.sid,a.serial#,c.object_name,c.object_type
from v$session a,
v$locked_object b,
dba_objects c
where a.sid=b.session_id
and b.object_id=c.object_id and c.object_name='DB_MDS2_EVO_SUMMARY_TMP';
--------------------------------------------------------------------------------------------------------------
set lines 200 pages 1000
col Object_Name for a25
col Lock_Mode for a25
SELECT DISTINCT session_id as "Session Id",
a.os_user_name as "Os_user",
b.object_name "Object_Name",
decode(a.locked_mode,
2 ,'ROW SHARE MODE',
3 ,'ROW EXCLUSIVE MODE',
4 ,'SHARE MODE',
5 ,'SHARE ROW EXCLUSIVE MODE',
6 ,'EXCLUSIVE','UNKNOWN')as "Lock_Mode"
from v$locked_object a,
all_objects b
WHERE a.object_id = b.object_id and b.object_name='REPD_EVENT_DETAIL';
order by b.object_name;
--------------------------------------------------------------------------------------------------------------
To find locks with more details:
**************************
set lines 200
set pagesize 66
break on Kill on sid on username on terminal
column Kill heading 'Kill String' format a13
column res heading 'Resource Type' format 999
column id1 format 9999990
column id2 format 9999990
column locking heading 'Lock Held/Lock Requested' format a40
column lmode heading 'Lock Held' format a15
column request heading 'Lock Requested' format a15
column serial# format 99999
column username format a10 heading "Username"
column terminal heading Term format a8
column tab format a20 heading "Table Name"
column owner format a9
column LAddr heading "ID1 - ID2" format a18
column Lockt heading "Lock Type" format a34
column command format a25
column sid format 9999
select
nvl(S.USERNAME,'Internal') username,
L.SID,
nvl(S.TERMINAL,'None') terminal,
decode(command,
0,'None',decode(l.id2,0,U1.NAME||'.'||substr(T1.NAME,1,20),'None')) tab,
decode(command,
0,'BACKGROUND',
1,'Create Table',
2,'INSERT',
3,'SELECT',
4,'CREATE CLUSTER',
5,'ALTER CLUSTER',
6,'UPDATE',
7,'DELETE',
8,'DROP',
9,'CREATE INDEX',
10,'DROP INDEX',
11,'ALTER INDEX',
12,'DROP TABLE',
13,'CREATE SEQUENCE',
14,'ALTER SEQUENCE',
15,'ALTER TABLE',
16,'DROP SEQUENCE',
17,'GRANT',
18,'REVOKE',
19,'CREATE SYNONYM',
20,'DROP SYNONYM',
21,'CREATE VIEW',
22,'DROP VIEW',
23,'VALIDATE INDEX',
24,'CREATE PROCEDURE',
25,'ALTER PROCEDURE',
26,'LOCK TABLE',
27,'NO OPERATION',
28,'RENAME',
29,'COMMENT',
30,'AUDIT',
31,'NOAUDIT',
32,'CREATE EXTERNAL DATABASE',
33,'DROP EXTERNAL DATABASE',
34,'CREATE DATABASE',
35,'ALTER DATABASE',
36,'CREATE ROLLBACK SEGMENT',
37,'ALTER ROLLBACK SEGMENT',
38,'DROP ROLLBACK SEGMENT',
39,'CREATE TABLESPACE',
40,'ALTER TABLESPACE',
41,'DROP TABLESPACE',
42,'ALTER SESSION',
43,'ALTER USER',
44,'COMMIT',
45,'ROLLBACK',
46,'SAVEPOINT',
47,'PL/SQL EXECUTE',
48,'SET TRANSACTION',
49,'ALTER SYSTEM SWITCH LOG',
50,'EXPLAIN',
51,'CREATE USER',
52,'CREATE ROLE',
53,'DROP USER',
54,'DROP ROLE',
55,'SET ROLE',
56,'CREATE SCHEMA',
57,'CREATE CONTROL FILE',
58,'ALTER TRACING',
59,'CREATE TRIGGER',
60,'ALTER TRIGGER',
61,'DROP TRIGGER',
62,'ANALYZE TABLE',
63,'ANALYZE INDEX',
64,'ANALYZE CLUSTER',
65,'CREATE PROFILE',
66,'DROP PROFILE',
67,'ALTER PROFILE',
68,'DROP PROCEDURE',
69,'DROP PROCEDURE',
70,'ALTER RESOURCE COST',
71,'CREATE SNAPSHOT LOG',
72,'ALTER SNAPSHOT LOG',
73,'DROP SNAPSHOT LOG',
74,'CREATE SNAPSHOT',
75,'ALTER SNAPSHOT',
76,'DROP SNAPSHOT',
79,'ALTER ROLE',
85,'TRUNCATE TABLE',
86,'TRUNCATE CLUSTER',
87,'-',
88,'ALTER VIEW',
89,'-',
90,'-',
91,'CREATE FUNCTION',
92,'ALTER FUNCTION',
93,'DROP FUNCTION',
94,'CREATE PACKAGE',
95,'ALTER PACKAGE',
96,'DROP PACKAGE',
97,'CREATE PACKAGE BODY',
98,'ALTER PACKAGE BODY',
99,'DROP PACKAGE BODY',
command||' - ???') COMMAND,
decode(L.LMODE,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive','NONE') lmode,
decode(L.REQUEST,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive','NONE') request,
l.id1||'-'||l.id2 Laddr,
l.type||' - '||
decode(l.type,
'BL','Buffer hash table instance lock',
'CF',' Control file schema global enqueue lock',
'CI','Cross-instance function invocation instance lock',
'CS','Control file schema global enqueue lock',
'CU','Cursor bind lock',
'DF','Data file instance lock',
'DL','Direct loader parallel index create',
'DM','Mount/startup db primary/secondary instance lock',
'DR','Distributed recovery process lock',
'DX','Distributed transaction entry lock',
'FI','SGA open-file information lock',
'FS','File set lock',
'HW','Space management operations on a specific segment lock',
'IN','Instance number lock',
'IR','Instance recovery serialization global enqueue lock',
'IS','Instance state lock',
'IV','Library cache invalidation instance lock',
'JQ','Job queue lock',
'KK','Thread kick lock',
'MB','Master buffer hash table instance lock',
'MM','Mount definition gloabal enqueue lock',
'MR','Media recovery lock',
'PF','Password file lock',
'PI','Parallel operation lock',
'PR','Process startup lock',
'PS','Parallel operation lock',
'RE','USE_ROW_ENQUEUE enforcement lock',
'RT','Redo thread global enqueue lock',
'RW','Row wait enqueue lock',
'SC','System commit number instance lock',
'SH','System commit number high water mark enqueue lock',
'SM','SMON lock',
'SN','Sequence number instance lock',
'SQ','Sequence number enqueue lock',
'SS','Sort segment lock',
'ST','Space transaction enqueue lock',
'SV','Sequence number value lock',
'TA','Generic enqueue lock',
'TD','DDL enqueue lock',
'TE','Extend-segment enqueue lock',
'TM','DML enqueue lock',
'TO','Temporary Table Object Enqueue',
'TT','Temporary table enqueue lock',
'TX','Transaction enqueue lock',
'UL','User supplied lock',
'UN','User name lock',
'US','Undo segment DDL lock',
'WL','Being-written redo log instance lock',
'WS','Write-atomic-log-switch global enqueue lock',
'TS',decode(l.id2,0,'Temporary segment enqueue lock (ID2=0)',
'New block allocation enqueue lock (ID2=1)'),
'LA','Library cache lock instance lock (A=namespace)',
'LB','Library cache lock instance lock (B=namespace)',
'LC','Library cache lock instance lock (C=namespace)',
'LD','Library cache lock instance lock (D=namespace)',
'LE','Library cache lock instance lock (E=namespace)',
'LF','Library cache lock instance lock (F=namespace)',
'LG','Library cache lock instance lock (G=namespace)',
'LH','Library cache lock instance lock (H=namespace)',
'LI','Library cache lock instance lock (I=namespace)',
'LJ','Library cache lock instance lock (J=namespace)',
'LK','Library cache lock instance lock (K=namespace)',
'LL','Library cache lock instance lock (L=namespace)',
'LM','Library cache lock instance lock (M=namespace)',
'LN','Library cache lock instance lock (N=namespace)',
'LO','Library cache lock instance lock (O=namespace)',
'LP','Library cache lock instance lock (P=namespace)',
'LS','Log start/log switch enqueue lock',
'PA','Library cache pin instance lock (A=namespace)',
'PB','Library cache pin instance lock (B=namespace)',
'PC','Library cache pin instance lock (C=namespace)',
'PD','Library cache pin instance lock (D=namespace)',
'PE','Library cache pin instance lock (E=namespace)',
'PF','Library cache pin instance lock (F=namespace)',
'PG','Library cache pin instance lock (G=namespace)',
'PH','Library cache pin instance lock (H=namespace)',
'PI','Library cache pin instance lock (I=namespace)',
'PJ','Library cache pin instance lock (J=namespace)',
'PL','Library cache pin instance lock (K=namespace)',
'PK','Library cache pin instance lock (L=namespace)',
'PM','Library cache pin instance lock (M=namespace)',
'PN','Library cache pin instance lock (N=namespace)',
'PO','Library cache pin instance lock (O=namespace)',
'PP','Library cache pin instance lock (P=namespace)',
'PQ','Library cache pin instance lock (Q=namespace)',
'PR','Library cache pin instance lock (R=namespace)',
'PS','Library cache pin instance lock (S=namespace)',
'PT','Library cache pin instance lock (T=namespace)',
'PU','Library cache pin instance lock (U=namespace)',
'PV','Library cache pin instance lock (V=namespace)',
'PW','Library cache pin instance lock (W=namespace)',
'PX','Library cache pin instance lock (X=namespace)',
'PY','Library cache pin instance lock (Y=namespace)',
'PZ','Library cache pin instance lock (Z=namespace)',
'QA','Row cache instance lock (A=cache)',
'QB','Row cache instance lock (B=cache)',
'QC','Row cache instance lock (C=cache)',
'QD','Row cache instance lock (D=cache)',
'QE','Row cache instance lock (E=cache)',
'QF','Row cache instance lock (F=cache)',
'QG','Row cache instance lock (G=cache)',
'QH','Row cache instance lock (H=cache)',
'QI','Row cache instance lock (I=cache)',
'QJ','Row cache instance lock (J=cache)',
'QL','Row cache instance lock (K=cache)',
'QK','Row cache instance lock (L=cache)',
'QM','Row cache instance lock (M=cache)',
'QN','Row cache instance lock (N=cache)',
'QO','Row cache instance lock (O=cache)',
'QP','Row cache instance lock (P=cache)',
'QQ','Row cache instance lock (Q=cache)',
'QR','Row cache instance lock (R=cache)',
'QS','Row cache instance lock (S=cache)',
'QT','Row cache instance lock (T=cache)',
'QU','Row cache instance lock (U=cache)',
'QV','Row cache instance lock (V=cache)',
'QW','Row cache instance lock (W=cache)',
'QX','Row cache instance lock (X=cache)',
'QY','Row cache instance lock (Y=cache)',
'QZ','Row cache instance lock (Z=cache)','????') Lockt
from V$LOCK L,
GV$SESSION S,
SYS.USER$ U1,
SYS.OBJ$ T1
where L.SID = S.SID
and T1.OBJ# = decode(L.ID2,0,L.ID1,1)
and U1.USER# = T1.OWNER#
and S.TYPE != 'BACKGROUND'
order by 1,2,5;
Finding All active sql:
*******************
set feedback offset
server output on size 9999
column username format a20
column sql_text format a55 word_wrapped
begin
for x in
(select username'('sid','serial#') ospid = ' process ' program = ' program username,
to_char(LOGON_TIME,' Day HH24:MI') logon_time,
to_char(sysdate,' Day HH24:MI') current_time,
sql_address,
sql_hash_value from v$session
where status = 'ACTIVE' and rawtohex(sql_address) <> '00'
and username is not null ) loop
for y in
(select sql_text from v$sqlarea where address = x.sql_address ) loop
if ( y.sql_text not like '%listener.get_cmd%' and
y.sql_text not like '%RAWTOHEX(SQL_ADDRESS)%' )
then dbms_output.put_line( '--------------------' );
dbms_output.put_line( x.username );
dbms_output.put_line( x.logon_time ' ' x.current_time ' SQL#=' x.sql_hash_value); dbms_output.put_line( substr( y.sql_text, 1, 250 ) );
end if;
end loop;
end loop;
end;
/
Blocking Tables:
*************
select (select username || ' - ' || osuser from v$session where sid=a.sid) blocker, a.sid || ', ' || (select serial# from v$session where sid=a.sid) sid_serial, ' is blocking ', (select username || ' - ' || osuser from v$session where sid=b.sid) blockee, b.sid || ', ' || (select serial# from v$session where sid=b.sid) sid_serial from v$lock a, v$lock b where a.block = 1 and b.request > 0 and a.id1 = b.id1 and a.id2 = b.id2;
select * from dba_dml_locks where name='FRULLO.INTERF_OPZIONI';
select c.owner, c.object_name, c.object_type, b.sid, b.serial#, b.status,b.osuser,b.machine from v$locked_object a, v$session b, dba_objects c where b.sid = a.session_id and a.object_id = c.object_id;
Identify the session which is locking the object:-
***************************************
select OWNER, TABLE_NAME from dba_tables where table_name = 'INTERF_OPZIONI';
SELECT owner,
segment_name,
segment_type,
tablespace_name,
bytes/1048576 MB,
initial_extent,
next_extent,
extents,
pct_increase
FROM
DBA_SEGMENTS
WHERE
OWNER = 'FRULLO' AND
SEGMENT_NAME = 'INTERF_OPZIONI' AND
SEGMENT_TYPE = 'TABLE'
/
select a.sid, a.serial#
from v$session a, v$locked_object b, dba_objects c
where b.object_id = c.object_id
and a.sid = b.session_id
and OBJECT_NAME='FRULLO.INTERF_OPZIONI';
To identify the locked rows, use the below query:-
****************************************
set lines 200
col object_name for a30
select do.object_name
, row_wait_obj#
, row_wait_file#
, row_wait_block#
, row_wait_row#
, dbms_rowid.rowid_create (1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#,
ROW_WAIT_BLOCK#, ROW_WAIT_ROW#) ROW_ID
from v$session s
, dba_objects do
where s.ROW_WAIT_OBJ# = do.OBJECT_ID
and do.object_name=upper('<object_name_from_above_query>');
O/P:
OBJECT_NAME ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# ROW_ID
----------- ------------- -------------- --------------- ------------- ------
LOCK_TEST 41862 4 70 0 AAAKOGAAEAAAABGAAA
*******************************************************
SELECT a.sid,a.serial#, a.username,
s.sql_text
FROM V$SESSION a, V$SQLTEXT s
WHERE a.sql_address = s.address
AND a.sql_hash_value = s.hash_value
AND a.username like '&user'
ORDER BY a.username,a.sid,s.piece;
******************************************************
SQL> select resource_name, current_utilization, max_utilization from v$resource_limit where resource_name in ('processes','sessions');
Show a users current sql:-
****************************
Select sql_text
from v$sqlarea
where (address, hash_value) in
(select sql_address, sql_hash_value
from v$session
where username like '&username');
Show user info including os pid:-
***************************
col "SID/SERIAL" format a10
col username format a15
col osuser format a15
col program format a40
select s.sid || ',' || s.serial# "SID/SERIAL"
, s.username
, s.osuser
, p.spid "OS PID"
, s.program
from v$session s
, v$process p
Where s.paddr = p.addr
order by to_number(p.spid);
SELECT a.object,
a.type,
a.sid,
b.username,
b.osuser,
b.program
FROM v$access a,
v$session b
WHERE a.sid = b.sid
AND a.owner = UPPER('&ENTER_SCHEMA_NAME')
AND a.sid = &enter_session_id
ORDER BY a.object
/
SELECT a.object,
a.type,
a.sid,
b.username,
b.osuser,
b.program
FROM v$access a,
v$session b
WHERE a.sid = b.sid
AND a.owner = UPPER('H3G_TRAFFICO')
AND a.sid in ('544','329','307','169','447','505','546','564','583','606','624','85','65','48','1','21')
ORDER BY a.object
/
-- Finding details using username:
SELECT sid,a.SQL_TEXT FROM v$session s, v$sqlarea a WHERE s.sql_address = a.ADDRESS AND s.sql_hash_value = a.hash_value AND s.username like 'C2%';
-- Finding Blocking sessions with v$session
SELECT s.blocking_session,s.sid,s.serial#,s.seconds_in_wait FROM v$session s WHERE blocking_session IS NOT NULL;
-- find blocking sessions using v$lock
SELECT
l1.sid || ' is blocking ' || l2.sid blocking_sessions
FROM
v$lock l1, v$lock l2
WHERE
l1.block = 1 AND
l2.request > 0 AND
l1.id1 = l2.id1 AND
l1.id2 = l2.id2;
--blocking sessions with all available information (including machine name)
SELECT s1.username || '@' || s1.machine
|| ' ( SID=' || s1.sid || ' ) is blocking '
|| s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
FROM v$lock l1, v$session s1, v$lock l2, v$session s2
WHERE s1.sid=l1.sid AND s2.sid=l2.sid
AND l1.BLOCK=1 AND l2.request > 0
AND l1.id1 = l2.id1
AND l1.id2 = l2.id2;
-- identifying blocked objects(when TM lock condition)
SELECT sid, id1 FROM v$lock WHERE TYPE='TM';
SELECT object_name,object_type FROM dba_objects WHERE object_id=&1; (provide value ID1 from abov
+666
View File
@@ -0,0 +1,666 @@
select x.sid
,x.serial#
,x.username
,x.sql_id
,x.sql_child_number
,optimizer_mode
,hash_value
,address
,sql_text
from v$sqlarea sqlarea
,v$session x
where x.sql_hash_value = sqlarea.hash_value
and x.sql_address = sqlarea.address
and x.sid = 763
and x.username like '%CHOIMAL%' ;
select sid, event, blocking_session, last_call_et
from v$session
where status = 'ACTIVE'
and blocking_session is not null;
select sid, seq#, EVENT, WAIT_CLASS, SECONDS_IN_WAIT
from v$session_wait where sid='763';
SELECT ROUND(SOFAR*21411/TOTALWORK)
FROM V$SESSION_LONGOPS
WHERE username like '%MAL%'
AND TIME_REMAINING > 0
1134
1430
select STATUS, WAIT_TIME, LOGON_TIME from v$session where username like '%CHOIMAL%'
select sql_text from v$sqltext where sql_id=1134;
select blocking_session, sid, serial#, wait_class, seconds_in_wait
from v$session where username like '%CHOIMAL%';
select sid, serial#, username, program, event, p1, status, sql_id from v$session where username like '%CHOIMAL%';
select sid from v$session where username like '%CHOIMAL%';
select sql_id from v$session where username like '%CHOIMAL%';
FROM A SPECIFIC USERNAME -------------------This only we want
----------------------
SET LINSIZE 152
col spid for a10
col process_spid for a10
col user_name for a20
col form_name for a20
select a.pid,a.spid,a.process_spid, c.user_name,to_char(a.start_time,'DD-MON-YYYY HH24:MI:SS') "START_TIME" ,
d.user_form_name "FORM_NAME"
from apps.fnd_logins a, apps.fnd_login_resp_forms b, apps.fnd_user c,
apps.fnd_form_tl d
where
a.login_id=b.login_id
and c.user_name like 'JROMO'
and a.user_id=c.user_id
and trunc(b.start_time) >trunc(sysdate -11)
and trunc(b.end_time) is null
and b.form_id=d.form_id
and d.language='US';
Total Count of sessions
-----------------------
select count(s.status) TOTAL_SESSIONS from gv$session s;
Total Count of Inactive sessions
---------------------------------
select count(s.status) INACTIVE_SESSIONS
from gv$session s, v$process p
where
p.addr=s.paddr and
s.status='INACTIVE';
SESSIONS WHICH ARE IN INACTIVE STATUS FROM MORE THAN 1HOUR
select count(s.status) "INACTIVE SESSIONS > 1HOUR "
from gv$session s, v$process p
where
p.addr=s.paddr and
s.last_call_et > 3600 and
s.status='INACTIVE';
COUNT OF ACTIVE SESSIONS
--------------------------
select count(s.status) ACTIVE_SESSIONS
from gv$session s, v$process p
where
p.addr=s.paddr and
s.status='ACTIVE';
TOTAL SESSIONS COUNT ORDERED BY PROGRAM
--------------------------------------
col program for a30
select s.program,count(s.program) Total_Sessions
from gv$session s, v$process p
where p.addr=s.paddr
group by s.program;
TOTAL COUNT OF SESSIONS ORDERED BY MODULE
----------------------------------------
col module for a30
prompt TOTAL SESSIONS
select s.module,count(s.sid) Total_Sessions
from gv$session s, v$process p
where p.addr=s.paddr
group by s.module;
TOTAL COUNT OF SESSIONS ORDERED BY ACTION
----------------------------------------
col action for a30
prompt TOTAL SESSIONS
select s.action,count(s.sid) Total_Sessions
from gv$session s, v$process p
where p.addr=s.paddr
group by s.action;
INACTIVE SESSIONS
-----------------
prompt INACTIVE SESSIONS
select p.spid, s.sid,s.last_call_et/3600 last_call_et ,s.status,s.action,s.module,s.program
from gv$session s, v$process p
where
p.addr=s.paddr and
s.status='INACTIVE';
INACTIVE
---------
prompt INACTIVE SESSIONS
select count(s.status) INACTIVE
from gv$session s, gv$sqlarea t,v$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE';
INACTIVE PROGRAMS
-------------------
col module for a40
prompt INACTIVE SESSIONS
col INACTIVE_PROGRAMS FOR A40
select distinct (s.program) INACTIVE_PROGRAMS,s.module
from gv$session s, v$process p
where p.addr=s.paddr and
s.status='INACTIVE';
INACTIVE PROGRAMS with disk reads
----------------------------------
prompt INACTIVE SESSIONS
select distinct (s.program) INACTIVE_PROGRAMS,SUM(T.DISK_READS)
from gv$session s, gv$sqlarea t,v$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
GROUP BY S.PROGRAM;
INACTIVE SESSIONS COUNT WITH PROGRAM
--------------------------------------
col program for a30
prompt TOTAL INACTIVE SESSIONS
col INACTIVE_PROGRAMS FOR A40
select s.program,count(s.program) Total_Inactive_Sessions
from gv$session s,v$process p
where p.addr=s.paddr AND
s.status='INACTIVE'
group by s.program
order by 2 desc;
TOTAL INACTIVE SESSIONS MORE THAN 1HOUR
---------------------------------------
col program for a30
col INACTIVE_PROGRAMS FOR A40
select s.program,count(s.program) Inactive_Sessions_from_1Hour
from gv$session s,v$process p
where p.addr=s.paddr AND
s.status='INACTIVE'
and s.last_call_et > (3600)
group by s.program
order by 2 desc;
TOTAL INACTIVE SESSIONS GROUP BY MODULE
col program for a60
COL MODULE FOR A30
prompt TOTAL SESSIONS
col INACTIVE_PROGRAMS FOR A40
select s.module,count(s.module) Total_Inactive_Sessions
from gv$session s,v$process p
where p.addr=s.paddr AND
s.status='INACTIVE'
group by s.module;
INACTIVE SESSION DETAILS MORE THAN 1 HOUR
--------------------------------------------
set pagesize 40
col INST_ID for 99
col spid for a10
set linesize 150
col PROGRAM for a10
col action format a10
col logon_time format a16
col module format a13
col cli_process format a7
col cli_mach for a15
col status format a10
col username format a10
col last_call_et_Hrs for 9999.99
col sql_hash_value for 9999999999999col username for a10
set linesize 152
set pagesize 80
col "Last SQL" for a60
col elapsed_time for 999999999999
select p.spid, s.sid,s.last_call_et/3600 last_call_et_Hrs ,s.status,s.action,s.module,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
and s.last_call_et > (3600)
order by last_call_et;
INACTIVE PROGRAM --ANY--
------------------------
select p.spid, s.sid,s.last_call_et/3600 last_call_et_Hrs ,s.status,s.action,s.module,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
And s.program='&PROGRAM_NAME'
order by last_call_et;
INACTIVE MODULES --ANY---
--------------------------
select p.spid, s.sid,s.last_call_et/3600 last_call_et_Hrs ,s.status,s.action,s.module,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr
And s.module like '%order_cleanup_hazmat_v3.sql'
order by last_call_et;
INACTIVE JDBC SESSIONS
------------------------
set pagesize 40
col INST_ID for 99
col spid for a10
set linesize 150
col PROGRAM for a10
col action format a10
col logon_time format a16
col module format a13
col cli_process format a7
col cli_mach for a15
col status format a10
col username format a10
col last_call_et for 9999.99
col sql_hash_value for 9999999999999col username for a10
set linesize 152
set pagesize 80
col "Last SQL" for a60
col elapsed_time for 999999999999
select p.spid, s.sid,s.last_call_et/3600 last_call_et ,s.status,s.action,
s.module,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
and s.program='JDBC Thin Client'
and s.last_call_et > 3600
order by last_call_et;
COUNT OF INACTIVE SESSIONS MORE THAN ONE HOUR
---------------------------------------------
SELECT COUNT(P.SPID)
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
and s.program='JDBC Thin Client'
and s.last_call_et > 3600
order by last_call_et;
FORMS
TOTAL FORM SESSIONS
----------------------
SELECT COUNT(S.SID) INACTIVE_FORM_SESSIONS FROM V$SESSION S
WHERE S.STATUS='INACTIVE' and
s.action like ('%FRM%');
FORMS SESSIONS DETAILS
-----------------------
col "Last SQL" for a30
select p.spid,s.sid,s.status,s.last_call_et/3600 last_call_et_hrs ,
s.sid,t.disk_reads, t.elapsed_time,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.action like ('FRM%') and
s.last_call_et > 3600
order by spid;
col machine for a15
col "Last SQL" for a30
select p.spid,s.sid,s.status,s.last_call_et/3600 last_call_et_hrs ,
S.ACTION,s.process Client_Process,s.machine
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.action like ('FRM%') and
s.last_call_et > 3600;
order by 4;
INACTIVE FORMS SESSIONS DETAILS
-------------------------------
col program for a15
col last_call_et for 999.99
select p.spid, s.sid, s.process,s.last_call_et/3600 last_call_et ,s.status,s.action,s.module,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
and s.action like 'FRM:%'
and s.last_call_et > 3600
order by last_call_et desc;
UNIQUE SPID
------------
select unique(p.spid)
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
and s.action like 'FRM:%'
and s.last_call_et > 3600;
COUNT FORMS
------------
select COUNT(p.spid)
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
and s.action like 'FRM:%'
and s.last_call_et > 3600;
ZERO HASH VALUE
-----------------
select COUNT(p.spid)
from gv$session s,gv$process p
where
p.addr=s.paddr and
s.status='INACTIVE'
and s.action like 'FRM:%'
and s.last_call_et > 3600
AND S.SQL_HASH_VALUE=0;
INACTIVE FORM BY NAME
---------------------
select count(s.sid) from v$session S
where s.action like ('%&ACTION%')
AND S.STATUS='INACTIVE';
GROUP BY ACTION
---------------
SELECT S.ACTION,COUNT(S.SID) FROM V$SESSION S
WHERE S.STATUS='INACTIVE' and
s.action like ('%FRM%')
group by s.action;
INACTIVE FORM
-----------------
set pagesize 40
col INST_ID for 99
col spid for a10
set linesize 150
col PROGRAM for a10
col action format a10
col logon_time format a16
col module format a13
col cli_process format a7
col cli_mach for a15
col status format a10
col username format a10
col last_call_et for 9999.99
col sql_hash_value for 9999999999999col username for a10
set linesize 152
set pagesize 80
col "Last SQL" for a30
col elapsed_time for 999999999999
select p.spid, s.sid,s.process cli_process,s.last_call_et/3600 last_call_et ,
s.status,s.action,s.module,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
and s.action like ('FRM%')
and s.last_call_et > (3600*3)
order by last_call_et;
INACTIVE FORM SESSIONS
---------------------
col cli_proc for a9
COL AUDSID FOR A6
COL PID FOR A6
COL SID FOR A5
COL FORM_NAME FOR A25
COL USER_NAME FOR A15
col last_call_et for 9999.99
SELECT
-- /*+ ORDERED FULL(fl) FULL(vp) USE_HASH(fl vp) */
( SELECT SUBSTR ( fu.user_name, 1, 20 )
FROM apps.fnd_user fu
WHERE fu.user_id = fl.user_id
) user_name,vs.status,
TO_CHAR ( fl.start_time, 'DD-MON-YYYY HH24:MI' ) login_start_time,
TO_CHAR ( fl.end_time, 'DD-MON-YYYY HH24:MI' ) login_end_time,
vs.last_call_et/3600 last_call_et,
SUBSTR ( fl.process_spid, 1, 6 ) spid,
SUBSTR ( vs.process, 1, 8 ) cli_proc,
SUBSTR ( TO_CHAR ( vs.sid ), 1, 3 ) sid,
SUBSTR ( TO_CHAR ( vs.serial#), 1, 7 ) serial#,
SUBSTR ( TO_CHAR ( rf.audsid ), 1, 6 ) audsid,
SUBSTR ( TO_CHAR ( fl.pid ), 1, 3 ) pid,
SUBSTR ( vs.module || ' - ' ||
( SELECT SUBSTR ( ft.user_form_name, 1, 40 )
FROM apps.fnd_form_tl ft
WHERE ft.application_id = rf.form_appl_id
AND ft.form_id = rf.form_id
AND ft.language = USERENV('LANG')
), 1, 40 ) form_name
FROM apps.fnd_logins fl,
gv$process vp,
apps.fnd_login_resp_forms rf,
gv$session vs
WHERE fl.start_time > sysdate - 7 /* login within last 7 days */
AND fl.login_type = 'FORM'
AND fl.process_spid = vp.spid
AND fl.pid = vp.pid
AND fl.login_id = rf.login_id
AND rf.end_time IS NULL
AND rf.audsid = vs.audsid
and vs.status='INACTIVE'
ORDER BY
vs.process,
fl.process_spid;
ACTIVE
-------
prompt ACTIVE SESSIONS
select count(s.status) ACTIVE
from gv$session s, gv$sqlarea t,v$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='ACTIVE';
MODULE
-------
set pagesize 40
col INST_ID for 99
col spid for a10
set linesize 150
col PROGRAM for a10
col action format a10
col logon_time format a16
col module format a13
col cli_process format a7
col cli_mach for a15
col status format a10
col username format a10
col last_call_et for 9999.99
col sql_hash_value for 9999999999999col username for a10
set linesize 152
set pagesize 80
col "Last SQL" for a30
col elapsed_time for 999999999999
select p.spid, s.sid,s.process cli_process,s.last_call_et/3600 last_call_et ,
s.status,s.action,s.module,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr
and s.MODULE like ('&MODULE_NAME_1HR%')
and s.last_call_et > ('&TIME_HRS' * 3600)
order by last_call_et;
select p.spid, s.sid,s.process cli_process,s.last_call_et/3600 last_call_et ,
s.status,s.action,s.module,s.program
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
p.addr=s.paddr
and s.MODULE like ('%TOAD%')
Order by last_call_et;
TOAD SESSIONS
-------------
select p.spid, s.sid,s.process cli_process,s.last_call_et/3600 last_call_et ,
s.status,s.action,s.module,s.program
from gv$session s, gv$process p
where
p.addr=s.paddr
and s.MODULE like ('%TOAD%')
Order by last_call_et;
CLIENT MACHINE SESSIONS COUNT
-----------------------------
select count(s.process) TOTAL from v$session S
where s.machine like ('%&CLIENT_MACHINE%');
select count(s.process) INACTIVE from v$session S
where s.machine like ('%&CLIENT_MACHINE%')
and s.status='INACTIVE';
hash value=0
-------------
select count(s.process) from v$session S
where s.machine like ('%&CLIENT_MACHINE%')
AND S.SQL_HASH_VALUE=0;
select count(s.process) from v$session S
where s.machine like ('%&CLIENT_MACHINE%')
AND S.SQL_HASH_VALUE=0
AND S.LAST_CALL_ET > 3600;
Unique Actions
---------------
col module for a40
prompt INACTIVE SESSIONS
col INACTIVE_PROGRAMS FOR A40
select distinct (s.program) INACTIVE_PROGRAMS,s.module
from gv$session s, gv$sqlarea t,v$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
s.machine like ('%&CLIENT_MACHINE%') AND
p.addr=s.paddr and
s.status='INACTIVE';
GROUP BY program
------------------
col program for a60
prompt TOTAL SESSIONS
col INACTIVE_PROGRAMS FOR A40
select s.program,count(s.program) Total_Inactive_Sessions
from gv$session s, gv$sqlarea t,v$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr AND
s.machine like ('%&CLIENT_MACHINE%') AND
s.status='INACTIVE'
group by s.program;
alter system kill session 'sid,serial#' immediate;
alter system kill session '2208, 37605' immediate;
alter system kill session '1308,38903' immediate;
alter system kill session '277,30355' immediate;
ALTER SYSTEM DISCONNECT SESSION '304,3276' IMMEDIATE;
select 'Alter system kill session '''||SID||','||SERIAL#||''';' from v$session where status ='INACTIVE' and username='H3G_ODS';
select 'Alter system kill session '''||SID||','||SERIAL#||''' immediate;' from v$session where username like 'NSISNW';
select 'Alter system kill session '''||SID||','||SERIAL#||''' IMMEDIATE;' from v$session where sid=143;
select 'Alter system kill session '''||SID||','||SERIAL#||''' IMMEDIATE;', to_char(logon_time, 'hh24:mi:ss dd/mm/yy') login_time from v$SESSION where status='INACTIVE';
select SID,SERIAL#,status from v$session where sid=143;
select status from v$session where SERIAL=53718
----------------------------------------
Check how rollback is going after killing session
Summary
If you kill a session and has uncommited transactions you must wait until rollback. To find how rollback is going execute
SELECT used_ublk FROM v$transaction WHERE ADDR IN (SELECT TADDR FROM v$session WHERE SID = <SID>)
where sid, is the sid of the killed session
If there is a value there, this is the number of undo blocks used by the transaction. Wait one minute and again. If it is decreasing, a rollback is occuring and based on the difference between these values, you can "guesstimate" the time required to complete the rollback.
Output will be like the below
SQL> SELECT used_ublk FROM v$transaction WHERE ADDR IN (SELECT TADDR FROM v$session WHERE SID = 304);
USED_UBLK
----------
270265
SQL> /
USED_UBLK
----------
270244
where the USED_UBLK keeps reducing
alter system kill session 'sid,serial#' immediate;
alter system kill session '2208, 37605' immediate;
alter system kill session '1308,38903' immediate;
alter system kill session '277,30355' immediate;
ALTER SYSTEM DISCONNECT SESSION '304,3276' IMMEDIATE;
select 'Alter system kill session '''||SID||','||SERIAL#||''';' from v$session where status ='INACTIVE' and username='H3G_ODS';
select 'Alter system kill session '''||SID||','||SERIAL#||''' immediate;' from v$session where username like 'NSISNW';
select 'Alter system kill session '''||SID||','||SERIAL#||''' IMMEDIATE;' from v$session where sid=143;
select 'Alter system kill session '''||SID||','||SERIAL#||''' IMMEDIATE;', to_char(logon_time, 'hh24:mi:ss dd/mm/yy') login_time from v$SESSION where status='INACTIVE';
select SID,SERIAL#,status from v$session where sid=143;
select status from v$session where SERIAL=53718
----------------------------------------
Check how rollback is going after killing session
Summary
If you kill a session and has uncommited transactions you must wait until rollback. To find how rollback is going execute
SELECT used_ublk FROM v$transaction WHERE ADDR IN (SELECT TADDR FROM v$session WHERE SID = <SID>)
where sid, is the sid of the killed session
If there is a value there, this is the number of undo blocks used by the transaction. Wait one minute and again. If it is decreasing, a rollback is occuring and based on the difference between these values, you can "guesstimate" the time required to complete the rollback.
Output will be like the below
SQL> SELECT used_ublk FROM v$transaction WHERE ADDR IN (SELECT TADDR FROM v$session WHERE SID = 304);
USED_UBLK
----------
270265
SQL> /
USED_UBLK
----------
270244
where the USED_UBLK keeps reducing
+11
View File
@@ -0,0 +1,11 @@
col instance_name for a20
col Instance Up Time for a50
SELECT instance_name,
floor(((sysdate-startup_time)*24*60*60)/3600/24) || ' DAYS '
|| floor ((floor(((sysdate-startup_time)*24*60*60)) -
floor(((sysdate-startup_time)*24*60*60)/3600/24)*24*60*60)/3600) || ' Hours '
|| floor(floor ((floor(((sysdate-startup_time)*24*60*60))
- floor(((sysdate-startup_time)*24*60*60)/3600/24)*24*60*60) -
( floor ((floor(((sysdate-startup_time)*24*60*60)) -
floor(((sysdate-startup_time)*24*60*60)/3600/24)*24*60*60)/3600))*60*60)/60) || ' MINUTES '
FROM v$instance;
+113
View File
@@ -0,0 +1,113 @@
https://oracle-base.com/dba/script?category=monitoring&file=jobs.sql = Jobs Scripts
http://oracledbazone.com/scripts/ = All Scripts
http://oracledbascriptsfromajith.blogspot.in/ = Scripts
https://communities.bmc.com/docs/DOC-9942 = listener checking scripts
http://www.idevelopment.info/cgi/ORACLE_dba_scripts.cgi = All Scripts
https://usdc1sp002.chep.com:7799/em
https://chep.service-now.com/navpage.do
http://www.idevelopment.info/data/Oracle/DBA_tips/Automatic_Storage_Management/ASM_50.shtml
http://gavinsoorma.com/category/scripts/
https://oe.us.dell.com/
http://select-star-from.blogspot.in/2012/12/delete-archivelogs-and-old-rman-backups.html
Dataguard
---------
http://emrebaransel.blogspot.in/2013/07/data-guard-queries.html
http://www.pafumi.net/Standby_Concepts_Configuration.html
http://www.orafaq.com/forum/t/176313/
http://oracledatabasegrid.blogspot.in/p/dataguard_4.html
http://askdba.org/weblog/resource-center/useful-sql-dba/
Undo parameter
--------------
http://www.akadia.com/services/ora_optimize_undo.html
http://oracledatabasegrid.blogspot.in/p/dgmgrl.html
Trace file:
-----------
http://csl-oracle.blogspot.in/2013/01/finding-location-of-oracle-alert-log.html
Syncplicity:
------------
https://my.syncplicity.com/Default.aspx
ASM
---
http://noriegaaoracleexpert.blogspot.in/2010/06/asm-load-balancing-anthony-d.html?m=1
http://appsdbaera.blogspot.in/2013/04/oracle-asm-load-balancing.html
http://www.sivakumardba.com/2013/02/adding-new-asm-disk-into-existing.html
RAC
---
http://www.databasejournal.com/features/oracle/article.php/3681531/Oracle-RAC-Checking-RAC-status-with-SQLOS-level-statements.htm
https://dbamohsin.wordpress.com/2011/02/09/rac-services-command-list/
http://oracledbabay.blogspot.in/2012/11/oracle-11gr2-rac-services.html
https://community.oracle.com/welcome
http://oracledatabasegrid.blogspot.in/2014/07/oracle-11gr2-rac-oc4j-and-gsd-resource.html
DBA_Jobs
--------
http://www.dba-oracle.com/t_how_to_tell_when_scheduled_job_is_running.htm
https://community.oracle.com/thread/557102?start=60&tstart=0
http://ora-apps-dba.blogspot.in/2009/07/repair-broken-jobs-in-dbajobs.html
http://oracledatabasegrid.blogspot.in/2014/07/oracle-11gr2-rac-oc4j-and-gsd-resource.html
https://dbhk.wordpress.com/2014/11/13/ctssd1883crs-2409the-clock-on-host-xxxxx-is-not-synchronous-with-the-mean-cluster-time-no-action-has-been-taken-as-the-cluster-time-synchronization-service-is-running-in-observer-mode/
http://oradbatips.blogspot.in/2012/12/tip-104-node-eviction-in-rac-11gr2-due.html
http://docs.oracle.com/cd/E19044-01/sol.containers/817-1592/rmtaskproj.task-6/index.html
Alert log:
---------
http://www.oradba.ch/2013/07/query-alert-log-from-sqlplus/
Agent
-----
https://mehmeteser.wordpress.com/tag/emctl-clearstate-agent/
http://www.pythian.com/blog/how-to-fix-a-target-with-a-pending-status-in-oem-12cr2/
https://jhdba.wordpress.com/tag/clearstate/
http://www.idevelopment.info/data/Oracle/DBA_tips/Enterprise_Manager/OEM_15.shtml
DBA_profiles:
--------------
http://kannan-oracle.blogspot.in/2012/06/how-to-show-user-profile-and-change-its.html
GRID INSTALLATION:
=================
https://balakumarnair.wordpress.com/2011/02/13/oracle-11gr1-enterprise-manager-grid-control-oem-installation-part-1/
https://balakumarnair.wordpress.com/2011/02/24/oracle-11gr1-enterprise-manager-grid-control-oem-installation-part-2/
https://balakumarnair.wordpress.com/2011/02/24/oracle-11gr1-enterprise-manager-grid-control-oem-installation-part-3/
Managing 11gR1 Grid Control Commands, Log files & Directory Structure
=======================================================================
https://balakumarnair.wordpress.com/category/oracle-11gr2/
Live Scenarios: All Concepts
==============
http://dbaworkshop.blogspot.com.au/p/recovery-scenarios_5.html
http://dbaworkshop.blogspot.it/2013/03/How-to-duplicate-a-production-database-on-a-different-server-mantaining-the-same-SID-and-directory-structures-with-duplicate-RMAN-command.html
==========================================================
How to duplicate a production database on a different server mantaining
the same SID and directory structures with 'duplicate' RMAN command
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,17 @@
SELECT c.table_schema,
c.table_name as table,
c.ordinal_position as order,
c.column_name as column,
-- c.data_type as type,
CASE WHEN c.data_type IN ('character', 'varchar') THEN c.data_type || '(' || c.character_maximum_length || ')'
WHEN c.data_type IN ('numeric') THEN c.data_type || '(' || c.numeric_precision || ',' || c.numeric_scale || ')'
ELSE c.data_type
END,
-- c.character_maximum_length as max_len,
c.is_nullable as null,
col_description(t.oid, c.ordinal_position)
FROM information_schema.columns c
JOIN pg_class t ON (t.relname = c.table_name)
WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
ORDER BY 1, 2, 3;
@@ -0,0 +1,7 @@
SELECT table_schema,
table_name,
constraint_name as constraint,
constraint_type as type
FROM information_schema.table_constraints
WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
ORDER BY 1, 2;
@@ -0,0 +1,6 @@
SELECT table_schema as schema,
table_name as table
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema NOT IN ('pg_catalog', 'information_schema')
ORDER BY 1, 2;
+81
View File
@@ -0,0 +1,81 @@
These are generic SQL queries. In some cases you need to replace variable holders -> <VARIABLE>
with the actual value you need.
ALL_COLUMNS.sql -> Lists all tables, their columns and data type
ALL_CONSTRAINTS.sql -> lists all tables and their associated constraints
ALL_TABLES.sql -> lists all tables
bad_idx.sql -> lists all indexes flagged as invalid
blocked_transaction.sql -> shows all blocked queries and transaction causing block
cache_hit_ratio.sql -> shows cache hit ratio for all databases
cancel_all_queries.sql -> cancels all tranactions for specified <user_name>
check_fks.sql -> shows fk status for all tables > 9mb in size or greater than 1000 writes
column_name_type_difference.sql -> shows all tables and columns that have same column name but different data type
columns_of_type_x.sql -> shows all tables that have columns of type <TYPE>
connection_counts.sql -> shows connection totals and totals for users, database and user/database
current_locks.sql -> shows current_locks
current_queries_blocked.sql -> shows blocked transactions and blocking query
current_queries.sql -> shows all current_queries
database_info.sql -> shows information from pg_database
database_sizes.sql -> shows size of all databases and percentage of total size
distinct_data_types.sql -> shows all data types in use in cluster
enum_maint.sql -> generic query to show all enums and commented delete / add code
enums.sql -> generic query to show all enums
filenames_and_tables.sql -> shows physical filenames for all tables
gen_create_indexes.sql -> generates sql statements to recreate all indexes
gen_drop_indexes.sql -> generates sql statements to drop all indexes
gen_get_seq_max.sql -> generates sql to get the max value of all sequences
gen_revoke_all.sql -> generates sql to revoke all priviliges from all tables for user <some_user>
gen_table_compare_counts.sql -> generates sql to compare reltuples to actual row count for all tables
get_slony_schemas.sql -> shows all slony schemas
get_trans_min_cnt.sql -> shows trandaction count per minute in cluster
groups_users.sql -> shows all groups and assigned users
inactive_tables.sql -> shows all tables that have 0 fetch's & 0 read's
index_bloat.sql -> shows size of index vs. table
index_bloat2.sql > a more specific version of index bloat WHERE realbloat > 50 and wastedbytes > 50000000 (adjust to your requirements)
index_comments.sql -> shows comments for all indexes
index_sizes.sql -> show the size of all indexes
index_tablespaces.sql -> shows the tablespace indexes are using
make_alter_index_spc.sql -> generates sql to alter all indexes in public to <new_table_space>
make_alter_table_spc.sql -> generates sql to alter all tables in public to <new_table_space>
most_active_tables.sql -> sorts and lists all tables in descending order by tuples read
parent_and_children.sql -> lists all tables and associated children
pg_runtime.sql -> lists start and run time for cluster
pg_stat_all_indexes.sql -> lists stats and status for all indexes
pg_stat_all_tables.sql -> lists stats and vacuum info for all tables
remove_ctrl.sh -> removes control characters from queries (used if query written in windows)
role_members.sql -> lists all roles and their members
rules.sql -> lists all tables and associated rules
sequence_cols.sql -> lists all tables with sequence columns
show_dead_tuples.sql -> shows table stats and status of dead tuples
table_access.sql -> lists all tables and their acl
table_columns.sql -> lists all columns for specified <table>
table_comments.sql -> lists comments for all tables and columns
table_constraints.sql -> lists all constraints for all tables
table_dependents.sql -> lists all tables, children and related constraint name
table_grants.sql -> lists all tables and their grants
table_in_function.sql -> list all functions that reference <TABLE/COLUMN>
table_in_schema.sql -> lists all tables in <schema_name>
table_in_trigger.sql -> lists all triggers that reference <table>
table_row_counts.sql -> lists all tables with greater than 0 rows
tables_and_comments.sql -> lists only tables and columns with comments
tables_and_filenames.sql -> lists all tables and physical filenames
tables_and_owners.sql -> lists all tables, owners and permits
tables_and_pkey.sql -> lists all tables and primary key name
table_sizes.sql -> lists all tables, owner, physical filename, tuples, size, total size, size in bytes, total_size in bytes and tablespace
table_stats.sql -> lists all tables and indexes, last vacuum, inserted, updated and deleted count
tables_with_column_name.sql -> lists all tables with column name LIKE <COLUMN_NAME>
tables_with_FKs.sql -> lists all tables that have foreign keys and FK name
tables_with_large_index_size.sql -> lists all tables where index size > table size
tables_with_no_FK.sql -> lists all tables that have no foreign key
tables_with_no_pkey.sql -> lists all tables with no primary key
tables_with_no_public_grants.sql -> lists all tables that have no public grants (Only owner has access)
table_triggers.sql -> lists all tables with triggers, trigger name, trigger type and tgenabled value
tcp_settings.sql -> lists the current tcp settings
triggers_and_constraints.sql -> lists tables, their triggers and function called by the trigger
useless_indexes.sql -> lists tables and associated indexes scanned < 200 times and are not unique indexes
useless_indexes2.sql -> lists tables and associated indexes scanned < 200 times and are not unique indexes or primary keys
users.sql -> lists all users/groups and if they are superuser or not
user_table_access_detail.sql -> lists all table privileges for user <CKUSER>
user_table_access.sql -> lists all tables, acl and position in acl for user <USERNAME>
wasted_index_space.sql -> shows space wasted by unused indexes
@@ -0,0 +1,10 @@
SELECT n.nspname,
t.relname as table,
c.conname as pk_name
FROM pg_class t
JOIN pg_constraint c ON ( c.conrelid = t.OID AND c.contype = 'p')
JOIN pg_namespace n ON (n.oid = t.relnamespace)
WHERE relkind = 'r'
AND t.relname NOT LIKE 'pg_%'
AND t.relname NOT LIKE 'sql_%'
ORDER BY n.nspname, t.relname, c.conname;
@@ -0,0 +1,26 @@
SELECT n.nspname as schema,
t.relname as table,
count(c.conname)
FROM pg_class t
JOIN pg_namespace n ON n.oid = t.relnamespace
JOIN pg_constraint c ON ( c.conrelid = t.OID AND c.contype = 'f')
WHERE relkind = 'r'
AND t.relname NOT LIKE 'pg_%'
AND t.relname NOT LIKE 'sql_%'
GROUP BY n.nspname,
t.relname
ORDER BY count, n.nspname, t.relname;
SELECT n.nspname as schema,
t.relname as table,
c.conname as fk_name
FROM pg_class t
JOIN pg_namespace n ON n.oid = t.relnamespace
JOIN pg_constraint c ON ( c.conrelid = t.OID AND c.contype = 'f')
WHERE relkind = 'r'
AND t.relname NOT LIKE 'pg_%'
AND t.relname NOT LIKE 'sql_%'
ORDER BY n.nspname,
t.relname,
c.conname;
@@ -0,0 +1,12 @@
SELECT relname as table
FROM pg_class
WHERE relkind = 'r'
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'sql_%'
AND OID NOT IN
(SELECT conrelid
FROM pg_constraint
WHERE contype = 'f'
AND contype <> 'p'
AND contype <> 'c')
ORDER BY relname;
+16
View File
@@ -0,0 +1,16 @@
SELECT n.nspname,
i.relname,
i.indexrelname,
CASE WHEN idx.indisprimary
THEN 'pkey'
WHEN idx.indisunique
THEN 'uidx'
ELSE 'idx'
END AS type,
'INVALID'
FROM pg_stat_all_indexes i
JOIN pg_class c ON (c.oid = i.relid)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_index idx ON (idx.indexrelid = i.indexrelid )
WHERE idx.indisvalid = FALSE
ORDER BY 1, 2;
@@ -0,0 +1,15 @@
/* Requires PostgreSQL version is 9.2 or Greater */
SELECT
w.query as waiting_query,
w.pid as w_pid,
w.usename as w_user,
l.query as locking_query,
l.pid as l_pid,
l.usename as l_user,
t.schemaname || '.' || t.relname as tablename
FROM pg_stat_activity w
JOIN pg_locks l1 ON (w.pid = l1.pid and not l1.granted)
JOIN pg_locks l2 on (l1.relation = l2.relation and l2.granted)
JOIN pg_stat_activity l ON (l2.pid = l.pid)
JOIN pg_stat_user_tables t ON (l1.relation = t.relid)
WHERE w.waiting;
@@ -0,0 +1,13 @@
SELECT pg_stat_database.datname,
pg_stat_database.blks_read,
pg_stat_database.blks_hit,
round((pg_stat_database.blks_hit::double precision
/ (pg_stat_database.blks_read
+ pg_stat_database.blks_hit
+1)::double precision * 100::double precision)::numeric, 2) AS cachehitratio
FROM pg_stat_database
WHERE pg_stat_database.datname !~ '^(template(0|1)|postgres)$'::text
ORDER BY round((pg_stat_database.blks_hit::double precision
/ (pg_stat_database.blks_read
+ pg_stat_database.blks_hit
+ 1)::double precision * 100::double precision)::numeric, 2) DESC;
@@ -0,0 +1,4 @@
SELECT pg_cancel_backend(procpid),
pg_terminate_backend(procpid)
FROM pg_stat_activity
WHERE usename = '<user_name>';
+116
View File
@@ -0,0 +1,116 @@
WITH fk_actions ( code, action ) AS (
VALUES ( 'a', 'error' ),
( 'r', 'restrict' ),
( 'c', 'cascade' ),
( 'n', 'set null' ),
( 'd', 'set default' )
),
fk_list AS (
SELECT pg_constraint.oid as fkoid, conrelid, confrelid as parentid,
conname, relname, nspname,
fk_actions_update.action as update_action,
fk_actions_delete.action as delete_action,
conkey as key_cols
FROM pg_constraint
JOIN pg_class ON conrelid = pg_class.oid
JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid
JOIN fk_actions AS fk_actions_update ON confupdtype = fk_actions_update.code
JOIN fk_actions AS fk_actions_delete ON confdeltype = fk_actions_delete.code
WHERE contype = 'f'
),
fk_attributes AS (
SELECT fkoid, conrelid, attname, attnum
FROM fk_list
JOIN pg_attribute
ON conrelid = attrelid
AND attnum = ANY( key_cols )
ORDER BY fkoid, attnum
),
fk_cols_list AS (
SELECT fkoid, array_agg(attname) as cols_list
FROM fk_attributes
GROUP BY fkoid
),
index_list AS (
SELECT indexrelid as indexid,
pg_class.relname as indexname,
indrelid,
indkey,
indpred is not null as has_predicate,
pg_get_indexdef(indexrelid) as indexdef
FROM pg_index
JOIN pg_class ON indexrelid = pg_class.oid
WHERE indisvalid
),
fk_index_match AS (
SELECT fk_list.*,
indexid,
indexname,
indkey::int[] as indexatts,
has_predicate,
indexdef,
array_length(key_cols, 1) as fk_colcount,
array_length(indkey,1) as index_colcount,
round(pg_relation_size(conrelid)/(1024^2)::numeric) as table_mb,
cols_list
FROM fk_list
JOIN fk_cols_list USING (fkoid)
LEFT OUTER JOIN index_list
ON conrelid = indrelid
AND (indkey::int2[])[0:(array_length(key_cols,1) -1)] @> key_cols
),
fk_perfect_match AS (
SELECT fkoid
FROM fk_index_match
WHERE (index_colcount - 1) <= fk_colcount
AND NOT has_predicate
AND indexdef LIKE '%USING btree%'
),
fk_index_check AS (
SELECT 'no index' as issue, *, 1 as issue_sort
FROM fk_index_match
WHERE indexid IS NULL
UNION ALL
SELECT 'questionable index' as issue, *, 2
FROM fk_index_match
WHERE indexid IS NOT NULL
AND fkoid NOT IN (
SELECT fkoid
FROM fk_perfect_match)
),
parent_table_stats AS (
SELECT fkoid, tabstats.relname as parent_name,
(n_tup_ins + n_tup_upd + n_tup_del + n_tup_hot_upd) as parent_writes,
round(pg_relation_size(parentid)/(1024^2)::numeric) as parent_mb
FROM pg_stat_user_tables AS tabstats
JOIN fk_list
ON relid = parentid
),
fk_table_stats AS (
SELECT fkoid,
(n_tup_ins + n_tup_upd + n_tup_del + n_tup_hot_upd) as writes,
seq_scan as table_scans
FROM pg_stat_user_tables AS tabstats
JOIN fk_list
ON relid = conrelid
)
SELECT nspname as schema_name,
relname as table_name,
conname as fk_name,
issue,
table_mb,
writes,
table_scans,
parent_name,
parent_mb,
parent_writes,
cols_list,
indexdef
FROM fk_index_check
JOIN parent_table_stats USING (fkoid)
JOIN fk_table_stats USING (fkoid)
/*WHERE table_mb > 9
AND ( writes > 1000
OR parent_writes > 1000
OR parent_mb > 10 )
*/ORDER BY issue_sort, table_mb DESC, table_name, fk_name;
@@ -0,0 +1,26 @@
SELECT sa.nspname as schemaa,
ca.relname as tablea,
a.attname as columna, ta.typname,
sb.nspname as schemab,
cb.relname as tableb,
a.attname as columnb, tb.typname
FROM pg_attribute a
JOIN pg_type ta ON (ta.oid = a.atttypid)
JOIN pg_class ca ON (ca.oid = a.attrelid)
JOIN pg_catalog.pg_namespace sa ON (ca.relnamespace = sa.oid),
pg_attribute b
JOIN pg_type tb ON (tb.oid = b.atttypid)
JOIN pg_class cb ON (cb.oid = b.attrelid)
JOIN pg_catalog.pg_namespace sb ON (cb.relnamespace = sb.oid)
WHERE a.attname = b.attname
AND ta.typname <> tb.typname
AND ca.relname NOT LIKE 'pg_%'
AND ca.relname NOT LIKE 'information%'
AND ca.relname NOT LIKE 'sql_%'
AND ca.relkind = 'r'
AND cb.relname NOT LIKE 'pg_%'
AND cb.relname NOT LIKE 'information%'
AND cb.relname NOT LIKE 'sql_%'
AND cb.relkind = 'r'
AND 'rollback' NOT IN (sa.nspname, sb.nspname)
AND 'id' NOT IN (a.attname, b.attname);
@@ -0,0 +1,26 @@
--SELECT DISTINCT (c.data_type),
-- COALESCE(character_maximum_length::text, 'N/A'),
-- c.numeric_precision,
-- c.numeric_scale
-- FROM information_schema.columns c;
SELECT c.table_schema as schema,
c.table_name as table,
c.column_name as column,
c.data_type as type,
case when c.data_type LIKE '%char%'
then COALESCE(character_maximum_length::text, 'N/A')
when c.data_type LIKE '%numeric%'
then '(' || c.numeric_precision::text || ', ' || c.numeric_scale::text || ')'
when c.data_type LIKE '%int%'
then c.numeric_precision::text
else COALESCE(character_maximum_length::text, 'N/A')
end as size
FROM information_schema.columns c
WHERE c.table_schema NOT LIKE 'pg_%'
AND c.table_schema NOT LIKE 'information%'
AND c.table_name NOT LIKE 'sql_%'
AND c.data_type LIKE '%<TYPE>%'
AND c.is_updatable = 'YES'
ORDER BY c.table_name, c.column_name;
@@ -0,0 +1,22 @@
SELECT COUNT(*)
FROM pg_stat_activity;
SELECT usename,
count(*)
FROM pg_stat_activity
GROUP BY 1
ORDER BY 1;
SELECT datname,
usename,
count(*)
FROM pg_stat_activity
GROUP BY 1, 2
ORDER BY 1, 2;
SELECT usename,
datname,
count(*)
FROM pg_stat_activity
GROUP BY 1, 2
ORDER BY 1, 2;
@@ -0,0 +1,18 @@
SELECT database,
relation,
n.nspname,
c.relname,
pid,
a.usename,
locktype,
mode,
granted,
tuple
FROM pg_locks l
JOIN pg_class c ON (c.oid = l.relation)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_stat_activity a ON (a.procpid = l.pid)
ORDER BY database,
relation,
pid;
@@ -0,0 +1,53 @@
SELECT a.datname,
a.procpid as pid,
CASE WHEN a.client_addr IS NULL
THEN 'local'
ELSE a.client_addr::text
END as client_addr,
a.usename as user,
a.waiting,
l.procpid as blocking_pid,
l.usename as blicking_user,
a.current_query,
a.query_start,
current_timestamp - a.query_start as duration
FROM pg_stat_activity a
LEFT JOIN pg_locks l1 ON (a.procpid = l1.pid )
LEFT JOIN pg_locks l2 on (l1.relation = l2.relation )
LEFT JOIN pg_stat_activity l ON (l2.pid = l.procpid)
LEFT JOIN pg_stat_user_tables t ON (l1.relation = t.relid)
WHERE pg_backend_pid() <> a.procpid
ORDER BY a.datname,
a.query_start;
SELECT
w.current_query as waiting_query,
w.procpid as w_pid,
w.usename as w_user,
l.current_query as locking_query,
l.procpid as l_pid,
l.usename as l_user,
t.schemaname || '.' || t.relname as tablename
FROM pg_stat_activity w
JOIN pg_locks l1 ON (w.procpid = l1.pid and not l1.granted)
JOIN pg_locks l2 on (l1.relation = l2.relation and l2.granted)
JOIN pg_stat_activity l ON (l2.pid = l.procpid)
JOIN pg_stat_user_tables t ON (l1.relation = t.relid)
WHERE w.waiting;
SELECT datname,
procpid as pid,
client_addr,
usename as user,
current_query,
CASE WHEN waiting = TRUE
THEN 'BLOCKED'
ELSE 'no'
END as waiting,
query_start,
current_timestamp - query_start as duration
FROM pg_stat_activity
WHERE pg_backend_pid() <> procpid
ORDER BY datname,
query_start;
@@ -0,0 +1,38 @@
/* Use for PostgreSQL 9.2 or greater */
SELECT c.datname,
c.pid as pid,
c.client_addr,
c.usename as user,
c.query,
CASE WHEN c.waiting = TRUE
THEN 'BLOCKED'
ELSE 'no'
END as waiting,
l.pid as blocked_by,
current_timestamp - c.query_start as duration
FROM pg_stat_activity c
LEFT JOIN pg_locks l1 ON (c.pid = l1.pid and not l1.granted)
LEFT JOIN pg_locks l2 on (l1.relation = l2.relation and l2.granted)
LEFT JOIN pg_stat_activity l ON (l2.pid = l.pid)
LEFT JOIN pg_stat_user_tables t ON (l1.relation = t.relid)
WHERE pg_backend_pid() <> c.pid
ORDER BY datname,
query_start;
/* Use for PostgreSQL 9.1 or less */
/*
SELECT
w.current_query as waiting_query,
w.procpid as w_pid,
w.usename as w_user,
l.current_query as locking_query,
l.procpid as l_pid,
l.usename as l_user,
t.schemaname || '.' || t.relname as tablename
FROM pg_stat_activity w
JOIN pg_locks l1 ON (w.procpid = l1.pid and not l1.granted)
JOIN pg_locks l2 on (l1.relation = l2.relation and l2.granted)
JOIN pg_stat_activity l ON (l2.pid = l.procpid)
JOIN pg_stat_user_tables t ON (l1.relation = t.relid)
WHERE w.waiting;
*/
@@ -0,0 +1,13 @@
SELECT db.datname,
au.rolname as datdba,
pg_encoding_to_char(db.encoding) as encoding,
db.datallowconn,
db.datconnlimit,
db.datfrozenxid,
tb.spcname as tblspc,
-- db.datconfig,
db.datacl
FROM pg_database db
JOIN pg_authid au ON au.oid = db.datdba
JOIN pg_tablespace tb ON tb.oid = db.dattablespace
ORDER BY 1;
@@ -0,0 +1,9 @@
SELECT datname,
pg_size_pretty(pg_database_size(datname))as size_pretty,
pg_database_size(datname) as size,
(SELECT pg_size_pretty (SUM( pg_database_size(datname))::bigint)
FROM pg_database) AS total,
((pg_database_size(datname) / (SELECT SUM( pg_database_size(datname))
FROM pg_database) ) * 100)::numeric(6,3) AS pct
FROM pg_database
ORDER BY datname;
@@ -0,0 +1,11 @@
SELECT DISTINCT t.typname
FROM pg_class c
JOIN pg_attribute a ON ( a.attrelid = c.oid )
JOIN pg_type t ON (t.oid = a.atttypid)
JOIN pg_catalog.pg_namespace s ON (c.relnamespace = s.oid)
WHERE c.relname NOT LIKE 'pg_%'
AND c.relname NOT LIKE 'information%'
AND c.relname NOT LIKE 'sql_%'
AND c.relkind = 'r'
ORDER BY t.typname;
@@ -0,0 +1,18 @@
SELECT t.typname,
e.enumlabel,
e.enumsortorder,
e.enumtypid
FROM pg_type t
JOIN pg_enum e ON e.enumtypid = t.oid
WHERE t.typtype = 'e'
ORDER BY 1, enumsortorder;
--DELETE FROM pg_enum
--WHERE enumtypid = 9999999
-- AND enumsortorder = 4;
--DELETE FROM pg_enum
--WHERE enumtypid = 9999999
-- AND enumlabel = 'medium';
--ALTER TYPE some_enum ADD VALUE 'medium' AFTER 'small';
+11
View File
@@ -0,0 +1,11 @@
SELECT n.nspname as schema,
t.typname as enum,
e.enumsortorder as order,
e.enumlabel as value,
t.oid as oid
FROM pg_type t
JOIN pg_namespace n ON ( n.oid = t.typnamespace )
JOIN pg_enum e ON ( e.enumtypid = t.oid )
WHERE typtype = 'e'
ORDER BY 1, 2, 3;
@@ -0,0 +1,14 @@
SELECT (SELECT oid
FROM pg_database
WHERE datname = current_database()) AS database,
c.relfilenode as filename,
n.nspname as schema,
c.relname as table
FROM pg_class c
JOIN pg_namespace n ON ( n.oid = c.relnamespace )
WHERE relname NOT LIKE 'pg_%' AND
relname NOT LIKE 'information%' AND
relname NOT LIKE 'sql_%' AND
relkind = 'r'
ORDER BY relfilenode;
@@ -0,0 +1,11 @@
SELECT pg_get_indexdef(idx.indexrelid) || ';'
FROM pg_stat_all_indexes i
JOIN pg_class c ON (c.oid = i.relid)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_index idx ON (idx.indexrelid = i.indexrelid )
WHERE NOT idx.indisprimary
AND NOT idx.indisunique
AND i.relname NOT LIKE 'pg_%'
AND i.idx_scan = 0
ORDER BY n.nspname,
i.relname;
@@ -0,0 +1,8 @@
SELECT 'DROP INDEX IF EXISTS "' || n.nspname || '"' || '.' || '"' || i.indexrelname || '"' ||';'
FROM pg_stat_all_indexes i
JOIN pg_class c ON (c.oid = i.relid)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_index idx ON (idx.indexrelid = i.indexrelid )
WHERE NOT idx.indisprimary
AND i.relname NOT LIKE 'pg_%'
ORDER BY i.indexrelname;
@@ -0,0 +1,4 @@
SELECT 'SELECT ''' || relname || ''' ,
(SELECT max_value FROM ' || relname || ');'
FROM pg_class
WHERE relkind = 'S';
@@ -0,0 +1,7 @@
SELECT 'REVOKE ALL PRIVILEGES FROM TABLE public."' || relname || '" FROM <some_user>;'
FROM pg_class
WHERE relname NOT LIKE 'pg_%' AND
relname NOT LIKE 'information%' AND
relname NOT LIKE 'sql_%' AND
relkind = 'r'
ORDER BY relname;
@@ -0,0 +1,10 @@
SELECT 'SELECT ''' ||
c.relname || ''' as table, ' ||
c.reltuples::int4 || ' as rows, ' ||
'(SELECT COUNT(*) FROM ' || s.nspname || '."' || c.relname || '") as cnt;'
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace s ON (c.relnamespace = s.oid)
WHERE nspname = 'public'
AND relkind = 'r'
ORDER BY c.reltuples::int4 DESC;
@@ -0,0 +1,4 @@
SELECT nspname AS "Schema Name"
FROM pg_namespace nsp
JOIN pg_proc pro ON pronamespace=nsp.oid AND proname = 'slonyversion'
ORDER BY nspname;
@@ -0,0 +1,27 @@
BEGIN;
DROP TABLE IF EXISTS tmp_trans_stats;
CREATE TEMP TABLE tmp_trans_stats AS
SELECT 'start_cnt'::varchar(10) AS taken,
SUM(xact_commit + xact_rollback) AS cnt
FROM pg_stat_database;
COMMIT;
SELECT pg_sleep(60);
INSERT INTO tmp_trans_stats
SELECT 'end_cnt'::varchar(10) AS taken,
SUM(xact_commit + xact_rollback) AS cnt
FROM pg_stat_database;
SELECT (
(SELECT cnt
FROM tmp_trans_stats
WHERE taken = 'end_cnt')
- (SELECT cnt
FROM tmp_trans_stats
WHERE taken = 'start_cnt')
) as tot_trans;
@@ -0,0 +1,12 @@
SELECT g.rolname as group,
u.rolname as user,
r.admin_option as admin,
g.rolsuper as g_super,
u.rolsuper as u_super
FROM pg_auth_members r
JOIN pg_authid g ON (r.roleid = g.oid)
JOIN pg_authid u ON (r.member = u.oid)
WHERE u.rolsuper = TRUE
OR g.rolsuper = TRUE
ORDER BY 1, 2;

Some files were not shown because too many files have changed in this diff Show More