chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,557 @@
|
||||
# Database Error Patterns
|
||||
|
||||
Common database errors across PostgreSQL, MySQL, MongoDB, Redis, and SQLite.
|
||||
|
||||
## Connection Errors
|
||||
|
||||
### Connection Refused
|
||||
|
||||
```
|
||||
Error: connect ECONNREFUSED 127.0.0.1:5432
|
||||
FATAL: connection refused
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Database server not running
|
||||
2. Wrong host/port
|
||||
3. Firewall blocking connection
|
||||
4. Max connections reached
|
||||
|
||||
**Diagnosis**:
|
||||
```bash
|
||||
# Check if database is running
|
||||
# PostgreSQL
|
||||
pg_isready -h localhost -p 5432
|
||||
|
||||
# MySQL
|
||||
mysqladmin ping -h localhost
|
||||
|
||||
# Check port
|
||||
lsof -i :5432
|
||||
netstat -an | grep 5432
|
||||
|
||||
# Check process
|
||||
ps aux | grep postgres
|
||||
ps aux | grep mysql
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Start database
|
||||
# PostgreSQL
|
||||
brew services start postgresql # macOS
|
||||
sudo systemctl start postgresql # Linux
|
||||
|
||||
# MySQL
|
||||
brew services start mysql # macOS
|
||||
sudo systemctl start mysql # Linux
|
||||
|
||||
# Docker
|
||||
docker start postgres_container
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Authentication Failed
|
||||
|
||||
```
|
||||
FATAL: password authentication failed for user "username"
|
||||
Access denied for user 'root'@'localhost'
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Wrong password
|
||||
2. User doesn't exist
|
||||
3. Wrong authentication method
|
||||
4. User lacks permissions
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# PostgreSQL - reset password
|
||||
sudo -u postgres psql
|
||||
ALTER USER username PASSWORD 'newpassword';
|
||||
|
||||
# MySQL - reset password
|
||||
mysql -u root
|
||||
ALTER USER 'username'@'localhost' IDENTIFIED BY 'newpassword';
|
||||
FLUSH PRIVILEGES;
|
||||
|
||||
# Check pg_hba.conf for auth method (PostgreSQL)
|
||||
# Change 'peer' to 'md5' or 'scram-sha-256' for password auth
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Database Does Not Exist
|
||||
|
||||
```
|
||||
FATAL: database "mydb" does not exist
|
||||
Unknown database 'mydb'
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# PostgreSQL
|
||||
createdb mydb
|
||||
# Or in psql:
|
||||
CREATE DATABASE mydb;
|
||||
|
||||
# MySQL
|
||||
mysql -u root -p -e "CREATE DATABASE mydb;"
|
||||
|
||||
# Check existing databases
|
||||
psql -l # PostgreSQL
|
||||
mysql -e "SHOW DATABASES;" # MySQL
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Connection Timeout
|
||||
|
||||
```
|
||||
Error: Connection timed out
|
||||
FATAL: connection timeout expired
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Network latency
|
||||
2. Database overloaded
|
||||
3. Firewall issues
|
||||
4. DNS resolution slow
|
||||
|
||||
**Solutions**:
|
||||
```javascript
|
||||
// Increase connection timeout
|
||||
// Node.js pg
|
||||
const pool = new Pool({
|
||||
connectionTimeoutMillis: 10000, // 10 seconds
|
||||
})
|
||||
|
||||
// Prisma
|
||||
datasource db {
|
||||
url = "postgresql://...?connect_timeout=10"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Too Many Connections
|
||||
|
||||
```
|
||||
FATAL: too many connections for role "postgres"
|
||||
ERROR 1040 (HY000): Too many connections
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Connection leaks (not closing connections)
|
||||
2. Pool size too large
|
||||
3. Max connections too low
|
||||
|
||||
**Diagnosis**:
|
||||
```sql
|
||||
-- PostgreSQL
|
||||
SELECT count(*) FROM pg_stat_activity;
|
||||
SELECT * FROM pg_stat_activity WHERE state = 'idle';
|
||||
|
||||
-- MySQL
|
||||
SHOW PROCESSLIST;
|
||||
SHOW STATUS LIKE 'Threads_connected';
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```sql
|
||||
-- PostgreSQL - increase max connections
|
||||
ALTER SYSTEM SET max_connections = 200;
|
||||
-- Requires restart
|
||||
|
||||
-- MySQL
|
||||
SET GLOBAL max_connections = 200;
|
||||
```
|
||||
|
||||
```javascript
|
||||
// Use connection pooling properly
|
||||
const pool = new Pool({
|
||||
max: 20, // Pool size
|
||||
idleTimeoutMillis: 30000,
|
||||
connectionTimeoutMillis: 2000,
|
||||
})
|
||||
|
||||
// Always release connections
|
||||
const client = await pool.connect()
|
||||
try {
|
||||
await client.query('...')
|
||||
} finally {
|
||||
client.release() // Important!
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Query Errors
|
||||
|
||||
### Syntax Error
|
||||
|
||||
```
|
||||
ERROR: syntax error at or near "FROM"
|
||||
You have an error in your SQL syntax
|
||||
```
|
||||
|
||||
**Common Causes**:
|
||||
1. Missing quotes around strings
|
||||
2. Reserved word used as identifier
|
||||
3. Missing comma in list
|
||||
4. Wrong function name
|
||||
|
||||
**Solutions**:
|
||||
```sql
|
||||
-- Quote reserved words
|
||||
SELECT "order", "user" FROM "table"; -- PostgreSQL
|
||||
SELECT `order`, `user` FROM `table`; -- MySQL
|
||||
|
||||
-- Check string quoting
|
||||
WHERE name = 'John' -- Correct
|
||||
WHERE name = "John" -- Wrong in PostgreSQL (double quotes = identifier)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Column Does Not Exist
|
||||
|
||||
```
|
||||
ERROR: column "username" does not exist
|
||||
Unknown column 'username' in 'field list'
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Typo in column name
|
||||
2. Case sensitivity issue
|
||||
3. Column not in table
|
||||
4. Wrong table alias
|
||||
|
||||
**Diagnosis**:
|
||||
```sql
|
||||
-- PostgreSQL
|
||||
\d table_name
|
||||
|
||||
-- MySQL
|
||||
DESCRIBE table_name;
|
||||
SHOW COLUMNS FROM table_name;
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```sql
|
||||
-- PostgreSQL is case-sensitive with quoted identifiers
|
||||
SELECT "Username" FROM users; -- Looks for exact "Username"
|
||||
SELECT username FROM users; -- Looks for lowercase
|
||||
|
||||
-- Check actual columns
|
||||
SELECT column_name FROM information_schema.columns
|
||||
WHERE table_name = 'users';
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Relation/Table Does Not Exist
|
||||
|
||||
```
|
||||
ERROR: relation "users" does not exist
|
||||
Table 'database.users' doesn't exist
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Table not created
|
||||
2. Wrong schema/database
|
||||
3. Typo in table name
|
||||
4. Migrations not run
|
||||
|
||||
**Solutions**:
|
||||
```sql
|
||||
-- Check existing tables
|
||||
-- PostgreSQL
|
||||
\dt
|
||||
SELECT table_name FROM information_schema.tables
|
||||
WHERE table_schema = 'public';
|
||||
|
||||
-- MySQL
|
||||
SHOW TABLES;
|
||||
|
||||
-- Check current schema
|
||||
SELECT current_schema(); -- PostgreSQL
|
||||
SELECT DATABASE(); -- MySQL
|
||||
```
|
||||
|
||||
```bash
|
||||
# Run migrations
|
||||
npx prisma migrate dev
|
||||
npx sequelize-cli db:migrate
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Constraint Violation
|
||||
|
||||
#### Unique Constraint
|
||||
|
||||
```
|
||||
ERROR: duplicate key value violates unique constraint
|
||||
Duplicate entry 'value' for key 'PRIMARY'
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```sql
|
||||
-- Check for existing value
|
||||
SELECT * FROM users WHERE email = 'test@example.com';
|
||||
|
||||
-- Upsert instead of insert
|
||||
-- PostgreSQL
|
||||
INSERT INTO users (email, name) VALUES ('test@example.com', 'Test')
|
||||
ON CONFLICT (email) DO UPDATE SET name = EXCLUDED.name;
|
||||
|
||||
-- MySQL (8.0.20+)
|
||||
INSERT INTO users (email, name) VALUES ('test@example.com', 'Test') AS new_values
|
||||
ON DUPLICATE KEY UPDATE name = new_values.name;
|
||||
```
|
||||
|
||||
#### Foreign Key Constraint
|
||||
|
||||
```
|
||||
ERROR: insert or update violates foreign key constraint
|
||||
Cannot add or update a child row: a foreign key constraint fails
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```sql
|
||||
-- Check if referenced record exists
|
||||
SELECT * FROM parent_table WHERE id = 123;
|
||||
|
||||
-- Insert parent first, then child
|
||||
INSERT INTO parent_table (id) VALUES (123);
|
||||
INSERT INTO child_table (parent_id) VALUES (123);
|
||||
|
||||
-- Or use CASCADE
|
||||
ALTER TABLE child_table
|
||||
ADD CONSTRAINT fk_parent
|
||||
FOREIGN KEY (parent_id) REFERENCES parent_table(id)
|
||||
ON DELETE CASCADE;
|
||||
```
|
||||
|
||||
#### Not Null Constraint
|
||||
|
||||
```
|
||||
ERROR: null value in column "email" violates not-null constraint
|
||||
Column 'email' cannot be null
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```sql
|
||||
-- Provide value
|
||||
INSERT INTO users (name, email) VALUES ('Test', 'test@example.com');
|
||||
|
||||
-- Or add default
|
||||
ALTER TABLE users ALTER COLUMN email SET DEFAULT 'default@example.com';
|
||||
|
||||
-- Or make nullable
|
||||
ALTER TABLE users ALTER COLUMN email DROP NOT NULL; -- PostgreSQL
|
||||
ALTER TABLE users MODIFY email VARCHAR(255) NULL; -- MySQL
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Deadlock
|
||||
|
||||
```
|
||||
ERROR: deadlock detected
|
||||
Deadlock found when trying to get lock
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Transactions waiting on each other
|
||||
2. Lock ordering inconsistent
|
||||
3. Long-running transactions
|
||||
|
||||
**Solutions**:
|
||||
```sql
|
||||
-- Always access tables in same order across transactions
|
||||
|
||||
-- Keep transactions short
|
||||
BEGIN;
|
||||
-- Quick operations only
|
||||
COMMIT;
|
||||
|
||||
-- Use appropriate isolation level
|
||||
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
|
||||
```
|
||||
|
||||
```javascript
|
||||
// Helper function
|
||||
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms))
|
||||
|
||||
// Retry on deadlock
|
||||
async function withRetry(fn, maxRetries = 3) {
|
||||
for (let i = 0; i < maxRetries; i++) {
|
||||
try {
|
||||
return await fn()
|
||||
} catch (error) {
|
||||
if (error.code === '40P01' && i < maxRetries - 1) { // Deadlock
|
||||
await sleep(100 * (i + 1))
|
||||
continue
|
||||
}
|
||||
throw error
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## MongoDB Errors
|
||||
|
||||
### MongoServerSelectionError
|
||||
|
||||
```
|
||||
MongoServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Start MongoDB
|
||||
brew services start mongodb-community # macOS
|
||||
sudo systemctl start mongod # Linux
|
||||
|
||||
# Check status
|
||||
mongosh --eval "db.adminCommand('ping')"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### MongoError: E11000 duplicate key error
|
||||
|
||||
```
|
||||
MongoError: E11000 duplicate key error collection: db.users index: email_1
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```javascript
|
||||
// Upsert
|
||||
await User.findOneAndUpdate(
|
||||
{ email: 'test@example.com' },
|
||||
{ $set: { name: 'Test' } },
|
||||
{ upsert: true }
|
||||
)
|
||||
|
||||
// Or handle error
|
||||
try {
|
||||
await user.save()
|
||||
} catch (error) {
|
||||
if (error.code === 11000) {
|
||||
// Handle duplicate
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### MongooseError: Operation timed out
|
||||
|
||||
```
|
||||
MongooseError: Operation `users.find()` buffering timed out after 10000ms
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Not connected to database
|
||||
2. Connection dropped
|
||||
3. Query too slow
|
||||
|
||||
**Solutions**:
|
||||
```javascript
|
||||
// Wait for connection
|
||||
await mongoose.connect(uri)
|
||||
console.log('Connected to MongoDB')
|
||||
|
||||
// Then start server
|
||||
app.listen(3000)
|
||||
|
||||
// Add connection events
|
||||
mongoose.connection.on('error', console.error)
|
||||
mongoose.connection.on('disconnected', () => {
|
||||
console.log('MongoDB disconnected')
|
||||
})
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Redis Errors
|
||||
|
||||
### ECONNREFUSED
|
||||
|
||||
```
|
||||
Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Start Redis
|
||||
brew services start redis # macOS
|
||||
sudo systemctl start redis # Linux
|
||||
|
||||
# Test connection
|
||||
redis-cli ping
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### WRONGTYPE
|
||||
|
||||
```
|
||||
WRONGTYPE Operation against a key holding the wrong kind of value
|
||||
```
|
||||
|
||||
**Causes**:
|
||||
1. Key exists with different type
|
||||
2. Using wrong command for data type
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Check key type
|
||||
TYPE mykey
|
||||
|
||||
# Delete and recreate with correct type
|
||||
DEL mykey
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### OOM command not allowed
|
||||
|
||||
```
|
||||
OOM command not allowed when used memory > 'maxmemory'
|
||||
```
|
||||
|
||||
**Solutions**:
|
||||
```bash
|
||||
# Increase max memory
|
||||
redis-cli CONFIG SET maxmemory 2gb
|
||||
|
||||
# Set eviction policy
|
||||
redis-cli CONFIG SET maxmemory-policy allkeys-lru
|
||||
|
||||
# In redis.conf
|
||||
maxmemory 2gb
|
||||
maxmemory-policy allkeys-lru
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference Table
|
||||
|
||||
| Error | Database | Quick Fix |
|
||||
|-------|----------|-----------|
|
||||
| Connection refused | All | Start database service |
|
||||
| Auth failed | All | Check credentials, reset password |
|
||||
| DB doesn't exist | All | Create database |
|
||||
| Too many connections | All | Use connection pooling |
|
||||
| Unique constraint | All | Use upsert |
|
||||
| Foreign key violation | All | Insert parent first |
|
||||
| Deadlock | All | Retry with backoff |
|
||||
| E11000 duplicate | MongoDB | Use findOneAndUpdate with upsert |
|
||||
| WRONGTYPE | Redis | Check key type with TYPE |
|
||||
Reference in New Issue
Block a user