저는 종종 MySQL 데이터베이스를 가져오는데 시간이 좀 걸릴 수 있습니다. 진행률 표시기가 없습니다. 어떤 식으로든 보여줄 수 있나요? 레코드 가져오기, MB 가져오기 또는 테이블 가져오기 등 무엇이든 기다리는 것보다 낫습니다. 누구든지 어떤 아이디어가 있습니까?
나는 다음 명령을 사용합니다.
mysql -uuser -p -hhost database < largefile.sql
파일 크기는 40-300MB이고 호스트는 로컬 네트워크 내에 있습니다.
답변1
이라는 훌륭한 도구가 있습니다 pv
.
# On Ubuntu/Debian system
$ sudo apt-get install pv
# On Redhat/CentOS
$ sudo yum install pv
예를 들어 다음과 같이 사용할 수 있습니다.
$ zcat dbpackfile.sql.gz | pv -cN zcat | mysql -uuser -ppass dbname
참고: 이 블로그를 확인해 보세요. http://blog.larsstrand.no/2011/12/tip-pipe-viewer.html더 많은 통찰력을 얻으려면.
참고: 전체 진행률 표시줄이 있는 더 나은 솔루션입니다. 이렇게 하려면 두 가지 기본 제공
pv
옵션을 사용해야 합니다. 하나는--progress
진행률 표시줄을 표시하는 것이고, 다른 하나는 전체 파일의 크기를--size
알려주는 것 입니다.pv
pv --progress --size UNPACKED-FILE-SIZE-IN-BYTES
..문제는 .gz
원본 파일 크기에 있습니다. 압축을 풀지 않고 압축을 푼 후 어떻게든 원시 파일 크기 정보를 얻어야 합니다. 그렇지 않으면 이 파일을 두 번(첫 번째 pv
와 두 번째 zcat
) 압축 해제하는 데 귀중한 시간을 낭비하게 됩니다. 그러나 다행스럽게도 gzip -l
gzip으로 압축된 파일에 대한 비압축 정보를 포함하도록 선택할 수 있습니다. 안타깝게도 표 형식이므로 사용하기 전에 추출해야 합니다. 아래에서 모두 볼 수 있습니다.
gzip -l /path/to/our/database.sql.gz | sed -n 2p | awk '{print $2}'
참고: 다음은 가장 일반적인 보관 도구 및 방법 목록과 이러한 아카이브에서 압축되지 않은 대량의 바이트를 추출하는 방법입니다.
tar -tvf database.sql.tar | awk '{print $3}' | paste -sd+ | bc unzip -Zt database.sql.zip | awk '{print $3}' unrar l database.sql.rar | tail -n2 | head -n1 | awk '{ print $1 }' 7z l database.sql.7z | tail -n1 | awk '{ print $3 }'
어..그래서 마지막으로 해야 할 일은 그것들을 결합하는 것입니다.
zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` | mysql -uuser -ppass dbname
더 나은 결과를 얻으려면 다음과 같이 진행 이름을 추가할 수 있습니다.
zcat /path/to/our/database.sql.gz | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name ' Importing.. ' | mysql -uuser -ppass dbname
최종 결과:
Importing.. : [===========================================>] 100%
빠른 사용을 위해 사용자 정의 기능을 만들 수 있습니다.
mysql_import() {
zcat $2 | pv --progress --size `gzip -l %s | sed -n 2p | awk '{print $2}'` --name ' Importing.. ' | mysql -uuser -ppass $1
}
..다음과 같이 사용하세요.
mysql_import dbname /path/to/our/database.sql.gz
참고: 어디에 넣어야 할지 모르겠다면 다음 답변을 읽어보세요. https://unix.stackexchange.com/a/106606/20056
~/.bash_aliases
참고: 파일 등의 별칭 사이에 기능을 추가할 수 있습니다 .
답변2
왜 그렇게 복잡합니까?
이것은 잘 작동합니다:
pv dump.sql.gz | zcat | mysql -u user -ppasswd database
답변3
저는 항상 MySql 셸에서 데이터베이스를 가져옵니다. 진행률 표시기를 제공하지는 않지만 수행 중인 작업을 (빠르게) 스크롤하므로 작동 중이라는 것을 알 수 있습니다.
# mysql -u user -p -h host database
> source /path/to/some/largefile.sql;
답변4
sobi3ch의 답변이는 대부분의 상황에서는 괜찮지만, mysql docker 컨테이너의 초기화 출력을 모니터링하거나 파일에 진행 상황을 기록하려는 경우와 같이 tty를 사용할 수 없는 상황에서는 파이프 뷰어가 제대로 작동하지 않습니다.
파이프라인 모니터(깃허브)는 STDERR을 통해 로그 스트림에 대한 업데이트를 출력하도록 설계된 대안입니다. 면책 조항 : 나는 저자입니다.
기본 기능은 매우 유사합니다. 즉, STDIN이나 파일에서 읽는 것입니다. 콘텐츠를 STDOUT으로 파이프합니다. 진행 상황을 표시합니다. 그러나 파이프라인 보기는 터미널 제어 시퀀스를 사용하여 한 줄의 시각적 진행률 표시줄을 업데이트하는 반면 파이프라인은 비터미널 애플리케이션에 적합한 출력 텍스트 업데이트를 모니터링합니다.
Pipe Monitor는 다음과 같은 기본 옵션을 지원합니다. --format 옵션을 사용하여 출력을 사용자 정의할 수 있습니다.
Usage: pm [--size SIZE] [--name NAME] [--format FORMAT] INPUT_FILE
Positional arguments:
INPUT_FILE Optional input file. If not provided input will be read from STDIN
Options:
--size SIZE, -s SIZE Size of input from STDIN. Ignored if using INPUT_FILE
--name NAME, -n NAME A NAME tag for this output. Will be pre-pended to default FORMAT string
--format FORMAT, -f FORMAT
Output format string. Allowed keys: %name, %size, %time, %eta, %percent, %written, %buffered
--help, -h display this help and exit
비터미널 환경에서 각 출력을 비교한 것입니다.
파이프 뷰어(비터미널):
$ pv -nf testin > testout
40
70
77
84
90
96
100
파이프 모니터:
$ pm testin > testout
Processed 0 bytes of 2456678400 (0% complete). 0 bytes buffered. Running 0s, eta: <unknown>
Processed 1750794240 bytes of 2456678400 (71% complete). 327680 bytes buffered. Running 2s, eta: 1s
Processed 2106937344 bytes of 2456678400 (85% complete). 700416 bytes buffered. Running 4s, eta: 1s
Processed 2419339264 bytes of 2456678400 (98% complete). 2871296 bytes buffered. Running 6s, eta: 0s
Processed 2456678400 bytes of 2456678400 (100% complete). 0 bytes buffered. Running 6s, eta: 0s