MySQL Export Data
Overview
Exporting data from MySQL is essential for backup, migration, and data sharing. MySQL provides multiple methods to export data in various formats.
Export Methods
- mysqldump: Complete database export
- SELECT INTO OUTFILE: Direct CSV
- MySQL Workbench: GUI export
- Programming APIs: Application-level export
mysqldump Export
Basic Usage
bash
# Export single database
mysqldump -u root -p database_name > backup.sql
# Export all databases
mysqldump -u root -p --all-databases > all_databases.sql
# Export specific tables
mysqldump -u root -p database_name table1 table2 > tables.sql
# Export with structure only
mysqldump -u root -p --no-data database_name > structure.sql
# Export with data only
mysqldump -u root -p --no-create-info database_name > data.sqlCommon Options
bash
# Export with routines (procedures, functions)
mysqldump -u root -p --routines database_name > backup.sql
# Export with triggers
mysqldump -u root -p --triggers database_name > backup.sql
# Export without triggers
mysqldump -u root -p --skip-triggers database_name > backup.sql
# Export with events
mysqldump -u root -p --events database_name > backup.sql
# Export with extended insert
mysqldump -u root -p --extended-insert database_name > backup.sql
# Export with lock tables
mysqldump -u root -p --lock-tables database_name > backup.sql
# Export with single transaction
mysqldump -u root -p --single-transaction database_name > backup.sqlCompressed Export
bash
# Export and compress with gzip
mysqldump -u root -p database_name | gzip > backup.sql.gz
# Export and compress with bzip2
mysqldump -u root -p database_name | bzip2 > backup.sql.bz2
# Export with different compression levels
mysqldump -u root -p database_name | gzip -9 > backup.sql.gzSELECT INTO OUTFILE / SELECT INTO OUTFILE
CSV Export
sql
-- Export to CSV
SELECT * FROM users
INTO OUTFILE '/tmp/users.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
-- Export with headers
SELECT
'id' AS id,
'name' AS name,
'email' AS email
UNION ALL
SELECT id, name, email FROM users
INTO OUTFILE '/tmp/users_with_headers.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';Custom Delimiter
sql
-- Export with tab delimiter
SELECT * FROM products
INTO OUTFILE '/tmp/products.txt'
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n';
-- Export with pipe delimiter
SELECT * FROM orders
INTO OUTFILE '/tmp/orders.txt'
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n';Secure File Privilege
sql
-- Check secure file priv
SHOW VARIABLES LIKE 'secure_file_priv';
-- If ON, can only export to specific directory
-- Usually /var/lib/mysql-files/ or similar
-- Export to allowed directory
SELECT * FROM users
INTO OUTFILE '/var/lib/mysql-files/users.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"';Export Formats
CSV Format
sql
-- Standard CSV export
SELECT id, name, email, created_at
FROM users
INTO OUTFILE '/tmp/users.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n';JSON Format
sql
-- Export as JSON (MySQL 5.7.8+)
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'id', id,
'name', name,
'email', email
)
) AS users_json
FROM users
INTO OUTFILE '/tmp/users.json';XML Format
sql
-- Use mysqldump for XML
mysqldump -u root -p --xml database_name > backup.xml
-- Export with specific XML format
mysqldump -u root -p --xml --skip-triggers database_name > backup.xmlPartial Exports
Filtered Export
sql
-- Export with WHERE clause
SELECT * FROM orders
INTO OUTFILE '/tmp/recent_orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
WHERE order_date >= '2024-01-01';
-- Export specific columns
SELECT id, name, email
FROM users
INTO OUTFILE '/tmp/users_subset.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"';
-- Export with JOIN
SELECT
u.name,
u.email,
o.order_number,
o.total
FROM users u
JOIN orders o ON u.id = o.user_id
INTO OUTFILE '/tmp/user_orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"';mysqldump Filters
bash
# Export with WHERE clause
mysqldump -u root -p --where="created_at > '2024-01-01'" \
database_name > recent_data.sql
# Export ignoring specific tables
mysqldump -u root -p --ignore-table=database_name.logs \
--ignore-table=database_name.temp_data \
database_name > partial_export.sql
# Export excluding specific columns (requires --no-create-info)
mysqldump -u root -p --no-create-info \
database_name > no_structure.sqlLarge Data Export
Batch Export
sql
-- Export in chunks to avoid memory issues
-- Method 1: LIMIT and OFFSET
SELECT * FROM large_table
INTO OUTFILE '/tmp/chunk1.csv'
FIELDS TERMINATED BY ','
LIMIT 100000;
SELECT * FROM large_table
INTO OUTFILE '/tmp/chunk2.csv'
FIELDS TERMINATED BY ','
LIMIT 100000 OFFSET 100000;
-- Method 2: Date range
SELECT * FROM orders
INTO OUTFILE '/tmp/orders_q1.csv'
WHERE order_date BETWEEN '2024-01-01' AND '2024-03-31';
SELECT * FROM orders
INTO OUTFILE '/tmp/orders_q2.csv'
WHERE order_date BETWEEN '2024-04-01' AND '2024-06-30';Progress Monitoring
bash
# Use pv to monitor progress
mysqldump -u root -p database_name | pv -p -s $(mysql -u root -p -e "SELECT SUM(data_length+index_length)/1024/1024 FROM information_schema.tables WHERE table_schema='database_name'"M) | gzip > backup.sql.gz
# Count exported rows
wc -l backup.sqlExport from Replication
Consistent Export
bash
# Export from slave to reduce load on master
# Ensure slave is consistent
STOP SLAVE;
# Export data
mysqldump -u root -p --master-data=2 \
--single-transaction database_name > backup.sql
# Restart slave
START SLAVE;Export Best Practices
Security Considerations
bash
# Encrypt exported data
mysqldump -u root -p database_name | gpg --encrypt > backup.sql.gpg
# Set file permissions
chmod 600 backup.sql
# Export to secure location
mysqldump -u root -p database_name > /secure/backup/backup.sql
# Remove sensitive data before export
SELECT id, name, email, created_at
-- Exclude password, credit_card, etc.
FROM users
INTO OUTFILE '/tmp/users_anonymized.csv'
FIELDS TERMINATED BY ',';Export Scheduling
bash
# Create cron job for daily backup
# Edit crontab
0 2 * * * mysqldump -u root -p --all-databases | gzip > /backups/daily_$(date +\%Y\%m\%d).sql.gz
# Weekly full backup
0 3 * * 0 mysqldump -u root -p --all-databases --routines --triggers | gzip > /backups/weekly_$(date +\%Y\%m\%d).sql.gzSummary
MySQL data export methods include:
- mysqldump: Complete database dumps
- SELECT INTO OUTFILE: Direct file export
- Multiple Formats: SQL, CSV, JSON, XML
- Filtered Export: Partial data export
- Compressed Export: Save space
Choose appropriate method based on your needs: complete backup, partial export, or format requirements.
Previous: SQL Injection
Next: Import Data