Data.sql MySQL Docker Container'ı içeri aktar


91

Bir data.sql'im varsa, veritabanını mysql docker konteynerime nasıl aktarabilirim? Veritabanı verilerini nasıl içe aktarabilirim. Dockerize edilmiş bir dünyada bu, bir karmaşıklık katmanı ekler. bazı yöntemler lütfen.

İşte docker-compose.yml:

nginx:
  build: ./nginx/
  container_name: nginx-container
  ports:
    - 80:80
  links:
    - php
  volumes_from:
    - app-data

php:
  build: ./php/
  container_name: php-container
  expose:
    - 9000
  links:
    - mysql
  volumes_from:
    - app-data

app-data:
  image: php:7.0-fpm
  container_name: app-data-container
  volumes:
    - ./www/html/:/var/www/html/
  command: "true"

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes_from:
    - mysql-data
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password

mysql-data:
  image: mysql:latest
  container_name: mysql-data-container
  volumes:
    - /var/lib/mysql
  command: "true"

SQL dosyasını kapsayıcıya kopyalayın ve ardından veri dosyasını yükleyin.
Jay Blanchard

Yanıtlar:


61

Bunun en son mysql veya mysql: 5.7 ile çalışmasını sağlayamıyorum. Onun yerine mariaDB kullanıyorum. İşte docker-compose.yamlkodum.

version: '3'

services:
  mysql:
    image: mariadb:10.3
    container_name: mariadb
    volumes:
      - container-volume:/var/lib/mysql
      - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: name_db
    ports:
      - "3306:3306"

volumes:
  container-volume:

Bu yöntemi kullanmaya çalıştığımda, dump.sql için bir dizin buluyorum? Neden hakkında bir fikriniz var mı? örneğin: mariadb kapsayıcısına bash &: cd /docker-entrypoint-initdb.d/dump.sql/& sonra bir dizindeyim ? .Sql dosyasının hiç olmaması veya bir tür hata atılması yerine bir dizinin oluşturulmasına ne sebep olur? mariadb kapsayıcısı için ilgili docker-compose.yml:mariadb: image: mariadb:latest ... volumes: - app-vhosts:/path/before/sqldump #creates a directory? - ./path/to/sql/dump.sql:/docker-entrypoint-initdb.d/dump.sql
K8sN0v1c3

155

Daha sonra veritabanını içe aktarabilirsiniz:

docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql


23
Liman işçisi-oluşturma deneyimini kullanıyorsanız, tarafından kabı almak zorunda: docker exec -i $(docker-compose ps -q mysql-container) mysql …. Burada anlatıldığı gibi, şu anda stdin'den okumayı desteklemiyor .
slhck

2
docker-compose'da bu nasıl yapılır?
iamjc015

7
Ben. "giriş cihazı bir TTY değil" hatası
kamal

Bilginize:-p güvenlik amacıyla şifresiz kullanın .
Abdulla Nilam

2
@kamal -tseçeneğini kullandınız docker execmı? Hatayı -iönlemek için yanlış kullanım
Wolfgang

88

/docker-entrypoint-initdb.d/yourdump.sqlBir birim bağlantısı kullanarak sql-dump'ınızı monte edin

mysql:
  image: mysql:latest
  container_name: mysql-container
  ports:
    - 3306:3306
  volumes:
    - ./dump.sql:/docker-entrypoint-initdb.d/dump.sql
  environment:
    MYSQL_ROOT_PASSWORD: secret
    MYSQL_DATABASE: name_db
    MYSQL_USER: user
    MYSQL_PASSWORD: password

Bu, kapsayıcının başlangıcında sql dökümünün içe aktarılmasını tetikleyecektir, bkz. Https://hub.docker.com/_/mysql/ "Yeni bir örnek başlatma" altında


3
+1 @EugenMayer. Kesinlikle Compose v1 kullanan herkes en son v3 sözdizimine geçmelidir
Mano Marks

1
Rahatsızlık olsa bile V3, V2'nin halefi değildir. V3 temelde yalnızca sürüdür, daha ziyade bir çataldan sonra bir halefidir. Dockers'ın bu konudaki yorumlarına bakın. En büyük sorunlardan biri, binek olasılığından eksik volumr_
Eugen Mayer

21
Arkadaşlar, veritabanı hizmeti için kalıcı bir birim oluşturursanız, siz yeniden oluşturmadıkça yeni .sql dosyalarını kontrol etmeyeceğini unutmayın. Buna birkaç saat kaybettim, umarım başka kimse aynı şeyi yaşamaz.
Dazag

1
@DhwanilPatel --build --force-yeniden oluşturma seçeneklerini kullanmanız gerekir. docs.docker.com/compose/reference/up Örneğin docker-compose up --build --force-reate
repreate Dazag

@Dazag Aslında şu komutu zaten kullanıyorum: "sudo docker-compose up -d --force-repreate --build" ama hiçbir şey
olmadı


11

Docker-compose kullanarak içe aktarın

cat dump.sql | docker-compose exec -T <mysql_container> mysql -u <db-username> -p<db-password> <db-name>

Hata alıyorum - mysql: [Uyarı] Komut satırı arayüzünde bir parola kullanmak güvensiz olabilir. 1. satırdaki ERROR 1064 (42000): SQL sözdiziminizde bir hata var; 'mysqldump'a yakın doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuza bakın: [Uyarı] Komut satırı arayüzünde bir parola kullanmak, 1. satırda unix @ -> / var / run / docker okuyun. çorap: okuma: eşler tarafından bağlantı sıfırlama
R Paz

Pls, bu uyarının dump.sql dosyanızda görünmediğini kontrol edin: Dosyayı mysqldump kullanarak oluşturduğunuzda ve komut satırında şifreyi verdiğinizde, uyarı döküm dosyasında son bulacaktır.
Stefan Frank

