หน้านี้อธิบายวิธีใช้การกู้คืนช่วงเวลา (PITR) เพื่อเก็บรักษาและกู้คืนข้อมูลใน Cloud Firestore
หากต้องการทำความเข้าใจแนวคิด PITR โปรดดูการกู้คืนช่วงเวลา
สิทธิ์
หากต้องการรับสิทธิ์ที่จำเป็นในการจัดการการตั้งค่า PITR โปรดขอให้ผู้ดูแลระบบมอบบทบาท IAM ต่อไปนี้ในโปรเจ็กต์ที่คุณต้องการเปิดใช้ PITR
- เจ้าของ Cloud Datastore (
roles/datastore.owner)
สำหรับบทบาทที่กำหนดเอง ให้ตรวจสอบว่าได้รับสิทธิ์ต่อไปนี้แล้ว
- วิธีเปิดใช้ PITR เมื่อสร้างฐานข้อมูล
datastore.databases.create - วิธีอัปเดตการตั้งค่า PITR ในฐานข้อมูลที่มีอยู่:
datastore.databases.update,datastore.databases.list - หากต้องการอ่านข้อมูล PITR ให้ใช้
datastore.databases.get,datastore.entities.get,datastore.entities.list - วิธีส่งออกข้อมูล PITR:
datastore.databases.export - วิธีนำเข้าข้อมูล PITR:
datastore.databases.import - วิธีโคลนฐานข้อมูล:
datastore.databases.clone
ก่อนเริ่มต้น
โปรดทราบประเด็นต่อไปนี้ก่อนเริ่มใช้ PITR
- คุณไม่สามารถเริ่มอ่านข้อมูลย้อนหลัง 7 วันได้ทันทีหลังจากเปิดใช้ PITR
- หากต้องการเปิดใช้ PITR เมื่อสร้างฐานข้อมูล คุณต้องใช้คำสั่ง
gcloud firestore databases createระบบไม่รองรับการเปิดใช้ PITR ขณะสร้างฐานข้อมูลโดยใช้คอนโซล Google Cloud - Cloud Firestore จะเริ่มเก็บรักษาเวอร์ชันต่างๆ ตั้งแต่จุดนั้นเป็นต้นไปหลังจากเปิดใช้ PITR
- คุณจะอ่านข้อมูล PITR ในกรอบเวลา PITR ไม่ได้หลังจากปิดใช้ PITR
- หากคุณเปิดใช้ PITR อีกครั้งทันทีหลังจากปิดใช้ ข้อมูล PITR ที่ผ่านมาจะใช้งานไม่ได้อีกต่อไป ระบบจะลบข้อมูล PITR ที่สร้างขึ้นก่อนปิดใช้ PITR หลังจากวันที่หมดอายุของ PITR
- หากคุณลบข้อมูลโดยไม่ตั้งใจในช่วง 1 ชั่วโมงที่ผ่านมาและปิดใช้ PITR ไว้ คุณสามารถกู้คืนข้อมูลได้โดยเปิดใช้ PITR ภายใน 1 ชั่วโมงนับจากที่ลบข้อมูล
- การอ่านข้อมูล PITR ที่หมดอายุจะดำเนินการไม่สำเร็จ
เปิดใช้ PITR
ก่อนใช้ PITR ให้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Google Cloud เฉพาะโปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงินเท่านั้นที่ใช้ฟังก์ชัน PITR ได้
วิธีเปิดใช้ PITR สำหรับฐานข้อมูล
คอนโซล
ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล
เลือกฐานข้อมูลที่ต้องการจากรายการฐานข้อมูล
ในเมนูการนำทาง ให้คลิกการกู้ข้อมูลคืนหลังจากภัยพิบัติ
คลิกแก้ไขเพื่อแก้ไขการตั้งค่า
เลือกช่องทำเครื่องหมายเปิดใช้การกู้คืนช่วงเวลา แล้วคลิกบันทึก
การเปิดใช้ PITR จะทำให้เกิดค่าใช้จ่ายสำหรับพื้นที่เก็บข้อมูล ดูข้อมูลเพิ่มเติมได้ที่ราคา
หากต้องการปิดใช้ PITR ให้ล้างช่องทำเครื่องหมายเปิดใช้การกู้คืนช่วงเวลาจากหน้าการกู้ข้อมูลคืนหลังจากภัยพิบัติในคอนโซล Google Cloud
gcloud
เปิดใช้ PITR ระหว่างการสร้างฐานข้อมูลด้วยคำสั่ง gcloud firestore databases create และ --enable-ptir ดังนี้
gcloud firestore databases create\
--location=LOCATION\
--database=DATABASE_ID\
--type=firestore-native\
--enable-pitr
แทนที่ค่าดังนี้
LOCATION- ตำแหน่งที่คุณต้องการสร้างฐานข้อมูลDATABASE_ID- ตั้งค่าเป็นรหัสฐานข้อมูล
คุณปิดใช้ PITR ได้โดยใช้คำสั่ง gcloud firestore databases update ดังนี้
gcloud firestore databases update\
--database=DATABASE_ID\
--no-enable-pitr
แทนที่ค่าดังนี้
DATABASE_ID- ตั้งค่าเป็นรหัสฐานข้อมูลหรือ (ค่าเริ่มต้น)
ดูระยะเวลาเก็บรักษาและเวลาของเวอร์ชันแรกสุด
คอนโซล
ในคอนโซล Google Cloud ให้ไปที่หน้าฐานข้อมูล
เลือกฐานข้อมูลที่ต้องการจากรายการฐานข้อมูล
ในเมนูการนำทาง ให้คลิกการกู้ข้อมูลคืนหลังจากภัยพิบัติ
ในส่วนการตั้งค่า ให้จดระยะเวลาเก็บรักษาและเวลาของเวอร์ชันแรกสุดไว้
- ระยะเวลาเก็บรักษา: ระยะเวลาที่ Cloud Firestore เก็บรักษาข้อมูลทุกเวอร์ชันสำหรับฐานข้อมูล ค่าจะเป็น 1 ชั่วโมงเมื่อปิดใช้ PITR และ 7 วันเมื่อเปิดใช้ PITR
- เวลาของเวอร์ชันที่เก่าที่สุด: การประทับเวลาที่เก่าที่สุดที่สามารถอ่านข้อมูลเวอร์ชันเก่าได้ในกรอบเวลา PITR Cloud Firestore จะอัปเดตค่านี้อย่างต่อเนื่องและจะล้าสมัยทันทีที่มีการค้นหา หากคุณใช้ค่านี้เพื่อกู้คืนข้อมูล โปรดคำนึงถึงเวลาตั้งแต่ตอนที่ค้นหาค่าจนถึงตอนที่คุณเริ่มการกู้คืน
- การกู้คืนช่วงเวลา: แสดง
Enabledหากเปิดใช้ PITR หากปิดใช้ PITR คุณจะเห็นDisabled
gcloud
เรียกใช้คำสั่ง gcloud firestore databases describe ดังนี้
gcloud firestore databases describe --database=DATABASE_ID
แทนที่ DATABASE_ID ด้วยรหัสฐานข้อมูลหรือ '(default)'
เอาต์พุตมีดังนี้
appEngineIntegrationMode: ENABLED
concurrencyMode: PESSIMISTIC
createTime: '2021-03-24T17:02:35.234Z'
deleteProtectionState: DELETE_PROTECTION_DISABLED
earliestVersionTime: '2023-06-12T16:17:25.222474Z'
etag: IIDayqOevv8CMNTvyNK4uv8C
keyPrefix: s
locationId: nam5
name: projects/PROJECT_ID/databases/DATABASE_ID
pointInTimeRecoveryEnablement: POINT_IN_TIME_RECOVERY_DISABLED
type: FIRESTORE_NATIVE
uid: 5230c382-dcd2-468f-8cb3-2a1acfde2b32
updateTime: '2021-11-17T17:48:22.171180Z'
versionRetentionPeriod: 3600s
ที่ไหน
earliestVersionTime: การประทับเวลาของข้อมูล PITR ที่จัดเก็บไว้เร็วที่สุดpointInTimeRecoveryEnablement: แสดงPOINT_IN_TIME_RECOVERY_ENABLEDหากเปิดใช้ PITR หากปิดใช้ PITR คุณจะเห็นPOINT_IN_TIME_RECOVERY_DISABLEDหรือช่องpointInTimeRecoveryEnablementอาจไม่แสดงversionRetentionPeriod: ระยะเวลาที่เก็บรักษาข้อมูล PITR ไว้ในหน่วยมิลลิวินาที ค่านี้อาจเป็น 1 ชั่วโมงเมื่อปิดใช้ PITR หรือ 7 วันหากเปิดใช้ PITR
อ่านข้อมูล PITR
คุณสามารถอ่านข้อมูล PITR ได้โดยใช้ไลบรารีของไคลเอ็นต์, เมธอด REST API หรือเครื่องมือเชื่อมต่อ FirestoreIO Apache Beamไลบรารีของไคลเอ็นต์
Java
คุณต้องใช้ธุรกรรม ReadOnly เพื่ออ่านข้อมูล PITR คุณไม่สามารถระบุ readTime ในการอ่านโดยตรงได้
ดูข้อมูลเพิ่มเติมได้ที่ธุรกรรมและการเขียนแบบเป็นกลุ่ม
Firestore firestore = …
TransactionOptions options =
TransactionOptions.createReadOnlyOptionsBuilder()
.setReadTime(
com.google.protobuf.Timestamp.newBuilder()
.setSeconds(1684098540L)
.setNanos(0))
.build();
ApiFuture<Void> futureTransaction = firestore.runTransaction(
transaction -> {
// Does a snapshot read document lookup
final DocumentSnapshot documentResult =
transaction.get(documentReference).get();
// Executes a snapshot read query
final QuerySnapshot queryResult =
transaction.get(query).get();
},
options);
// Blocks on transaction to complete
futureTransaction.get();
โหนด
คุณต้องใช้ธุรกรรม ReadOnly เพื่ออ่านข้อมูล PITR คุณไม่สามารถระบุ readTime ในการอ่านได้โดยตรง
ดูข้อมูลเพิ่มเติมได้ที่ธุรกรรมและการเขียนแบบเป็นกลุ่ม
const documentSnapshot = await firestore.runTransaction(
updateFunction => updateFunction.get(documentRef),
{readOnly: true, readTime: new Firestore.Timestamp(1684098540, 0)}
);
const querySnapshot = await firestore.runTransaction(
updateFunction => updateFunction.get(query),
{readOnly: true, readTime: new Firestore.Timestamp(1684098540, 0)}
);
REST API
การอ่าน PITR รองรับในเมธอดการอ่าน Cloud Firestore ทั้งหมด ซึ่งได้แก่ get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery และ partitionQuery
หากต้องการอ่านโดยใช้เมธอด REST ให้ลองใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้
ในคำขอเมธอดการอ่าน ให้ส่งค่า
readTimeเป็นการประทับเวลา PITR ที่รองรับในเมธอดreadOptionsการประทับเวลา PITR อาจเป็นการประทับเวลาที่มีความแม่นยำระดับไมโครวินาทีภายในชั่วโมงที่ผ่านมา หรือการประทับเวลาแบบเต็มนาทีที่เกินชั่วโมงที่ผ่านมา แต่ต้องไม่เร็วกว่าearliestVersionTimeใช้พารามิเตอร์
readTimeร่วมกับเมธอดBeginTransactionเป็นส่วนหนึ่งของธุรกรรมReadOnlyสำหรับการอ่าน PITR หลายรายการ
Apache Beam
ใช้เครื่องมือเชื่อมต่อ Cloud FirestoreIO Apache Beam เพื่ออ่านหรือเขียนเอกสารในฐานข้อมูล Cloud Firestore ในวงกว้างด้วย Dataflow
การอ่าน PITR ได้รับการรองรับในวิธีการอ่านต่อไปนี้ของเครื่องมือเชื่อมต่อ Cloud FirestoreIO วิธีการอ่านเหล่านี้รองรับเมธอด withReadTime(@Nullable Instant readTime) ที่คุณใช้สำหรับการอ่าน PITR ได้
- FirestoreV1.BatchGetDocuments
- FirestoreV1.ListCollectionIds
- FirestoreV1.ListDocuments
- FirestoreV1.PartitionQuery
Java
ใช้โค้ดต่อไปนี้กับโค้ดไปป์ไลน์ Dataflow ตัวอย่างสำหรับการดำเนินการอ่านหรือเขียนจำนวนมากได้ ตัวอย่างนี้ใช้เมธอด withReadTime(@Nullable Instant readTime) สำหรับการอ่าน PITR
Instant readTime = Instant.ofEpochSecond(1684098540L);
PCollection<Document> documents =
pipeline
.apply(Create.of(collectionId))
.apply(
new FilterDocumentsQuery(
firestoreOptions.getProjectId(), firestoreOptions.getDatabaseId()))
.apply(FirestoreIO.v1().read().runQuery().withReadTime(readTime).withRpcQosOptions(rpcQosOptions).build())
...
ดูรายการตัวอย่าง readTime ทั้งหมดในไปป์ไลน์ Dataflow ได้ที่ที่เก็บ GitHub
โคลนจากฐานข้อมูล
คุณสามารถโคลนฐานข้อมูลที่มีอยู่ ณ การประทับเวลาที่เลือกไว้ลงในฐานข้อมูลใหม่ได้โดยทำดังนี้
ฐานข้อมูลที่โคลนคือฐานข้อมูลใหม่ที่จะสร้างขึ้นในตำแหน่งเดียวกับฐานข้อมูลต้นทาง
ในการสร้างโคลน Cloud Firestore จะใช้ข้อมูลการกู้คืนช่วงเวลา (PITR) ของฐานข้อมูลต้นทาง ฐานข้อมูลที่โคลนจะมีข้อมูลและดัชนีทั้งหมด
โดยค่าเริ่มต้น ฐานข้อมูลที่โคลนจะได้รับการเข้ารหัสในลักษณะเดียวกับฐานข้อมูลต้นทาง โดยใช้การเข้ารหัสเริ่มต้นของ Google หรือการเข้ารหัส CMEK คุณสามารถระบุประเภทการเข้ารหัสอื่นหรือใช้คีย์อื่นสำหรับการเข้ารหัส CMEK ได้
การประทับเวลามีความละเอียด 1 นาทีและระบุจุดเวลาในอดีตในช่วงเวลาที่กำหนดโดยกรอบเวลา PITR ดังนี้
- หากเปิดใช้ PITR สำหรับฐานข้อมูล คุณจะเลือกนาทีใดก็ได้ในช่วง 7 วันที่ผ่านมา (หรือน้อยกว่านั้นหากเปิดใช้ PITR น้อยกว่า 7 วันที่ผ่านมา)
- หากไม่ได้เปิดใช้ PITR คุณจะเลือกนาทีใดก็ได้ในชั่วโมงที่ผ่านมา
- คุณสามารถตรวจสอบการประทับเวลาที่เร็วที่สุดที่เลือกได้ในคำอธิบายของฐานข้อมูล
คอนโซล
คอนโซล Firebase ไม่รองรับการโคลนฐานข้อมูล คุณสามารถใช้คำสั่งสำหรับ Google Cloud CLI เพื่อโคลนฐานข้อมูลได้
gcloud
ใช้คำสั่ง
gcloud firestore databases clone
เพื่อโคลนฐานข้อมูล
gcloud firestore databases clone \
--source-database='SOURCE_DATABASE' \
--snapshot-time='PITR_TIMESTAMP' \
--destination-database='DESTINATION_DATABASE_ID'
แทนที่ค่าต่อไปนี้
SOURCE_DATABASE: ชื่อฐานข้อมูลของฐานข้อมูลที่มีอยู่ซึ่งคุณต้องการโคลน ชื่อจะใช้รูปแบบ
projects/PROJECT_ID/databases/SOURCE_DATABASE_IDPITR_TIMESTAMP: การประทับเวลา PITR ในรูปแบบ RFC 3339 ที่ความละเอียดระดับนาที เช่น
2025-06-01T10:20:00.00Zหรือ2025-06-01T10:30:00.00-07:00DESTINATION_DATABASE_ID: รหัสฐานข้อมูลสำหรับฐานข้อมูลที่โคลนใหม่ รหัสฐานข้อมูลนี้ต้องไม่เชื่อมโยงกับฐานข้อมูลที่มีอยู่
ตัวอย่าง
gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db'
หากต้องการเชื่อมโยงกับแท็กบางรายการขณะโคลนฐานข้อมูล ให้ใช้คำสั่งก่อนหน้าที่มีแฟล็ก --tags ซึ่งเป็นรายการคู่คีย์-ค่าของแท็กที่ไม่บังคับให้เชื่อมโยง
ตัวอย่าง
gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db' \
--tags=key1=value1,key2=value2
โดยค่าเริ่มต้น ฐานข้อมูลที่โคลนจะมีการกำหนดค่าการเข้ารหัสเหมือนกับฐานข้อมูลต้นทาง หากต้องการเปลี่ยนการกำหนดค่าการเข้ารหัส ให้ใช้อาร์กิวเมนต์ --encryption-type ดังนี้
- (ค่าเริ่มต้น)
use-source-encryption: ใช้การกำหนดค่าการเข้ารหัสเดียวกันกับฐานข้อมูลต้นทาง google-default-encryption: ใช้การเข้ารหัสเริ่มต้นของ Googlecustomer-managed-encryption: ใช้การเข้ารหัส CMEK ระบุรหัสคีย์ในอาร์กิวเมนต์--kms-key-name
ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าการเข้ารหัส CMEK สำหรับฐานข้อมูลที่โคลน
gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db' \
--encryption-type='customer-managed-encryption' \
--kms-key-name='projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key'
Firebase CLI
ใช้คำสั่ง firebase firestore:databases:clone เพื่อโคลนฐานข้อมูล
firebase firestore:databases:clone \
'SOURCE_DATABASE' \
'DESTINATION_DATABASE' \
--snapshot-time 'PITR_TIMESTAMP'
แทนที่ค่าต่อไปนี้
SOURCE_DATABASE: ชื่อฐานข้อมูลของฐานข้อมูลที่มีอยู่ซึ่งคุณต้องการโคลน ชื่อจะใช้รูปแบบ
projects/PROJECT_ID/databases/SOURCE_DATABASE_IDDESTINATION_DATABASE: ชื่อฐานข้อมูลสำหรับฐานข้อมูลที่โคลนใหม่ ชื่อจะใช้รูปแบบ
projects/PROJECT_ID/databases/DESTINATION_DATABASE_IDชื่อฐานข้อมูลนี้ต้องไม่เชื่อมโยงกับฐานข้อมูลที่มีอยู่PITR_TIMESTAMP: การประทับเวลา PITR ในรูปแบบ RFC 3339 ที่ความละเอียดระดับนาที เช่น
2025-06-01T10:20:00.00Zหรือ2025-06-01T10:30:00.00-07:00หากไม่ได้ระบุ สแนปชอตที่เลือกจะเป็นเวลาปัจจุบัน โดยปัดเศษลงเป็นนาที
โดยค่าเริ่มต้น ฐานข้อมูลที่โคลนจะมีการกำหนดค่าการเข้ารหัสเหมือนกับฐานข้อมูลต้นทาง หากต้องการเปลี่ยนการกำหนดค่าการเข้ารหัส ให้ใช้อาร์กิวเมนต์ --encryption-type ดังนี้
- (ค่าเริ่มต้น)
USE_SOURCE_ENCRYPTION: ใช้การกำหนดค่าการเข้ารหัสเดียวกันกับฐานข้อมูลต้นทาง GOOGLE_DEFAULT_ENCRYPTION: ใช้การเข้ารหัสเริ่มต้นของ GoogleCUSTOMER_MANAGED_ENCRYPTION: ใช้การเข้ารหัส CMEK ระบุรหัสคีย์ในอาร์กิวเมนต์--kms-key-name
ตัวอย่างต่อไปนี้แสดงวิธีกำหนดค่าการเข้ารหัส CMEK สำหรับฐานข้อมูลที่โคลน
firebase firestore:databases:clone \
'projects/example-project/databases/(default)' \
'projects/example-project/databases/example-dest-db' \
--snapshot-time 'PITR_TIMESTAMP' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION
ข้อจำกัด
การดำเนินการโคลนจะไม่โคลนข้อมูลการค้นหา App Engine หรือเอนทิตี BLOB จากฐานข้อมูล (default) ข้อมูลนี้ใช้ได้กับฐานข้อมูล (default) เท่านั้น และจะไม่มีประโยชน์หากคุณโคลนจาก (default) ไปยังฐานข้อมูลที่ไม่รองรับข้อมูลดังกล่าว จึงไม่รวมอยู่ในการโคลน
ส่งออกและนำเข้าจากข้อมูล PITR
คุณสามารถส่งออกฐานข้อมูลไปยัง Cloud Storage จากข้อมูล PITR โดยใช้คำสั่ง gcloud firestore export คุณสามารถส่งออกข้อมูล PITR ที่มีการประทับเวลาเป็นนาทีเต็มภายใน 7 วันที่ผ่านมา แต่ต้องไม่ก่อนวันที่ earliestVersionTime หากไม่มีข้อมูลในการประทับเวลาที่ระบุอีกต่อไป การดำเนินการส่งออกจะล้มเหลว
การดำเนินการส่งออก PITR รองรับตัวกรองทั้งหมด รวมถึงการส่งออกเอกสารทั้งหมดและการส่งออกคอลเล็กชันที่เฉพาะเจาะจง
ส่งออกฐานข้อมูล โดยระบุพารามิเตอร์
snapshot-timeเป็นการประทับเวลาการกู้คืนที่เลือกgcloud
เรียกใช้คำสั่งต่อไปนี้เพื่อส่งออกฐานข้อมูลไปยังที่เก็บข้อมูล
gcloud firestore export gs://BUCKET_NAME_PATH \ --snapshot-time=PITR_TIMESTAMP \ --collection-ids=COLLECTION_IDS \ --namespace-ids=NAMESPACE_IDSที่ไหน
BUCKET_NAME_PATH- บัケット Cloud Storage ที่ถูกต้องซึ่งมีคำนำหน้าเส้นทาง (ไม่บังคับ) ที่ใช้จัดเก็บไฟล์ที่ส่งออกPITR_TIMESTAMP- การประทับเวลา PITR ที่รายละเอียดระดับนาที เช่น2023-05-26T10:20:00.00Zหรือ2023-10-19T10:30:00.00-07:00COLLECTION_IDS- รายการรหัสคอลเล็กชันหรือรหัสกลุ่มคอลเล็กชัน เช่น'specific-collection-group1','specific-collection-group2'NAMESPACE_IDS- รายการรหัสเนมสเปซ เช่น'customer','orders'
โปรดทราบประเด็นต่อไปนี้ก่อนส่งออกข้อมูล PITR
- ระบุการประทับเวลาในรูปแบบ RFC 3339
เช่น
2023-05-26T10:20:00.00Zหรือ2023-10-19T10:30:00.00-07:00 - ตรวจสอบว่าการประทับเวลาที่คุณระบุเป็นการประทับเวลาแบบเต็มนาทีภายใน 7 วันที่ผ่านมา แต่ไม่เกิน
earliestVersionTimeหากไม่มีข้อมูลอยู่ในการประทับเวลาที่ระบุ ระบบจะสร้างข้อผิดพลาดขึ้น การประทับเวลาต้องเป็นนาทีเต็ม แม้ว่าเวลาที่ระบุจะอยู่ภายในชั่วโมงที่ผ่านมาก็ตาม - ระบบจะไม่เรียกเก็บเงินสำหรับการส่งออก PITR ที่ไม่สำเร็จ
นำเข้าไปยังฐานข้อมูล
ใช้ขั้นตอนในหัวข้อนำเข้าเอกสารทั้งหมดเพื่อนำเข้าฐานข้อมูลที่ส่งออก หากมีเอกสารอยู่ในฐานข้อมูลอยู่แล้ว ระบบจะเขียนทับเอกสารนั้น