Проверка консистентности данных в SQLite базах данных MikoPBX после операций REST API...
Quick database verification for MikoPBX after REST API operations to ensure data consistency and referential integrity.
Use this skill when you need to:
All queries execute inside the MikoPBX Docker container using docker exec with sqlite3:
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db "SELECT * FROM m_Extensions LIMIT 5"
/cf/conf/mikopbx.dbPrimary configuration database containing:
Call detail records database:
cdr_general - Historical call recordscdr - Active calls# List MikoPBX containers
docker ps | grep mikopbx
# Or use auto-detection script
./scripts/db_query.sh "SELECT 1"
# Using docker exec directly
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT * FROM m_Extensions LIMIT 5" -header -column
# Using helper script
./scripts/db_query.sh "SELECT * FROM m_Extensions LIMIT 5"
# Column format (default, readable)
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT * FROM m_Extensions LIMIT 5" -header -column
# JSON format (for scripts)
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT * FROM m_Extensions LIMIT 5" -json
# CSV export
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT * FROM m_Extensions" -csv -header > extensions.csv
After creating extension via API:
# Check extension exists
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT number, type, callerid, userid FROM m_Extensions WHERE number='100'" \
-header -column
# Check SIP account created (for SIP extensions)
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT extension, secret, transport FROM m_Sip WHERE extension='100'" \
-header -column
# Verify complete profile with foreign keys
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT e.number, e.type, e.callerid, u.username, u.email, s.secret
FROM m_Extensions e
LEFT JOIN m_Users u ON e.userid = u.id
LEFT JOIN m_Sip s ON e.number = s.extension
WHERE e.number='100'" \
-header -column
Expected: All fields populated, foreign keys valid (no NULLs for required relationships)
After creating/updating provider:
# Check provider record
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT uniqid, type, description, host, disabled FROM m_Providers
WHERE uniqid='PROVIDER_ID'" -header -column
# Verify routing rules exist
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT
(SELECT COUNT(*) FROM m_IncomingRoutingTable WHERE provider='PROVIDER_ID') as incoming,
(SELECT COUNT(*) FROM m_OutgoingRoutingTable WHERE providerid='PROVIDER_ID') as outbound"
Expected: Provider exists, has at least one routing rule
After creating/modifying queue:
# Check queue with members
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT cq.name, cq.extension, cq.strategy,
e.number as member_ext, e.callerid as member_name,
cqm.priority
FROM m_CallQueues cq
LEFT JOIN m_CallQueueMembers cqm ON cq.uniqid = cqm.queue
LEFT JOIN m_Extensions e ON cqm.extension = e.number
WHERE cq.uniqid='QUEUE_ID'
ORDER BY cqm.priority" -header -column
Expected: Queue exists, all members have valid extensions, priorities are correct
Find broken foreign key relationships:
# Orphaned SIP accounts (no matching extension)
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT s.extension FROM m_Sip s
LEFT JOIN m_Extensions e ON s.extension = e.number
WHERE e.number IS NULL"
# SIP extensions without accounts
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT e.number FROM m_Extensions e
LEFT JOIN m_Sip s ON e.number = s.extension
WHERE e.type='SIP' AND s.extension IS NULL"
# Routing rules pointing to non-existent extensions
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT ir.number, ir.extension FROM m_IncomingRoutingTable ir
LEFT JOIN m_Extensions e ON ir.extension = e.number
WHERE ir.action='extension' AND e.number IS NULL"
Expected: No results (empty) - indicates data integrity is maintained
Verify call routing and recording:
# Calls for specific extension (last 20)
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT start, src_num, dst_num, duration, billsec, disposition
FROM cdr_general
WHERE src_num = '100' OR dst_num = '100'
ORDER BY start DESC
LIMIT 20" -header -column
# Answered calls today
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT COUNT(*) as total_calls, SUM(billsec) as total_duration
FROM cdr_general
WHERE DATE(start) = DATE('now')
AND disposition = 'ANSWERED'"
# Active calls right now
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT src_num, dst_num, start, duration FROM cdr
WHERE endtime IS NULL OR endtime = ''" -header -column
Expected: Call records match expected call flow
For complete schema with all columns and relationships, see Schema Reference
The scripts/db_query.sh helper script simplifies queries:
# Auto-detect container
./scripts/db_query.sh "SELECT * FROM m_Extensions LIMIT 5"
# Specify container
./scripts/db_query.sh -c abc123 "SELECT * FROM m_Users"
# JSON output
./scripts/db_query.sh -f json "SELECT * FROM m_Extensions"
# CSV export
./scripts/db_query.sh -f csv "SELECT * FROM m_Extensions" > extensions.csv
# Different database (CDR)
./scripts/db_query.sh -d /storage/usbdisk1/mikopbx/astlogs/asterisk_cdr/master.db \
"SELECT * FROM cdr LIMIT 10"
# Show help
./scripts/db_query.sh --help
# Check processes using database
docker exec <container_id> lsof /cf/conf/mikopbx.db
# Use read-only mode
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db \
"SELECT * FROM m_Extensions" -readonly
# Run as root
docker exec -u root <container_id> sqlite3 /cf/conf/mikopbx.db "SELECT 1"
# Verify database exists
docker exec <container_id> ls -l /cf/conf/mikopbx.db
# Find CDR database location
docker exec <container_id> find /storage -name "*.db"
/Users/nb/PhpstormProjects/mikopbx/Core/src/Common/Models/CLAUDE.md/Users/nb/PhpstormProjects/mikopbx/Core/src/PBXCoreREST/CLAUDE.md-header -column for readable output during development-json for scripting and automationLIMIT for tables like CDR# List all tables
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db ".tables"
# Show table schema
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db ".schema m_Extensions"
# Count records
docker exec <container_id> sqlite3 /cf/conf/mikopbx.db "SELECT COUNT(*) FROM m_Extensions"
# Interactive mode
docker exec -it <container_id> sqlite3 /cf/conf/mikopbx.db
Need more examples? See Common Queries for 50+ query patterns.
Need verification workflows? See Verification Scenarios for complete step-by-step guides.