התקנת MySQL היא פקודה אחת. רוב העבודה מגיעה אחר כך: משתמש לאפליקציה, דרך להגיע למסד הנתונים מהמחשב שלכם בלי לחשוף את פורט 3306 לאינטרנט, הגדרות זיכרון לשרת קטן וגיבויים שרצים בלעדיכם. המדריך הזה מכסה את ארבעתם ב-Ubuntu 24.04. כל שלב הורץ באימג' ה-Ubuntu 24.04 שלנו, והמספרים שלהלן מגיעים מאותו שרת.
הריצו את הפקודות כמשתמש עם sudo. מדריך ההגדרה של Ubuntu יוצר אחד.
1. התקנה
sudo apt update
sudo apt install -y mysql-server
mysql --version
ההתקנה לקחה בשרת שלנו 51 שניות והביאה את MySQL 8.0.46. הוא עולה מייד, עולה שוב בכל אתחול ומאזין רק על השרת עצמו: 127.0.0.1:3306 לחיבורים רגילים ו-127.0.0.1:33060 לפרוטוקול X החדש יותר של MySQL. מבחוץ עדיין אי אפשר להגיע לשום דבר.
2. צרו מסד נתונים ומשתמש
חשבון root של MySQL משתמש ב-Ubuntu באימות דרך socket, ולכן sudo mysql מכניס אתכם בלי סיסמה. צרו מסד נתונים ומשתמש לאפליקציה:
sudo mysql
CREATE DATABASE app CHARACTER SET utf8mb4;
CREATE USER 'app'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'localhost';
EXIT;
בדקו את זה כמו שהאפליקציה תתחבר:
mysql -u app -p app -e "SELECT CURRENT_USER();"
אמור להודפס app@localhost. סיסמה שגויה מקבלת ERROR 1045 (28000): Access denied for user 'app'@'localhost'. המשתמש יכול לעשות הכול בתוך app ושום דבר מחוצה לו.
3. התחברות מהמחשב שלכם: מנהרת SSH
כדי להשתמש בלקוח שולחני כמו DBeaver, MySQL Workbench או שורת הפקודה mysql במחשב שלכם, אל תפתחו פורט. העבירו אחד דרך SSH:
ssh -L 3307:127.0.0.1:3306 deploy@YOUR.SERVER.IP
בחבילת NAT הוסיפו -p ואת פורט ה-SSH האישי מלוח הבקרה. כל עוד החלון הזה פתוח, כוונו את הלקוח למארח 127.0.0.1, פורט 3307, משתמש app. בצד המקומי בחרנו 3307 כדי לא להתנגש ב-MySQL שאולי רץ אצלכם במחשב. בבדיקה שלנו השרת ענה מייד דרך המנהרה, ואילו חיבור ישיר לכתובת שלו בפורט 3306 נדחה.
4. גישה ישירה לשרת אחר אחד
לפעמים האפליקציה רצה על שרת שני וצריכה להתחבר ישירות. לשם כך מסד הנתונים צריך חבילה עם IPv4 משלה, כי חבילת NAT מעבירה רק את פורט ה-SSH שלכם. שלושה שינויים, כולם מוגבלים לכתובת שרת האפליקציה (כאן 203.0.113.20):
sudo sed -i 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql
sudo ufw allow from 203.0.113.20 to any port 3306 proto tcp
CREATE USER 'app'@'203.0.113.20' IDENTIFIED BY 'a-long-random-password';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'203.0.113.20';
אם ufw עוד לא מופעל, התירו קודם SSH (sudo ufw allow OpenSSH) ואז הריצו sudo ufw enable. הפרטים נמצאים במדריך ufw.
בדקנו את שני המנעולים בנפרד. עם כלל בחומת האש אבל בלי משתמש MySQL מתאים, השרת סירב עם error 1130: Host '…' is not allowed to connect to this MySQL server. כשהוספנו את המשתמש, החיבור עבר. כשהסרנו את כלל חומת האש, החיבור פשוט נתקע עד תום הזמן. כל כתובת אחרת באינטרנט מקבלת את אותו תום זמן.
5. פחות זיכרון
במנוחה, בלי נתונים משלו, MySQL 8.0 צרך בשרת שלנו 383 MB. רובם הולכים ל-Performance Schema, כלי אבחון ששומר זיכרון מראש. ב-VPS קטן כבו אותו וקבעו בעצמכם את גודל המטמון הראשי:
sudo tee /etc/mysql/mysql.conf.d/zz-small-vps.cnf >/dev/null <<'EOF'
[mysqld]
performance_schema = OFF
innodb_buffer_pool_size = 256M
max_connections = 50
EOF
sudo systemctl restart mysql
ps -o rss= -C mysqld
אחרי ההפעלה מחדש הוא צרך 165 MB. ה-buffer pool שומר במטמון את הנתונים והאינדקסים שלכם, ו-256 MB מתאימים לשרת של 2 GB שמריץ גם את האפליקציה. הגדילו אותו אם מסד הנתונים הוא העיקר בשרת וגדל מעבר לגודל המטמון. max_connections = 50 מספיק בשפע לאפליקציה אחת עם מאגר חיבורים. אתם מאבדים את הסטטיסטיקות של performance_schema. הפעילו אותו מחדש אם תצטרכו פעם לחקור לעומק שאילתות איטיות.
6. גיבויים כל לילה
mysqldump --single-transaction לוקח עותק עקבי של טבלאות InnoDB בלי לנעול את האפליקציה. שימו אותו בסקריפט קטן:
sudo tee /usr/local/bin/mysql-backup >/dev/null <<'EOF'
#!/bin/bash
set -euo pipefail
umask 077
mkdir -p /var/backups/mysql
mysqldump --single-transaction --routines --triggers app | gzip > /var/backups/mysql/app-$(date +%F).sql.gz
find /var/backups/mysql -name 'app-*.sql.gz' -mtime +14 -delete
EOF
sudo chmod 755 /usr/local/bin/mysql-backup
echo '0 3 * * * root /usr/local/bin/mysql-backup' | sudo tee /etc/cron.d/mysql-backup
sudo /usr/local/bin/mysql-backup && sudo ls -l /var/backups/mysql
לכל שורה יש סיבה:
umask 077הופך את קובץ הגיבוי לקריא רק ל-root (-rw-------), כי יש בו את כל הנתונים שלכם.pipefailגורם לכל הסקריפט להיכשל אםmysqldumpנכשל. בלעדיוgzipהיה כותב ארכיון זעיר וריק ומדווח על הצלחה. שברנו את הפקודה בכוונה, והסקריפט יצא עם קוד 2, כמו שצריך.find … -mtime +14 -deleteשומר עותקים של שבועיים.- הסקריפט רץ כ-root, ולכן
mysqldumpמתחבר דרך ה-socket ואין סיסמה באף קובץ.
גיבוי שמעולם לא שחזרתם עדיין לא נחשב. שחזרו אותו למסד נתונים זמני והסתכלו על הנתונים:
sudo mysql -e "CREATE DATABASE app_restore"
gunzip -c /var/backups/mysql/app-2026-10-25.sql.gz | sudo mysql app_restore
sudo mysql -e "SHOW TABLES FROM app_restore"
sudo mysql -e "DROP DATABASE app_restore"
בבדיקה שלנו בטבלה המשוחזרת היו אותן שורות כמו במקור. עותקים על אותו דיסק לא יגנו עליכם אם תאבדו את השרת, אז העבירו אותם מדי פעם למכונה אחרת עם scp או restic. Managed Backups מוסיף על כך נקודות שחזור יומיות של השרת כולו.
איזו חבילה
Micro (2 vCPU, 2 GB, 25 GB, $5 לחודש) מחזיקה MySQL מכוונן כמו למעלה ועוד אפליקציית אינטרנט. אם מסד הנתונים עצמו יעבור כמה גיגה-בייט, Small עם 4 GB ו-35 GB ב-$8 לחודש תאפשר לתת ל-buffer pool 1 GB ומעלה. שתיהן חבילות NAT, ומנהרת ה-SSH משלב 3 עובדת בהן. שלב 4 דורש IPv4 משלכם: Micro-IP עולה $10 לחודש.
מעדיפים PostgreSQL? מדריך PostgreSQL בנוי לפי אותה תוכנית. כל החבילות נמצאות במדור VPS, והתשלום ב-USDT, USDC או ETH ברשתות Base, Ethereum או Polygon.
תגובות
אין עדיין תגובות. היו הראשונים.