Database Setup & Tools¶
← Voltar para Databases | 🏠 Home
Set up a complete database development environment with multiple database systems, GUI tools, and command-line clients for efficient database work.
Quick Setup Guide¶
SQLite (Recommended for Beginners)¶
# SQLite is usually pre-installed on macOS and Linux
sqlite3 --version
# If not installed:
# macOS
brew install sqlite
# Linux (Ubuntu/Debian)
sudo apt-get install sqlite3
# Windows
# Download from: https://sqlite.org/download.html
First SQLite Database:
# Create and connect to database
sqlite3 myapp.db
# Inside SQLite shell:
.help # Show help
.tables # List tables
.schema table_name # Show table structure
.exit # Exit SQLite
# Run SQL file
sqlite3 myapp.db < setup.sql
# One-liner query
sqlite3 myapp.db "SELECT * FROM users;"
PostgreSQL¶
# macOS (Homebrew)
brew install postgresql
brew services start postgresql
# Linux (Ubuntu/Debian)
sudo apt-get install postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
# Windows
# Download installer from: https://www.postgresql.org/download/
# Create user and database
sudo -u postgres createuser --interactive myapp_user
sudo -u postgres createdb myapp_dev -O myapp_user
# Connect
psql -U myapp_user -d myapp_dev -h localhost
PostgreSQL Configuration:
# Find config files
sudo -u postgres psql -c "SHOW config_file;"
# Common settings in postgresql.conf:
listen_addresses = 'localhost'
port = 5432
max_connections = 100
# Enable connections in pg_hba.conf:
local all myapp_user md5
host all myapp_user 127.0.0.1/32 md5
MySQL/MariaDB¶
# macOS (Homebrew)
brew install mysql
brew services start mysql
# Linux (Ubuntu/Debian)
sudo apt-get install mysql-server
sudo systemctl start mysql
sudo systemctl enable mysql
# Secure installation
sudo mysql_secure_installation
# Create database and user
mysql -u root -p
MySQL Setup:
-- Create database and user
CREATE DATABASE myapp_dev;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON myapp_dev.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
-- Test connection
mysql -u myapp_user -p myapp_dev
GUI Tools¶
DBeaver (Universal Database Tool)¶
# Installation covered in detail in dbeaver.md
brew install --cask dbeaver-community # macOS
sudo snap install dbeaver-ce # Linux
# Windows: Download from dbeaver.io
First Connection Setup: 1. Open DBeaver 2. Click "New Database Connection" 3. Select your database type 4. Configure connection details 5. Test connection 6. Save and connect
Database-Specific GUI Tools¶
PostgreSQL: pgAdmin
# Web-based administration tool
pip install pgadmin4
pgadmin4
# Or download desktop version from:
# https://www.pgadmin.org/download/
MySQL: MySQL Workbench
# Download from: https://dev.mysql.com/downloads/workbench/
brew install --cask mysql-workbench # macOS
SQLite: DB Browser for SQLite
brew install --cask db-browser-for-sqlite # macOS
sudo apt-get install sqlitebrowser # Linux
# Windows: Download from sqlitebrowser.org
Command Line Tools¶
Essential CLI Commands¶
SQLite:
# Basic operations
sqlite3 database.db
.databases # List databases
.tables # List tables
.schema # Show all schemas
.dump # Backup database
.read script.sql # Execute SQL file
.output file.csv # Redirect output
.mode csv # Set output format
PostgreSQL:
# Connection and basic operations
psql -h localhost -U username -d database
\l # List databases
\dt # List tables
\d table_name # Describe table
\i script.sql # Execute SQL file
\o output.txt # Redirect output
\q # Quit
# Backup and restore
pg_dump database > backup.sql
psql database < backup.sql
MySQL:
# Connection and operations
mysql -h localhost -u username -p database
SHOW DATABASES;
USE database_name;
SHOW TABLES;
DESCRIBE table_name;
SOURCE script.sql;
\q
# Backup and restore
mysqldump database > backup.sql
mysql database < backup.sql
Advanced CLI Productivity¶
Create Connection Aliases:
# Add to ~/.bashrc or ~/.zshrc
alias mydb="sqlite3 ~/projects/myapp.db"
alias pgdev="psql -h localhost -U myuser -d myapp_dev"
alias mysqldev="mysql -h localhost -u myuser -p myapp_dev"
# Usage
mydb "SELECT * FROM users LIMIT 5;"
Quick SQL Execution Scripts:
#!/bin/bash
# quick_query.sh - Run SQL against different databases
DB_TYPE=$1
QUERY=$2
case $DB_TYPE in
"sqlite")
sqlite3 ~/projects/app.db "$QUERY"
;;
"postgres")
psql -h localhost -U myuser -d myapp_dev -c "$QUERY"
;;
"mysql")
mysql -h localhost -u myuser -p myapp_dev -e "$QUERY"
;;
*)
echo "Usage: quick_query.sh [sqlite|postgres|mysql] 'SQL QUERY'"
;;
esac
# Usage examples:
# ./quick_query.sh sqlite "SELECT COUNT(*) FROM users;"
# ./quick_query.sh postgres "SELECT version();"
Data Import/Export¶
CSV Import/Export¶
SQLite:
# Import CSV
sqlite3 database.db
.mode csv
.import data.csv table_name
# Export to CSV
.headers on
.mode csv
.output data.csv
SELECT * FROM table_name;
.output stdout
PostgreSQL:
-- Import CSV
COPY table_name FROM '/path/to/data.csv'
WITH (FORMAT csv, HEADER true);
-- Export to CSV
COPY (SELECT * FROM table_name) TO '/path/to/output.csv'
WITH (FORMAT csv, HEADER true);
MySQL:
-- Import CSV
LOAD DATA INFILE '/path/to/data.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
-- Export to CSV
SELECT * FROM table_name
INTO OUTFILE '/path/to/output.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
JSON Import/Export¶
PostgreSQL (JSON Support):
-- Import JSON data
CREATE TABLE json_data (
id SERIAL PRIMARY KEY,
data JSONB
);
INSERT INTO json_data (data)
SELECT * FROM json_populate_recordset(null::json_data, '[
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25}
]');
-- Query JSON data
SELECT data->>'name' as name, data->>'age' as age
FROM json_data;
Development Environment Setup¶
Docker Database Setup¶
# docker-compose.yml for development databases
version: '3.8'
services:
postgres:
image: postgres:15
environment:
POSTGRES_DB: myapp_dev
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypass
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
mysql:
image: mysql:8.0
environment:
MYSQL_DATABASE: myapp_dev
MYSQL_USER: myuser
MYSQL_PASSWORD: mypass
MYSQL_ROOT_PASSWORD: rootpass
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:
mysql_data:
Start development databases:
# Start all databases
docker-compose up -d
# Connect to services
psql -h localhost -p 5432 -U myuser -d myapp_dev
mysql -h localhost -P 3306 -u myuser -p myapp_dev
redis-cli -h localhost -p 6379
# Stop services
docker-compose down
Environment Variables¶
# .env file for database connections
DATABASE_URL=postgresql://myuser:mypass@localhost:5432/myapp_dev
MYSQL_URL=mysql://myuser:mypass@localhost:3306/myapp_dev
REDIS_URL=redis://localhost:6379/0
# Load in scripts
export $(grep -v '^#' .env | xargs)
Database-Specific Configuration¶
PostgreSQL Optimization¶
-- postgresql.conf optimizations for development
shared_buffers = 256MB
work_mem = 4MB
maintenance_work_mem = 64MB
effective_cache_size = 1GB
random_page_cost = 1.1
-- Enable query logging
log_statement = 'all'
log_min_duration_statement = 0
MySQL Optimization¶
-- my.cnf optimizations
[mysqld]
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
max_connections = 100
query_cache_size = 32M
-- Enable slow query log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
SQLite Optimization¶
-- SQLite pragmas for better performance
PRAGMA synchronous = NORMAL;
PRAGMA cache_size = 10000;
PRAGMA temp_store = memory;
PRAGMA journal_mode = WAL;
PRAGMA foreign_keys = ON;
Backup and Recovery¶
Automated Backup Scripts¶
#!/bin/bash
# backup_databases.sh - Automated database backups
BACKUP_DIR="/backups/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
# PostgreSQL backup
pg_dump -h localhost -U myuser myapp_dev > "$BACKUP_DIR/postgres_backup.sql"
# MySQL backup
mysqldump -h localhost -u myuser -p myapp_dev > "$BACKUP_DIR/mysql_backup.sql"
# SQLite backup (just copy file)
cp ~/projects/myapp.db "$BACKUP_DIR/sqlite_backup.db"
# Compress backups
tar -czf "$BACKUP_DIR.tar.gz" "$BACKUP_DIR"
rm -rf "$BACKUP_DIR"
echo "Backup completed: $BACKUP_DIR.tar.gz"
Recovery Procedures¶
# PostgreSQL restore
createdb myapp_restored
psql myapp_restored < backup.sql
# MySQL restore
mysql -u myuser -p myapp_restored < backup.sql
# SQLite restore (copy file back)
cp backup.db ~/projects/myapp.db
Security Setup¶
User Management¶
-- PostgreSQL user management
CREATE ROLE app_readonly;
GRANT CONNECT ON DATABASE myapp_dev TO app_readonly;
GRANT USAGE ON SCHEMA public TO app_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_readonly;
CREATE USER readonly_user WITH PASSWORD 'secure_password';
GRANT app_readonly TO readonly_user;
Connection Security¶
# Use SSL connections in production
psql "postgresql://user:pass@host:5432/db?sslmode=require"
# Limit connection sources
# In pg_hba.conf:
host myapp_dev myuser 10.0.0.0/8 md5
Troubleshooting¶
Common Connection Issues¶
# Check if database service is running
brew services list | grep postgres # macOS
systemctl status postgresql # Linux
# Check listening ports
netstat -tlnp | grep :5432 # PostgreSQL
netstat -tlnp | grep :3306 # MySQL
# Test connectivity
telnet localhost 5432 # PostgreSQL
telnet localhost 3306 # MySQL
Performance Issues¶
-- Check active connections
SELECT * FROM pg_stat_activity; -- PostgreSQL
SHOW PROCESSLIST; -- MySQL
-- Check database sizes
SELECT datname, pg_size_pretty(pg_database_size(datname))
FROM pg_database; -- PostgreSQL
-- Analyze query performance
EXPLAIN ANALYZE SELECT * FROM large_table WHERE condition;
Related Resources¶
- DBeaver - GUI database tool setup and usage
- SQL Basics - Start writing queries
- Schema Design - Database design principles
- Performance - Database optimization techniques