طرح مسئله
Mysql یا Mariadb رو مستقیم روی سیستم عامل نصب کردی و حالا بعد از آشنایی با ویژگیهای جذاب داکر دلت می خواد اطلاعات دیتابیسهات رو انتقال بدی به یک کانتینر توی داکر. ایدهٔ خوبیه ولی قطعا راهکار بهتری از Export و Import وجود داره 😊.
بعضی وقتها هم پیش میاد که به دلیل اشتباهات برنامهنویسی یا کانفیگ اشتباه دیتابیس، فرآیند Export و Import با خطا مواجه میشود و وقت کافی رو برای برطرف کردن خطاهای پیش اومده نداریم.
همون طور که میدونید، Mysql یک پایگاه داده فایل سیستمه و این یعنی اطلاعات شما توی هارد ذخیره میشن. پس یه راه حل خیلی ساده وجود داره که در ادامه بهتون توضیح میدم.
توی این سناریو، من روی سیستم عامل مکینتاش یه Mariadb نصب کرده بودم و میخواستم اطلاعاتش رو بدون export و import انتقال بدم به یه کانتینر داکری.
دست به کار بشیم:
توی مکینتاش فایلهای Mysql در شاخه /usr/local/var/mysql سیستم ذخیره میشوند که باید یه فایل بکاپ ازش تهیه کنیم:
cd /usr/local/var
zip -r mysql.backup.zip mysql
حالا میروم به شاخهای که میخواهم Mysql جدیدم رو با داکر بالا بیاورم و فایل docker-compose.yml خودم رو در آن شاخه ایجاد می کنم:
cd /opt/newmysql
vi docker-compose.yml
و محتویات زیر رو داخلش قرار می دهم:
services:
database:
container_name: mysql_default.db
image: mariadb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: mysql_root
MYSQL_ROOT_HOST: "%"
volumes:
- ./mysql:/var/lib/mysql
ports:
- 3306:3306
phpmyadmin:
container_name: mysql_default.admin
image: phpmyadmin
restart: always
ports:
- 8006:80
environment:
- PMA_ARBITRARY=1
networks:
default:
name: mynet
حالا باید فایل mysql.backup.zip رو به شاخه جدید انتقال بدهیم و آن را unzip کنیم:
mv /usr/local/var/mysql.backup.zip /opt/newmysql/
unzip mysql.backup.zip
حالا باید با دستور زیر کانتینر ها رو اجرا می کنیم:
docker compose up -d
حالا تلاش کنید که به دیتابیس وصل بشید.
اگر با خطایی مشابه زیر مواجه شدید:
1130 – Host ‘172.18.0.1’ is not allowed to connect to this MariaDB server
۱- ورود به کانتینر MariaDB با دستور زیر:
docker exec -it mysql_default.db /bin/bash
vi /etc/mysql/mariadb.conf.d/50-server.cnf
این فایل ممکن است در شاخه های دیگری مانند موارد زیر باشد:
/etc/mysql/my.cnf
/etc/my.cnf
bind-address = 0.0.0.0
mysql -u root -p
از شما رمز عبور پرسیده میشود که در این مثال mysql_root می باشد.
سپس کوئری زیر را در Mysql اجرا کنید:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysql_root';
پس از اجرای موفق این کوئری، کوئری زیر را نیز وارد نمایید:
FLUSH PRIVILEGES;
حالا مشکل حل شده و می توانید به دیتابیس متصل شوید.