Thank you for reading this post, don't forget to subscribe!
Зачем использовать оперативную память
RAM (оперативное запоминающее устройство) намного быстрее для чтения и записи, чем для других типов хранилищ на компьютере, таких как жесткий диск / ssd, где MySQL по умолчанию хранит базу данных. Перемещение базы данных в оперативную память может значительно увеличить скорость ввода и вывода операций с базой данных.
Недостатки работы с MySQL используя RAM-диск
ОЗУ — это энергозависимая память, что означает, что для сохранения хранимых в ней данных требуется питание. Это означает, что данные, хранящиеся в оперативной памяти, исчезнут после выключения компьютера. В моем случае я использую базу данных только для тестирования и разработки на моем локальном компьютере. Если мне когда-нибудь понадобится сохранить данные для тестирования, я просто сделаю резервную копию базы данных, а затем восстановлю ее в следующий раз, когда она мне понадобится.
Перенос баз данных в оперативную память
Теперь, когда вы знаете преимущества и недостатки перемещения баз данных MySQL на RAM-диск, я расскажу вам, как этого добиться.
Сначала сделайте резервную копию всех баз данных. Скопируем его в /var/lib/mysql.bak
sudo cp -pRL /var/lib/mysql /var/lib/mysql.bak
Создайте каталог для RAM-диска.
sudo mkdir /tmp/ramdisk
Установите его. Я назначил рамдиску размер 2ГБ. Вам решать, сколько места вы хотите, просто убедитесь, что оно может вместить все данные, которые вы будете записывать в базу данных.
sudo mount -t tmpfs -o size=2G tmpfs /tmp/ramdisk/
Переместите базы данных MySQL на RAM-диск.
sudo mv /var/lib/mysql /tmp/ramdisk/mysql
Создайте символическую ссылку на RAM-диск.
sudo ln -s /tmp/ramdisk/mysql /var/lib/mysql
Измените принадлежность на MySQL, чтобы разрешить доступ.
sudo chown mysql:mysql /tmp/ramdisk/mysql
Перезапустите MySQL, чтобы изменения вступили в силу.
sudo /etc/init.d/mysql restart
Теперь мы закончили! После перемещения баз данных на RAM-диск выполнение миграции и сеялки заняло всего минуту по сравнению с почти часом при использовании жесткого диска.
Восстановление баз данных
Поскольку базы данных сохраняются на RAM-диске, они будут удаляться каждый раз при выключении компьютера. Вот шаги для его восстановления.
Удалите ранее созданную символическую ссылку на mysql ramdisk.
sudo rm -rf /var/lib/mysql
Скопируйте и восстановите базы данных из резервной копии.
sudo cp -pRL /var/lib/mysql.bak /var/lib/mysql
Скрипты для удобства
Выполнение всех вышеперечисленных команд каждый раз, когда я включаю свой компьютер, является очень утомительной задачей, поэтому для моего удобства я создал сценарии для восстановления и перемещения баз данных в оперативную память.
Вот сценарий восстановления базы данных
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash # Script for restoring backed up database that was moved to the RAM Disk. if [ $(uname) = "Linux" ]; then # Delete detached symlink [ -L /var/lib/mysql ] && sudo rm -rf /var/lib/mysql # Restore backups [ -d /var/lib/mysql.bak ] && sudo cp -pRL /var/lib/mysql.bak /var/lib/mysql else echo "Unsupported platform." fi |
Вот сценарий для переноса базы данных в оперативную память
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#!/bin/bash # Create ramdisk if it doesn't exist. [ ! -d /tmp/ramdisk ] && sudo mkdir /tmp/ramdisk # Mount ramdisk has been created. [ -d /tmp/ramdisk ] && sudo mount -t tmpfs -o size=2G tmpfs /tmp/ramdisk/ if [ -d /var/lib/mysql ]; then # Move the mysql databases to the ramdisk if it exists sudo mv /var/lib/mysql /tmp/ramdisk/mysql # Create a symbolic link. sudo ln -s /tmp/ramdisk/mysql /var/lib/mysql # Change ownership to mysql. [ -d /tmp/ramdisk/mysql ] && sudo chown mysql:mysql /tmp/ramdisk/mysql else echo "No MySQL directory at /var/lib." fi; # Restart mysql. sudo /etc/init.d/mysql restart |
Это то, что я выполняю каждый раз, когда включаю свой компьютер.
# Restore the data first.
./mysql-ramdisk-restore.sh
# then move it to the RAM.
./mysql-ramdisk.sh
Просто убедитесь, что вы создали резервную копию своих баз данных в /var/lib/mysql.bak перед выполнением этих команд.