فهرست مطالب

آموزش مهاجرت از MySQL به Docker-MySQL

طرح مسئله

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 استفاده می‌کنید. در داخل یک شبکه داکر، هر سرویس و کانتینر به صورت پیش فرض در یک شبکهٔ محدود قرار می‌گیرد و برای دسترسی به سرویس‌ها و کانتینرهای دیگر باید به container_name آن‌ها به عنوان hostname متصل شوید.
 
برای حل این مشکل، شما باید به کانفیگ فایل MariaDB خود دسترسی پیدا کرده و مجوز دسترسی را برای آی‌پی‌های خاصی که می‌خواهید به دیتابیس متصل شوند یا تمام آی‌پی‌ها صادر کنید. برای این کار، می‌توانید از دستورات زیر استفاده کنید:

۱- ورود به کانتینر MariaDB با دستور زیر:

				
					docker exec -it mysql_default.db /bin/bash
				
			
که در آن container_name نام کانتینر MariaDB شماست.
۲- ویرایش فایل my.cnf با دستور زیر:
				
					vi /etc/mysql/mariadb.conf.d/50-server.cnf
				
			

این فایل ممکن است در شاخه های دیگری مانند موارد زیر باشد:

/etc/mysql/my.cnf
/etc/my.cnf

۳- به بخش [mysqld] در فایل کانفیگ رفته و خط زیر را به آن اضافه کنید:
				
					bind-address = 0.0.0.0
				
			
این دستور به معنی دادن مجوز دسترسی به تمام آی‌پی‌ها برای اتصال به MariaDB است.
۴- پس از اضافه کردن آی‌پی‌های مجاز به کانفیگ Mariadb، باید همین مجوز را به نام کاربری مورد نظرمان هم اعمال کنیم:
				
					mysql -u root -p 
				
			

از شما رمز عبور پرسیده میشود که در این مثال mysql_root می باشد.

سپس کوئری زیر را در Mysql اجرا کنید:

				
					GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysql_root';
				
			

پس از اجرای موفق این کوئری، کوئری زیر را نیز وارد نمایید:

				
					FLUSH PRIVILEGES;
				
			

حالا مشکل حل شده و می توانید به دیتابیس متصل شوید.

Picture of نویسنده: رضا مقدم

نویسنده: رضا مقدم

سایر نوشته‌ها
Picture of نویسنده: رضا مقدم

نویسنده: رضا مقدم

سایر نوشته‌ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *