Làm cách nào để loại bỏ các nhận xét này trong MySQL dump?


82

Tôi đang cố gắng tạo một cấu trúc đơn giản chỉ kết xuất cơ sở dữ liệu của tôi. Sử dụng mysqldumpcho tôi một kết quả như:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

DROP TABLE IF EXISTS `foo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;

Cho dù tôi có cố gắng gì đi nữa, tôi dường như không thể thoát khỏi những bình luận đó.

Tôi hiện đang sử dụng: mysqldump -p -d --add-drop-table --skip-tz-utc --skip-set-charset -h 127.0.0.1 -u foo bar --result-file=dumpfile.sql

Chỉnh sửa: Tuy nhiên, tôi muốn giữ lại các nhận xét khác, chẳng hạn như-- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32)


Không phải là câu trả lời trực tiếp - nhưng tôi đã loại bỏ hoàn toàn mysqldump thẳng cho mk-song-kết xuất - nó nhanh hơn (tạo ra nhiều quy trình) và tùy thuộc vào những gì bạn sẽ làm với đầu ra kết xuất, linh hoạt hơn vì nó đóng gói mysqldump một cách hiệu quả và 'select thành cú pháp outfile 'với nhau.
zznate

2
Tôi tự hỏi tại sao Oracle không thêm các tùy chọn quan trọng như vậy vào mysqdump?
PHPst

Câu trả lời:


161

ÁI CHÀ! Đây không thực sự là những bình luận mặc dù chúng trông như vậy. Chúng là các mã thông báo thực thi có điều kiện.

Lấy dòng này:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

Nếu phiên bản của mySQL là 4.00.14 trở lên , thì máy chủ MySQL sẽ chạy câu lệnh này.

Cú pháp chú thích kỳ diệu này được ghi lại trong phần Cú pháp chú thích của sách hướng dẫn.

Bạn có thể không muốn loại bỏ những thứ này.


2
Một câu hỏi mà cụ hỏi về ý kiến trong MySQL bị đối xử như SQL thực thi (chỉ được đăng bởi tôi): stackoverflow.com/questions/25614919/...
Dan Nissenbaum

1
Có một số trường hợp xóa nhận xét có thể giúp ích. tức là bug.mysql.com/bug.php?id=48972 khi --insert-ignore không hoạt động như mong đợi vì chúng
varela

+1 Tôi chưa bao giờ biết điều đó. Tôi nghĩ chúng chỉ là các lệnh mà mysql dump đang chạy khi nó xuất. Câu trả lời rất ngộ.
Captain Hypertext

1
Giả sử điều đó có nghĩa là phải có các tùy chọn dự kiến ​​về khả năng tương thích, chỉ định xem bạn có muốn chạy sql trên các phiên bản mysql cũ hơn hay không, và nếu không, cần phải gói nó trong một nhận xét có điều kiện.
CMCDragonkai

40

Tôi biết đây là một câu hỏi cổ xưa, nhưng ít nhất đây là một câu trả lời. Tôi cũng không thể tìm thấy cờ trong mysqldump để xóa các nhận xét có điều kiện hoặc thực sự là một tùy chọn tốt hơn để đặt phiên bản mysql tối thiểu cho các nhận xét này xuất hiện. Nếu bạn chỉ muốn xóa tất cả chúng, bạn có thể làm như vậy bằng cách sử dụng grep hoặc sed (sed để trống các dòng, grep thì không):

mysqldump ... | grep -v '^\/\*![0-9]\{5\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-9]\{5\}.*\/;$//g'

Để trả lời mong muốn của tôi về việc xóa các nhận xét có điều kiện phụ thuộc vào phiên bản mysql, hãy sử dụng một trong các cách sau (xóa mọi nhận xét cho bất kỳ điều gì <mysql5):

mysqldump ... | grep -v '^\/\*![0-4][0-9]\{4\}.*\/;$'
mysqldump ... | sed -e 's/^\/\*![0-4][0-9]\{4\}.*\/;$//g'

1
Để sao lưu rsnapshot nó rất hữu ích để thoát khỏi dòng cuối cùng, do đó, một cơ sở dữ liệu, điều đó không thay đổi kết quả trong cùng một tập tin:mysqldump ... | grep -v '^-- Dump completed on .*$'
rubo77

vâng, nhưng vấn đề là bạn có thể mất DROP DATABASE IF EXISTS OR IGNORING YOUR CURRENT SESSION VARIABLES . Trừ khi bạn biết mình đang làm gì: Đừng loại bỏ chúng ĐẶC BIỆT KHI DI CƯ GIỮA CÁC MÔI TRƯỜNG / NHÀ Ở. vì kết quả đầu ra có thể không như mong đợi, vì bất kỳ lý do nào. Họ được đặt ở đó để bảo vệ bạn. nhưng nếu bạn không muốn thắt dây an toàn thì đó là lựa chọn của bạn.
JayRizzo,

1
@ rubo77 Bạn có thể sử dụng tham số bãi mysql này là tốt:--skip-dump-date
dehart

33

Hãy thử --skip-comments?

Cảm ơn

Biên tập:

Tôi hiểu rồi .. Hãy thử cái này

--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

Chơi xung quanh để loại bỏ một số tùy chọn cho đến khi bạn nhận được kết quả mong muốn, về cơ bản điều này giống như --compactkhông có--skip-comments

--skip-comments xóa các nhận xét liên quan đến phiên bản và nội dung ..


5
Thật không may, điều này sẽ xóa tất cả các nhận xét tôi muốn, để lại tất cả những nhận xét tôi không còn nguyên vẹn.
etheros

@etheros Tôi đồng tình, nhưng chúng ta nên giải thích. Ca sử dụng của tôi liên quan đến dữ liệu cấu trúc được kiểm soát nguồn. Tôi không muốn có bất kỳ cuộc trò chuyện không cần thiết nào cho mỗi bàn. Tôi thích cách SET NAMESgọi --skip-set-charset, như được đề xuất trong câu trả lời này, loại bỏ; nó chỉ xảy ra một lần khi bắt đầu tệp kết xuất và có thể ảnh hưởng đến việc khôi phục dữ liệu theo cách quan trọng. Tôi thích --skip-add-locks --skip-disable-keyscho trường hợp sử dụng của tôi. Nhưng một số nhận xét có điều kiện, chẳng hạn như /*!40101 SET character_set_client = @saved_cs_client */;/*!40101 SET character_set_client = utf8 */... hữu ích, hay không?
Ben Johnson

1
@BenJohnson Không, họ không phải vậy. character_set_clientkhông thể được đặt trong 5.6 do lỗi hoặc điều gì đó, vì vậy khi bạn đang mysqldumping utf8mb4dữ liệu ví dụ , bạn sẽ nhận được các nhận xét có điều kiện này nếu bạn không muốn chúng.
Slava

18

Bạn đã thử tùy chọn phím tắt --compactchưa?

Thông tin tại đây .


2
Tôi đã làm, tuy nhiên nó sẽ vô hiệu hóa ý kiến khác tôi làm muốn, chẳng hạn như -- MySQL dump 10.13 Distrib 5.1.41, for Win32 (ia32).
etheros

12

Về mặt kỹ thuật, những dòng bạn đang cố gắng loại bỏ không phải là bình luận. Họ tạm thời sửa đổi một số biến khi bắt đầu, sau đó đặt lại chúng về giá trị trước đó ở cuối.

Chúng không hữu ích lắm (nhưng cũng vô hại) trong trường hợp của bạn, vì bạn đang sử dụng --no-data, nhưng tôi nghĩ điều đáng nói là các dòng này có mục đích chứ không chỉ là nhận xét.


4

Đó không phải là nhận xét, việc thực thi phần đó của tập lệnh phụ thuộc vào phiên bản mysql của bạn.

Bạn có thể xóa "phần nhận xét", như

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */

đến

SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0

làm cho kịch bản dễ đọc hơn.

Nếu bạn cố gắng chạy một tập lệnh "thoải mái" trong phiên bản mới hơn phiên bản được chỉ định trong "nhận xét", bạn sẽ gặp lỗi.


2
Làm thế nào chúng ta có thể "xóa phần bình luận"? Có một tùy chọn kết xuất cho điều này? Tôi không muốn xem qua một vài hồ sơ biểu diễn bằng tay.
mpen

Thực tế là như vậy: Nếu bạn cố gắng chạy một tập lệnh "thoải mái" trong phiên bản cũ hơn phiên bản được chỉ định trong "nhận xét", bạn sẽ gặp lỗi.
Daniel

1

Điều thực sự quan trọng là giữ các nhận xét thực thi có điều kiện. Nhưng nếu bạn hoàn toàn biết rằng phiên bản MySQL sẽ tải kết xuất lớn hơn hoặc bằng phiên bản tạo ra nó, bạn có thể xóa phần "nhận xét" bằng cách này:

sed -r  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g

Nó sẽ chuyển đổi các dòng chẳng hạn như

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

đến

SET SQL_MODE=@OLD_SQL_MODE ;

Vì dòng này phải chạy trên bất kỳ MySQL nào> = 4.1.1

Lưu ý rằng điều này sẽ không xóa các nhận xét thực thi có điều kiện nhiều dòng, chẳng hạn như khi kết xuất trình kích hoạt.

Vì không thể đoán trước được tương lai, nên tốt hơn hết bạn nên lưu trữ kết xuất với các nhận xét trên và chỉ xóa chúng khi bạn muốn hình dung nó.

mysqldump ... > dump.sql
cat dump.sql | sed -E  s'#/\*![0-9]{5} ?([^*]*)\*/#\1#'g > dump.no-comments.sql

0

Có thể chạy regex trên đó để xóa các dòng có chứa 40014 hoặc 40111, v.v.


0

Vì bạn đang sử dụng Windows, nếu không ai tìm thấy giải pháp tốt hơn thì bạn có thể sử dụng tập lệnh Python để thay thế:

import re, sys
sql = sys.stdin.read()
regex = re.compile(r'/\*![^\n]* \*/;\n', re.M)
print regex.sub('', sql)

Cách sử dụng từ dòng lệnh:

python program.py < your.sql > output.sql

Nó loại bỏ tất cả các dòng như thế này:

/*!....... */;

0

Nếu bạn gặp phải câu trả lời này khi cố gắng đưa tệp struct.sql của mình vào git / github, bạn có thể loại bỏ tính năng tự động tăng bằng đoạn mã sau ngay sau khi cào db: structure: dump

# Remove beginning auto increments to prevent merge conflicts
filename = 'db/structure.sql'
File.atomic_write(filename) do |output|
  File.open(filename, 'rb').each do |input|
    output.write(input.gsub(/\s+AUTO_INCREMENT=\d+\s+/, ' '))
  end
end

1
Điều gì xảy ra với tất cả các phiếu phản đối trên câu trả lời "dải các dòng với một regexp"? Những điều này hoàn toàn hợp lệ. Điều này đặc biệt hoàn toàn có thể áp dụng cho tình huống của tôi. +1 cho tất cả các bạn.
flatjimbo

0

Tôi đã tạo tập lệnh này để bình thường hóa kết xuất, bao gồm xóa các nhận xét có điều kiện: https://github.com/luissquall/dbdump .

Bạn chỉ cần:

npm install -g @luissquall/dbdump

# Redirect output to a file
dbdump -u user -p -d database > struct.sql

0

Sử dụng --dump-date=FALSE

Làm chính xác những gì OP yêu cầu. (không chính xác, tôi hiểu)

Nguồn: tóm tắt tùy chọn mysqldump

Chỉnh sửa: Chỉ sau một phút, tôi nhận ra, đây là thứ tôi đang tìm kiếm không phải OP, mà là rời khỏi đây ... với hy vọng ai đó có thể sử dụng nó: Dòng ngày này làm hỏng kiểm soát nguồn, vì nó luôn thay đổi ...


1
Chính xác những gì tôi đang tìm kiếm, tại sao mọi người lại không tán thành điều này? Ủng hộ lớn từ tôi.
kungfooman

-1

Tôi không biết đó có phải là thứ bạn đang tìm hay không, tôi chỉ đơn giản muốn loại bỏ tất cả những thứ về bình luận mysql để có thể sử dụng công cụ đánh dấu cú pháp, tôi đã sử dụng một regex đơn giản và thay thế tất cả bằng những thứ sau "/ \ *! [ 0-9] {5} | \ * / "và thì đấy! màu đẹp trong mã;)


-1

Như @Ollie và một số người khác đã chỉ ra, đây là những mã thông báo thực thi có điều kiện được viết theo kiểu bình luận nhưng phục vụ một mục đích. Nếu không có chúng, bạn có thể gặp phải vấn đề tạo lại bảng với ràng buộc khóa ngoại được thực thi nghiêm ngặt. Ví dụ, bảng A có FK cho bảng B và do đó bảng A không thể được tạo cho đến khi bảng B làm được và cứ tiếp tục như vậy. Nếu không tắt kiểm tra chìa khóa, bạn có thể không bao giờ tạo lại được chúng tùy thuộc vào cách xử phạt thứ tự bàn của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.