Impor data.sql MySQL Docker Container


91

Jika saya memiliki data.sql, bagaimana saya dapat mengimpor database ke container docker mysql saya? Bagaimana saya bisa mengimpor data database. Dalam dunia buruh pelabuhan, hal ini menambah lapisan kerumitan. tolong beberapa metode.

Di sini saya 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"

Salin file SQL ke container lalu muat data infile.
Jay Blanchard

Jawaban:


61

Sepertinya saya tidak dapat membuat ini berfungsi dengan mysql atau mysql terbaru: 5.7. Jadi saya menggunakan mariaDB sebagai gantinya. Ini docker-compose.yamlkode saya .

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:

Ketika saya mencoba menggunakan metode ini, saya berakhir dengan direktori untuk dump.sql? Tahu kenapa? misalnya: bash ke dalam wadah mariadb &: cd /docker-entrypoint-initdb.d/dump.sql/& lalu saya berada di direktori? Apa yang menyebabkan direktori dibuat alih-alih tidak memiliki file .sql di sana sama sekali atau menimbulkan semacam kesalahan? buruh pelabuhan-compose.yml saya yang relevan untuk wadah mariadb: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

Anda dapat mengimpor database setelahnya:

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


23
Jika menggunakan buruh pelabuhan-compose, Anda harus mendapatkan wadah oleh: docker exec -i $(docker-compose ps -q mysql-container) mysql …. Saat ini tidak mendukung membaca dari stdin, seperti yang dijelaskan di sini .
slhck

2
bagaimana melakukan ini di buruh pelabuhan-menulis?
iamjc015

7
Saya. mendapatkan kesalahan "perangkat input bukan TTY"
kamal

FYI: gunakan -ptanpa kata sandi untuk tujuan keamanan.
Abdulla Nilam

2
@ Kamal apakah Anda menggunakan -topsi untuk docker exec? Juse digunakan -iuntuk menghindari kesalahan
Wolfgang

88

Pasang sql-dump Anda di bawah /docker-entrypoint-initdb.d/yourdump.sqlmenggunakan pemasangan volume

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

Ini akan memicu impor sql-dump selama dimulainya penampung, lihat https://hub.docker.com/_/mysql/ di bawah "Menginisialisasi instance baru"


3
+1 @EugenMayer. Tentunya siapa pun yang menggunakan Compose v1 harus pindah ke sintaks v3 terbaru: docs.docker.com/compose/compose-file
Mano Marks

1
V3 bukanlah penerus V2, meskipun itu merupakan ketidaknyamanan. V3 pada dasarnya adalah swarm saja, ini lebih seperti garpu kemudian penerus. Lihat komentar Dockers tentang ini. Salah satu masalah besar adalah hilangnya kemungkinan volumr_from mount
Eugen Mayer

21
Teman-teman, ingatlah bahwa jika Anda membuat volume persisten untuk layanan database, itu tidak akan memeriksa file .sql baru kecuali Anda membuatnya kembali. Kehilangan beberapa jam untuk ini, saya harap tidak ada orang lain yang mengalami hal yang sama.
Dazag

1
@DhwanilPatel Anda harus menggunakan opsi --build --force-rekreate. docs.docker.com/compose/reference/up Misalnya docker-compose up --build --force-
rekreate

@Dazag Sebenarnya saya sudah menggunakan perintah ini: "sudo docker-compose up -d --force-rekreate --build" tapi tidak terjadi apa-apa
Dhwanil Patel


11

Impor menggunakan docker-compose

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

Saya mendapatkan kesalahan - mysql: [Peringatan] Menggunakan kata sandi pada antarmuka baris perintah bisa jadi tidak aman. ERROR 1064 (42000) di baris 1: Anda memiliki kesalahan dalam sintaks SQL; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang benar untuk digunakan di dekat 'mysqldump: [Peringatan] Menggunakan kata sandi pada antarmuka baris perintah dapat diinsec' di baris 1 baca unix @ -> / var / run / buruh pelabuhan. kaus kaki: baca: koneksi disetel ulang oleh rekan
R Sun

tolong periksa, bahwa peringatan ini belum muncul di dump.sql Anda: Ketika Anda membuat file menggunakan mysqldump dan memberikan kata sandi pada baris perintah, peringatan itu akan berakhir di file yang dibuang.
Stefan Frank