6

Bu komutla içe aktarabilirim

docker-compose exec -T mysql mysql -uroot -proot mydatabase < ~/Desktop/mydatabase_2019-10-05.sql

neyin ne olduğunu söylemek zor, ama ben de aynı şekilde yapıyorum docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql. Ayrıca ifadenizde bir hata olduğunu düşünüyorum. -uKullanıcı adının kendisi ile arasında bir boşluk olmalıdır .
Gordon Freeman

5

https://stackoverflow.com/a/51837876/1078784 ve bu soruya verilen cevapları birleştirin , bence en iyi cevap:

cat {SQL FILE NAME} | docker exec -i {MYSQL CONTAINER NAME} {MYSQL PATH IN CONTAINER} --init-command="SET autocommit=0;"

örneğin benim sistemimde bu komut şöyle görünmelidir:

cat temp.sql | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

Ayrıca kullanabilirsiniz pv Moniter ilerlemeye:

cat temp.sql | pv | docker exec -i mysql.master /bin/mysql --init-command="SET autocommit=0;"

Ve buradaki en önemli şey, içe aktarma sürecini 10 kat daha hızlı hızlandıracak "--init-command".


anlıyorum stdin bir tty değil ... bundan gerçekten sıkıldım, bunun çözümü nedir?
Bram B

Ne demek istediğini anlamadım, belki bana daha fazla ayrıntı verebilirsin?
Matt.Cai

3

şu basit adımları takip edebilirsiniz:

İLK YOL:

önce SQL döküm dosyasını yerel dizininizden mysql kapsayıcısına kopyalayın. docker cp komutunu kullanın

docker cp [SRC-Local path to sql file] [container-name or container-id]:[DEST-path to copy to]

docker cp ./data.sql mysql-container:/home

ve sonra mysql-container'ı kullanarak çalıştırın (NOT: Alpine sürümünü kullanıyorsanız, aşağıdaki komutta bash'ı sh ile değiştirmeniz gerekir.)

docker exec -it -u root mysql-container bash

ve sonra bu SQL döküm dosyasını kolayca içe aktarabilirsiniz.

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

İKİNCİ YOL: BASİT

docker cp ./data.sql mysql-container:/docker-entrypoint-initdb.d/

Mysql Docker hub resmi sayfasında belirtildiği gibi.

Bir konteyner ilk kez başlatıldığında, MYSQL_DATABASE değişkeninde belirtilen adla yeni bir veritabanı oluşturulur - bunu ortam değişkenini ayarlayarak geçebilirsiniz, burada ortam değişkenlerini nasıl ayarlayacağınıza bakın

Varsayılan olarak kapsayıcı, /docker-entrypoint-initdb.d klasöründe bulunan .sh, .sql ve .sql.gz uzantılı dosyaları çalıştırır. Dosyalar alfabetik sıraya göre yürütülecektir. bu şekilde SQL dosyalarınız varsayılan olarak MYSQL_DATABASE değişkeni tarafından belirtilen veritabanına aktarılacaktır.

daha fazla ayrıntı için her zaman resmi sayfayı ziyaret edebilirsiniz


2

"docker exec ... < data.sql"Windows PowerShell yanıtlarında aşağıdakilerle deneniyor :

'<' Operatörü ileride kullanılmak üzere ayrılmıştır.

Ancak cmd /csorunu ortadan kaldırmak için bunu tamamlayabilirsiniz:

cmd /c "docker exec -i mysql-container mysql -uuser -ppassword name_db < data.sql"

1

Paylaşılan bir dizini (-v birimi) ayarlayan bir kapsayıcı çalıştırabilir ve ardından bu kapsayıcıda bash çalıştırabilirsiniz. Bundan sonra, .sql dosyasını konteynerin içinden yürütmek için etkileşimli olarak mysql-client'ı kullanabilirsiniz. obs: / my-host-dir / shared-dir, ana bilgisayar sistemindeki .sql konumudur.

docker run --detach --name=test-mysql -p host-port:container-port  --env="MYSQL_ROOT_PASSWORD=my-root-pswd" -v /my-host-dir/shared-dir:/container-dir mysql:latest


docker exec -it test-mysql bash

Kabın içinde ...

mysql -p < /container-dir/file.sql 

Özel parametreler:

  • test-mysql (kapsayıcı adı)
  • ana bilgisayar bağlantı noktası ve konteyner bağlantı noktası
  • my-root-pswd (mysql root şifresi)
  • / my-host-dir / shared-dir ve / container-dir (kapsayıcıya monte edilecek ana bilgisayar dizini ve paylaşılan dizinin kapsayıcı konumu)

1

Bu benim için çalışıyor

$ docker exec -i NAME_CONTAINER_MYSQL mysql -u DB_USER -pPASSWORD DATABASE < /path/to/your/file.sql

Öncelikle NAME_CONTAINER_MYSQL'in ne olduğunu bilmek istiyorsanız, aşağıdaki komutu kullanmalısınız:

$ docker ps

NAME çıktı sütununda, yukarıdaki komutta değiştirmeniz gereken NAME_CONTAINER_MYSQL göreceksiniz.


0

do docker cp file.sql <CONTAINER NAME>:/file.sqlilk

sonra docker exec -i <CONTAINER NAME> mysql -u user -p

sonra mysql kapsayıcısının içinde çalıştır source \file.sql


-2

docker cp kullanarak örneğin dump.sql için dışa aktarma dosyasını kapsayıcıya kopyalayabilir ve ardından db'yi içe aktarabilirsiniz. tam talimatlara ihtiyacınız varsa bana bildirin, ben de

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.