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 MySQL-ის უფრო ახალი X პროტოკოლისთვის. გარედან ჯერ არაფერია ხელმისაწვდომი.
2. შექმენით ბაზა და მომხმარებელი
Ubuntu-ზე MySQL-ის root ანგარიში სოკეტით ავთენტიფიკაციას იყენებს, ამიტომ 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. ნაკლები RAM
უმოქმედოდ, საკუთარი მონაცემების გარეშე, 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სოკეტით შედის და პაროლი არცერთ ფაილში არ დევს.
ასლი, რომელიც არასოდეს აღგიდგენიათ, ჯერ არ ითვლება. აღადგინეთ ის დროებით ბაზაში და მონაცემებს შეხედეთ:
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 ტარიფია და მე-3 ნაბიჯის SSH გვირაბი მათზე მუშაობს. მე-4 ნაბიჯს საკუთარი IPv4 სჭირდება: Micro-IP $10/თვე ღირს.
PostgreSQL გირჩევნიათ? PostgreSQL-ის სახელმძღვანელო იმავე გეგმას მიჰყვება. ყველა ტარიფი VPS განყოფილებაშია, გადახდა კი USDT-ით, USDC-ით ან ETH-ით Base, Ethereum ან Polygon ქსელებში.
კომენტარები
ჯერ არ არის კომენტარები. იყავით პირველი.