May 17, 2026, 11:40 PM
This commit is contained in:
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
@@ -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?
|
||||
@@ -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 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.
|
||||
@@ -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. It’s 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**. It’s 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 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==`
|
||||
|
||||
@@ -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 pipeline’m 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 T‑SQL/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.
|
||||
@@ -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;
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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 | ||||