EQVPS
לוח בקרההתחלה

איך להתקין MySQL על VPS: משתמשים, גישה מרחוק בטוחה, פחות זיכרון וגיבויים

מתקינים MySQL 8.0 על VPS עם Ubuntu 24.04, יוצרים מסד נתונים ומשתמש לאפליקציה, מתחברים מהמחשב שלכם בלי לפתוח את פורט 3306, מורידים את הזיכרון במנוחה מ-383 MB ל-165 MB ומגבים כל לילה בסקריפט שנכשל בקול רם.

התקנת 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.

שאלות נפוצות

MySQL או MariaDB?

שניהם נמצאים במאגרים של Ubuntu 24.04 עצמה: mysql-server מתקין את MySQL 8.0 ו-mariadb-server מתקין את MariaDB 10.11. רוב האפליקציות שדורשות "MySQL" עובדות עם שניהם. השתמשו במה שמופיע בתיעוד של האפליקציה, וב-MySQL 8.0 אם זה לא משנה. המדריך הזה משתמש ב-MySQL.

מה הסיסמה של root ב-MySQL?

אין כזו. ב-Ubuntu חשבון root של MySQL משתמש באימות דרך socket: sudo mysql מכניס אתכם כ-root, ואף אחד לא יכול להתחבר כ-root דרך הרשת. השאירו את זה כך וצרו משתמשים נפרדים לאפליקציות.

האם לפתוח את פורט 3306 לאינטרנט?

לא. פורטים פתוחים של מסדי נתונים נסרקים ומותקפים בניחושי סיסמאות כל הזמן. מהמחשב שלכם התחברו דרך מנהרת SSH. אם שרת אחר חייב להתחבר ישירות, התירו רק את ה-IP שלו, גם ב-MySQL וגם בחומת האש.

כמה זיכרון MySQL צריך?

מייד אחרי ההתקנה MySQL 8.0 צרך בשרת הבדיקה שלנו 383 MB, בלי מסדי נתונים משלו. עם Performance Schema כבוי ו-buffer pool צנוע הוא ירד ל-165 MB. חבילת Micro עם 2 GB מריצה MySQL ואפליקציה בנוחות; אחרי הכוונון הזה גם 1 GB מספיק לאתר קטן.

האם צריך להריץ mysql_secure_installation?

ב-Ubuntu 24.04 רוב העבודה שלו כבר נעשתה. בהתקנה החדשה שלנו לא היו משתמשים אנונימיים ולא מסד נתונים לבדיקות, ו-root יכול להתחבר רק דרך ה-socket המקומי. הריצו אותו אם אתם רוצים את רכיב בדיקת חוזק הסיסמאות שהוא מציע; אחרת אפשר לדלג.

תגובות

אין עדיין תגובות. היו הראשונים.

השאירו תגובה

התגובות עוברות מודרציה לפני שהן מופיעות.