6

Saya dapat mengimpor dengan perintah ini

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

sulit untuk mengatakan apa itu apa, tapi saya melakukannya dengan cara yang sama docker-compose exec -T [host] mysql -u [mysql user] -p[password] [database] < localfile.sql. Selain itu menurut saya ada kesalahan dalam pernyataan Anda. Harus ada spasi antara -udan nama pengguna itu sendiri.
Gordon Freeman

5

gabungkan https://stackoverflow.com/a/51837876/1078784 dan jawaban atas pertanyaan ini, menurut saya jawaban terbaiknya adalah:

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

misalnya di sistem saya perintah ini akan terlihat seperti:

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

Anda juga dapat menggunakan pv untuk memantau kemajuan:

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

Dan yang paling penting disini adalah "--init-command" yang akan mempercepat proses import 10 kali lebih cepat.


saya mendapatkan stdin bukanlah tty ... menjadi sangat bosan dengan ini, apa solusi untuk ini?
Bram B

Tidak mengerti maksud Anda, mungkin Anda bisa memberi saya lebih banyak detail?
Matt. Cai

3

Anda dapat mengikuti langkah-langkah sederhana ini:

CARA PERTAMA:

pertama-tama salin file dump SQL dari direktori lokal Anda ke wadah mysql. gunakan perintah docker cp

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

dan kemudian jalankan mysql-container menggunakan (CATATAN: jika Anda menggunakan versi alpine Anda perlu mengganti bash dengan sh pada perintah di bawah ini.)

docker exec -it -u root mysql-container bash

dan kemudian Anda cukup mengimpor file dump SQL ini.

mysql [DB_NAME] < [SQL dump file path]

mysql movie_db < /home/data.sql

CARA KEDUA: SEDERHANA

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

Seperti yang disebutkan di halaman resmi hub Docker mysql.

Setiap kali kontainer dimulai untuk pertama kalinya, database baru dibuat dengan nama yang ditentukan dalam variabel MYSQL_DATABASE - yang dapat Anda lewati dengan mengatur variabel lingkungan, lihat di sini cara mengatur variabel lingkungan

Secara default container akan mengeksekusi file dengan ekstensi .sh, .sql dan .sql.gz yang terdapat di folder /docker-entrypoint-initdb.d. File akan dieksekusi dalam urutan abjad. dengan cara ini file SQL Anda akan diimpor secara default ke database yang ditentukan oleh variabel MYSQL_DATABASE.

untuk lebih jelasnya Anda selalu dapat mengunjungi halaman resmi


2

Mencoba "docker exec ... < data.sql"di respons Window PowerShell dengan:

Operator '<' dicadangkan untuk penggunaan di masa mendatang.

Tapi seseorang bisa menyelesaikannya cmd /cuntuk menghilangkan masalah:

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

1

Anda dapat menjalankan penampung yang menyetel direktori bersama (-v volume), lalu menjalankan bash di penampung itu. Setelah ini, Anda dapat secara interaktif menggunakan mysql-client untuk mengeksekusi file .sql, dari dalam container. obs: / my-host-dir / shared-dir adalah lokasi .sql di sistem host.

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

Di dalam wadah ...

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

Parameter khusus:

  • uji-mysql (nama kontainer)
  • host-port dan container-port
  • my-root-pswd (kata sandi root mysql)
  • / my-host-dir / shared-dir dan / container-dir (direktori host yang akan dipasang di container, dan lokasi container dari direktori bersama)

1

Yang ini berhasil untuk saya

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

Pertama jika Anda ingin tahu apa itu NAME_CONTAINER_MYSQL, Anda harus menggunakan perintah di bawah ini:

$ docker ps

Di kolom keluaran NAME Anda akan melihat NAME_CONTAINER_MYSQL yang perlu Anda ganti pada perintah di atas.


0

lakukan docker cp file.sql <CONTAINER NAME>:/file.sqldulu

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

lalu di dalam wadah mysql jalankan source \file.sql


-2

Anda dapat menyalin file ekspor misalnya dump.sql menggunakan docker cp ke dalam wadah dan kemudian mengimpor db. jika Anda membutuhkan instruksi lengkap, beri tahu saya dan saya akan memberikannya

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.