Tôi tự hỏi nếu có bất kỳ cách nào trong mysqldump để thêm tùy chọn tạo bảng thích hợp [NẾU KHÔNG tồn tại]. Bất kỳ ý tưởng?Tạo bảng nếu không tồn tại từ mysqldump
Trả lời
Theo one source, mysqldump không có tùy chọn này.
Bạn có thể sử dụng tùy chọn --force
khi nhập tệp kết xuất trở lại, trong đó MySQL sẽ bỏ qua các lỗi được tạo từ nỗ lực tạo bảng trùng lặp. Tuy nhiên lưu ý rằng với phương pháp này, các lỗi khác cũng sẽ bị bỏ qua.
Nếu không, bạn có thể chạy tệp kết xuất thông qua tập lệnh sẽ thay thế tất cả các lần xuất hiện của CREATE TABLE
bằng CREATE TABLE IF NOT EXISTS
.
Không phải những gì bạn có thể muốn, nhưng với --add-drop-table
mỗi CREATE được bắt đầu bằng câu lệnh DROP TABLE theo.
Nếu không, tôi sẽ tìm kiếm/thay thế đơn giản (ví dụ: với sed
).
Cố gắng sử dụng này trong hồ sơ SQL của bạn:
sed 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' <file-path>
hoặc lưu
sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' <file-path>
nó không phải là lý tưởng, nhưng nó hoạt động: P
Sử dụng sed
như mô tả của tác phẩm @Pawel tốt. Tuy nhiên, bạn có thể không thích ý tưởng đường ống dữ liệu của bạn thông qua các nguồn lỗi tiềm năng hơn là hoàn toàn cần thiết. Trong trường hợp này người ta có thể sử dụng hai bãi riêng biệt:
- bãi chứa định nghĩa bảng đầu tiên (
--no-data --skip-add-drop-table
) - bãi thứ hai với chỉ dữ liệu (
--no-create-info --skip-add-drop-table
)
Có một số thứ khác để chăm sóc mặc dù (ví dụ như kích hoạt). Kiểm tra hướng dẫn để biết chi tiết.
tạo tập lệnh bash bằng cách này ... đảm bảo bạn làm cho tập lệnh có thể thực thi được. (chmod 0777 dump.sh)
dump.sh
#!/bin/bash
name=$HOSTNAME
name+="-"
name+=$(date +"%Y-%m-%d.%H:%M")
name+=".sql"
echo $name;
mysqldump --replace --skip-add-drop-table --skip-comments izon -p > "$name"
sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' "$name"
Để Tìm kiếm và thay thế văn bản Trên Windows 7 Sử dụng PowerShell
mở dấu nhắc lệnh và sử dụng lệnh dưới đây
powershell -Command "(gc E:\map\map_2017.sql) -replace 'CREATE TABLE', 'CREATE TABLE IF NOT EXISTS' | Out-File E:\map\map_replaced.sql"
param Đầu tiên là filepath
Tham số thứ hai là 'f ind chuỗi'
Thứ ba param là 'thay thế chuỗi'
Lệnh này sẽ tạo ra một tập tin mới có văn bản thay thế. Xóa Lệnh bắt đầu từ '|' (ống) nếu bạn muốn thay thế và lưu nội dung trên cùng một tệp.
Các sed sẽ nhiều nhanh hơn mà không có 'g' (toàn cầu) ở cuối của nó:
ví dụ:
mysqldump -e <database> | sed 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /' > <database>.sql
Nếu bạn muốn SQL hoạt động, bạn phải loại bỏ DROP TABLE IF EXIST. –
Sản lượng bãi là sự kết hợp của thả và CREATE, vì vậy bạn phải xóa câu lệnh DROP và thay đổi câu lệnh CREATE để tạo kết quả hợp lệ (hợp lý):
mysqldump --no-data -u root <schema> | sed 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /'| sed 's/^DROP TABLE IF EXISTS /-- DROP TABLE IF EXISTS /' > <schema>.sql
Hy vọng không có dữ liệu trong db của bạn với chuỗi cụ thể trong đó. :) – Riedsio
Tỷ lệ cược là khá khó xảy ra. –
Bạn có thể giảm thiểu lỗi bằng cách mở rộng kết quả khớp, '$ sed 's/^ TẠO BẢNG foo/TẠO BẢNG NẾU KHÔNG BIỂU TƯỢNG foo/g'' –