All Products
Search
Document Center

Elastic Compute Service:Buat snapshot konsisten aplikasi untuk MySQL di Linux

Last Updated:May 16, 2026

Gunakan instans CentOS 7.9 dengan MySQL 8.0 untuk membuat dan memverifikasi snapshot konsisten aplikasi yang mencegah korupsi data selama pencadangan.

Prasyarat

  • Instans ECS menggunakan ESSD, dan fitur multi-attach dinonaktifkan untuk disk tersebut.

  • Instans ECS berada dalam status Running. Cloud Assistant berada dalam status Normal pada instans tersebut. Untuk melihat status Cloud Assistant, lihat Periksa status Cloud Assistant dan atasi pengecualian.

  • MySQL telah diinstal, dan Anda memiliki username serta password database. Lihat Deploy database MySQL secara manual (Linux).

  • Peran RAM dengan kebijakan kustom untuk snapshot konsisten aplikasi telah disambungkan ke instans ECS. Lihat Buat peran RAM dan sambungkan ke instans ECS.

    Catatan

    Cloud Assistant memerlukan izin tertentu untuk mengakses instans ECS dan menjalankan perintah. Berikan izin ini melalui peran RAM.

    • Konfigurasikan peran RAM kustom, seperti AppSnapshotRoleName.

    • Sambungkan kebijakan kustom ke peran RAM tersebut. Kebijakan contoh berikut memberikan izin untuk mengkueri snapshot, membuat snapshot, menambahkan tag, dan mengkueri informasi disk.

      {
          "Version": "1",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "ecs:DescribeSnapshot*",
                      "ecs:CreateSnapshot*",
                      "ecs:TagResources",
                      "ecs:DescribeDisks"
                  ],
                  "Resource": [
                      "*"
                  ],
                  "Condition": {}
              }
          ]
      }

Alur kerja

Alur kerja berikut membuat snapshot konsisten aplikasi dan memverifikasi bahwa database dipulihkan ke kondisi persis seperti saat snapshot diambil:

  1. Langkah 1: Buat skrip prescript.sh dan postscript.sh

    Buat skrip prescript (prescript.sh) untuk menjeda penulisan database dan skrip postscript (postscript.sh) untuk melanjutkannya. Skrip ini diperlukan untuk snapshot konsisten aplikasi.

  2. Langkah 2: Siapkan lingkungan verifikasi database

    Buat tabel database dan prosedur tersimpan (TestPIT) yang mensimulasikan penulisan berkelanjutan, sehingga Anda dapat memverifikasi efektivitas snapshot setelah rollback.

  3. Langkah 3: Buat snapshot konsisten aplikasi di Konsol

    Buat snapshot konsisten aplikasi untuk instans Linux yang menjalankan MySQL. Skrip prescript dan postscript secara sementara menjeda dan melanjutkan penulisan database guna memastikan konsistensi data.

  4. Langkah 4: Verifikasi bahwa snapshot konsisten aplikasi telah dibuat

    Periksa hasil eksekusi perintah Asisten Cloud, termasuk waktu jeda dan waktu melanjutkan database.

  5. Langkah 5: Verifikasi pemulihan data dari snapshot konsisten aplikasi

    Lakukan rollback disk menggunakan snapshot tersebut. Bandingkan waktu penulisan data terakhir di MySQL dengan waktu eksekusi prescript.sh untuk memverifikasi pemulihan data yang benar.

    • Jika waktu penulisan terakhir lebih awal daripada waktu eksekusi prescript, tidak ada penulisan yang terjadi selama jeda. Data yang dipulihkan sesuai dengan kondisi snapshot.

    • Jika waktu penulisan terakhir sama dengan atau lebih baru daripada waktu eksekusi prescript, berarti terjadi penulisan selama jeda, yang mengindikasikan snapshot tidak bekerja sebagaimana mestinya.

Prosedur

Langkah 1: Buat skrip prescript.sh dan postscript.sh

Penting

Skrip prescript.sh dan postscript.sh dalam topik ini hanya untuk demonstrasi. Tulis skrip sesuai kebutuhan bisnis aktual Anda. Lihat Buat snapshot konsisten aplikasi.

  1. Sambungkan ke instans ECS sebagai pengguna root.

    Lihat Masuk ke instans Linux menggunakan Workbench.

  2. Buat /tmp/prescript.sh dan tambahkan konten skrip.

    1. Buat /tmp/prescript.sh sebagai root.

      vim /tmp/prescript.sh
    2. Tekan i untuk masuk ke mode edit.

    3. Sesuaikan konten prescript.sh untuk aplikasi Anda.

      Konten prescript.sh

      TIMESTAMP=`date +%s`
      MYSQL_TEMP_FILE_NAME="/tmp/mysqlfreeze${TIMESTAMP}.tmp"
      LOG_FILE_NAME="/tmp/mysqlfreeze${TIMESTAMP}.log"
      
      # Set your MySQL username
      export MYSQL_USER="$MYSQL_USER"
      # Set your MySQL password
      export MYSQL_PWD="$MYSQL_PASSWORD"
      
      function Log()
      {
          echo "$1" 
          echo "$1" >> ${LOG_FILE_NAME}
      }
      
      
      function ExitWithResult()
      {
          Log "[INFO]:mysql freeze result is $1."
          exit $1
      }
      
      function Main()
      {
          Log "*********************************************************************"
          Log "[INFO]:Begin to freeze mysql."
      
          which mysql
          if [ $? -ne 0 ]
          then
              Log "[INFO]:mysql is not installed."
              ExitWithResult 0
          fi  
      
          systemctl status mysqld.service | grep "inactive (dead)"
          if [ $? -ne 1 ]
          then
              Log "[ERROR]:mysql is not running."
              ExitWithResult 0
          fi  
      
          mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "show processlist;" > "${MYSQL_TEMP_FILE_NAME}" 2>&1
          if [ $? -ne 0 ]
          then
              cat ${MYSQL_TEMP_FILE_NAME} >>"${LOG_FILE_NAME}"
              [ -f ${MYSQL_TEMP_FILE_NAME} ] && rm -rf ${MYSQL_TEMP_FILE_NAME}
              Log "[ERROR]:Show process list failed."
              ExitWithResult 1
          fi
      
      
          process_id=`cat ${MYSQL_TEMP_FILE_NAME} | grep "select 1 and sleep(25)" | awk -F " " '{print $1}'`
          if [ "$process_id" != "" ]
          then
              cat ${MYSQL_TEMP_FILE_NAME} >>"${LOG_FILE_NAME}"
              [ -f ${MYSQL_TEMP_FILE_NAME} ] && rm -rf ${MYSQL_TEMP_FILE_NAME}
              Log "[ERROR]:MySQL already been freezed "
              ExitWithResult 1
          fi
      
          cat ${MYSQL_TEMP_FILE_NAME}
      
          Log "[INFO]:Try to execute flush tables command"
      
             echo "flush tables with read lock;select 1 and sleep(25);" | nohup mysql -u$MYSQL_USER -p$MYSQL_PASSWORD >> "${LOG_FILE_NAME}" 2>&1 &
          if [ $? -ne 0 ]
          then
              Log "[ERROR]:Freeze mysql failed."
              ExitWithResult 1
          fi  
      
          Log "[INFO]:Flush tables command execute success"
      
          checkTime=0
          while [ 1 ]
          do
              mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "show processlist;" > "${MYSQL_TEMP_FILE_NAME}" 2>&1
              if [ $? -ne 0 ]
              then
                  cat ${MYSQL_TEMP_FILE_NAME} >>"${LOG_FILE_NAME}"
                  [ -f ${MYSQL_TEMP_FILE_NAME} ] && rm -rf ${MYSQL_TEMP_FILE_NAME}
                  Log "[ERROR]:Show process list failed."
                  ExitWithResult 1
              fi
              
              cat ${MYSQL_TEMP_FILE_NAME}
      
              process_id=`cat ${MYSQL_TEMP_FILE_NAME} | grep "select 1 and sleep(25)" | awk -F " " '{print $1}'`
              if [ "$process_id" = "" ]
              then
                  checkTime=`expr $checkTime + 1`
                  Log "[INFO]:Mysql is not freeze. checkTime is ${checkTime}"
                  sleep 1
              else
                  Log "[INFO]:Found sleep command in processlist,freeze success"
                  break
              fi
      
                 if [ $checkTime -eq 10 ]
              then
                  cat "${MYSQL_TEMP_FILE_NAME}" >>"${LOG_FILE_NAME}" 2>&1
                  
                  freeze_id=`cat ${MYSQL_TEMP_FILE_NAME} | grep "flush tables with read lock" | awk -F " " '{print $1}'`            
                  mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "kill $freeze_id;" >> "${LOG_FILE_NAME}" 2>&1
                  if [ $? -ne 0 ]
                  then
                      Log "[ERROR]:Thaw mysql failed."
                  fi    
      
                  [ -f ${MYSQL_TEMP_FILE_NAME} ] && rm -rf ${MYSQL_TEMP_FILE_NAME}
                  Log "[ERROR]:Mysql is not freeze. Will return error"
                  ExitWithResult 1
              fi
          done
      
             [ -f ${MYSQL_TEMP_FILE_NAME} ] && rm -rf ${MYSQL_TEMP_FILE_NAME}
          Log "[INFO]:Finish freeze mysql."
          ExitWithResult 0
      }
      Main

      Ubah parameter berikut:

      • $MYSQL_USER: Username MySQL Anda.

      • $MYSQL_PASSWORD: Password MySQL Anda.

    4. Tekan Esc, masukkan :wq, lalu tekan Enter untuk menyimpan dan keluar.

    5. Atur izin menjadi 700 (hanya root).

      Penting

      Hanya pengguna root yang boleh memiliki izin baca, tulis, dan eksekusi (700). Jika tidak, eksekusi skrip akan gagal.

      chmod 700 /tmp/prescript.sh
  3. Buat /tmp/postscript.sh dan tambahkan konten skrip.

    1. Buat /tmp/postscript.sh sebagai root.

      vim /tmp/postscript.sh
    2. Tekan i untuk masuk ke mode edit.

    3. Sesuaikan konten postscript.sh untuk aplikasi Anda.

      Konten postscript.sh

      TIMESTAMP=`date +%s`
      MYSQL_TEMP_FILE_NAME="/tmp/mysqlthaw${TIMESTAMP}.tmp"
      LOG_FILE_NAME="/tmp/mysqlthaw${TIMESTAMP}.log"
      # Set your MySQL username
      export MYSQL_USER="$MYSQL_USER"
      # Set your MySQL password
      export MYSQL_PWD="$MYSQL_PASSWORD"
      
      function Log()
      {
          echo "$1" 
          echo "$1" >> ${LOG_FILE_NAME}
      }
      
      
      function ExitWithResult()
      {
          Log "[INFO]:mysql unfreeze result is $1."
          exit $1
      }
      
      function Main()
      {
          Log "*********************************************************************"
          Log "[INFO]:Begin to thaw mysql."   
      
          which mysql
          if [ $? -ne 0 ]
          then
              Log "[INFO]:mysql is not installed."
              ExitWithResult 0
          fi  
      
          systemctl status mysqld.service | grep "inactive (dead)"
          if [ $? -ne 1 ]
          then
              Log "[ERROR]:mysql is not running."
              ExitWithResult 0
          fi  
      
      
          mysql -u$MYSQL_USER  -e "show processlist;" > "${MYSQL_TEMP_FILE_NAME}" 2>&1
          if [ $? -ne 0 ]
          then
              cat ${MYSQL_TEMP_FILE_NAME} >>"${LOG_FILE_NAME}"
              [ -f ${MYSQL_TEMP_FILE_NAME} ] && rm -rf ${MYSQL_TEMP_FILE_NAME}
              Log "[ERROR]:show process list failed."
              ExitWithResult 1
          fi
      
          Log "[INFO]:show process list success."
      
          cat ${MYSQL_TEMP_FILE_NAME}
          
          process_ids=`cat ${MYSQL_TEMP_FILE_NAME} | grep "select 1 and sleep(25)" | awk -F " " '{print $1}'`
          if [ "$process_ids" = "" ]
          then
              [ -f ${MYSQL_TEMP_FILE_NAME} ] && rm -rf ${MYSQL_TEMP_FILE_NAME}
              Log "[ERROR]:Get freeze process_id failed."
              ExitWithResult 1
          fi
      
          cat ${MYSQL_TEMP_FILE_NAME} | grep "select 1 and sleep(25)" | awk -F " " '{print $1}'| while read pid
          do
              Log "[INFO]:Try to stop sql process ${pid}."
      
              mysql -u$MYSQL_USER  -e "kill $pid;" >> "${LOG_FILE_NAME}" 2>&1
              if [ $? -ne 0 ]
              then
                  [ -f ${MYSQL_TEMP_FILE_NAME} ] && rm -rf ${MYSQL_TEMP_FILE_NAME}
                  Log "[ERROR]:Thaw mysql failed.PIDs is ${process_ids}"
                  ExitWithResult 1
              fi   
              Log "[INFO]:Stop sql process ${pid} success."
      
          done 
          
          [ -f ${MYSQL_TEMP_FILE_NAME} ] && rm -rf ${MYSQL_TEMP_FILE_NAME}
          Log "[INFO]:Finish thaw mysql."
          ExitWithResult 0
      }
      Main

      Ubah parameter berikut:

      • $MYSQL_USER: Username MySQL Anda.

      • $MYSQL_PASSWORD: Password MySQL Anda.

    4. Tekan Esc, masukkan :wq, lalu tekan Enter untuk menyimpan dan keluar.

    5. Atur izin menjadi 700 (hanya root).

      Penting

      Hanya pengguna root yang boleh memiliki izin baca, tulis, dan eksekusi (700). Jika tidak, eksekusi skrip akan gagal.

      chmod 700 /tmp/postscript.sh
  4. Masuk ke /tmp dan verifikasi izin skrip.

    cd /tmp
    ls -l

    Output berikut menunjukkan izin yang benar.

    image

Langkah 2: Siapkan lingkungan verifikasi database

  1. Buat skrip uji /root/test.sql.

    1. Buat dan buka /root/test.sql.

      vim /root/test.sql
    2. Tekan i untuk masuk ke mode edit.

    3. Tambahkan skrip SQL verifikasi.

      Skrip ini membuat tabel (PointInTime) dan prosedur tersimpan (TestPIT):

      USE AdventureWorks;
      CREATE TABLE PointInTime(id int, t datetime);
      DELIMITER $$
      CREATE PROCEDURE `TestPIT`()
      BEGIN
      DECLARE i int;
      SET i=1;
      WHILE i < 180
      DO
      INSERT INTO PointInTime VALUES(i, now());
      SELECT SLEEP(1);
      SET i=i+1;
      END WHILE;
      END $$
      DELIMITER ;
    4. Tekan Esc, masukkan :wq, lalu tekan Enter untuk menyimpan dan keluar.

  2. Masuk ke MySQL.

    Jalankan perintah berikut dan masukkan password MySQL saat diminta.

    mysql -u <mysqlUserName> -p

    Ganti <mysqlUserName> dengan username MySQL Anda.

  3. Buat database bernama AdventureWorks.

    CREATE DATABASE AdventureWorks;
  4. Jalankan skrip uji.

    source /root/test.sql
  5. Panggil prosedur tersimpan (TestPIT).

    CALL TestPIT;
    Penting

    Anda harus membuat snapshot konsisten aplikasi sebelum TestPIT selesai. Prosedur ini berjalan sekitar 3 menit.

Langkah 3: Buat snapshot konsisten aplikasi di Konsol

  1. Buka Konsol ECS - grup konsistensi snapshot.

  2. Di pojok kiri atas halaman, pilih wilayah dan kelompok sumber daya.地域

  3. Pada tab Snapshot-consistent Groups, klik Create Snapshot-consistent Group.

  4. Pada kotak dialog Create Snapshot, konfigurasikan grup konsistensi snapshot.

    1. Resource Types secara default adalah Instance.

    2. Pilih instans dan disk ESSD-nya.

    3. Bentangkan Advanced Settings dan aktifkan snapshot konsisten aplikasi.

      1. Pilih Enable Application-consistent Snapshot.

      2. Atur path prescript.sh dan postscript.sh ke skrip yang dibuat di Langkah 1.

      3. Atur durasi untuk File System I/O Pause and Resume.

  5. Klik OK.

    Perintah mengembalikan ID eksekusi Cloud Assistant. Gunakan ID ini untuk melihat hasil eksekusi.

Langkah 4: Verifikasi bahwa snapshot konsisten aplikasi telah dibuat

  1. Klik ID eksekusi Cloud Assistant untuk melihat hasilnya.

    image

    Exit Code bernilai 0 menunjukkan snapshot berhasil dibuat. Output menampilkan ID snapshot dan grup konsistensi snapshot.

    Catatan

    Jika Exit Code bukan 0, atasi masalah berdasarkan kode kesalahan Exit Code. Lihat Kode kesalahan.

  2. Lihat waktu jeda dan lanjut database dalam output Cloud Assistant.

    Cari waktu mulai prescript.sh dan waktu selesai postscript.sh.

    • Prescript.sh dijalankan pada 2024-08-27 15:27:55, menandakan database menjeda penulisan pada waktu ini.image

    • Postscript.sh dijalankan pada 2024-08-27 15:27:57, menandakan database melanjutkan penulisan pada waktu ini.

      image

  3. Lihat grup konsistensi snapshot dan snapshot disk.

    1. Buka Konsol ECS - grup konsistensi snapshot.

    2. Pada tab Snapshot-consistent Groups, klik ID grup konsistensi snapshot untuk melihat detailnya.

    3. Pada bagian Snapshot Information, verifikasi bahwa tag snapshot mengonfirmasi konsistensi aplikasi.

      Tag snapshot disk APPConsistent:True mengonfirmasi bahwa snapshot konsisten aplikasi telah dibuat.

      image

  4. Sambungkan ke MySQL dan periksa waktu jeda commit data.

    1. Sambungkan ke instans ECS.

      Lihat Masuk ke instans Linux menggunakan Workbench.

    2. Masuk ke MySQL.

      Jalankan perintah berikut dan masukkan password MySQL saat diminta.

      mysql -u <mysqlUserName> -p

      Ganti <mysqlUserName> dengan username MySQL Anda.

    3. Kueri tabel PointInTime.

      USE AdventureWorks;
      SELECT * FROM PointInTime;
    4. Lihat waktu jeda database dalam hasil kueri.

      Tidak ada data yang dimasukkan antara 2024-08-27 15:27:55 dan 2024-08-27 15:27:58.

      image

Langkah 5: Verifikasi pemulihan data dari snapshot konsisten aplikasi

  1. Lakukan rollback disk menggunakan grup konsistensi snapshot.

  2. Masuk ke MySQL dan kueri tabel PointInTime.

    1. Sambungkan ke instans ECS.

      Lihat Masuk ke instans Linux menggunakan Workbench.

    2. Masuk ke MySQL.

      Jalankan perintah berikut dan masukkan password MySQL saat diminta.

      mysql -u <mysqlUserName> -p

      Ganti <mysqlUserName> dengan username MySQL Anda.

    3. Kueri tabel PointInTime.

      USE AdventureWorks;
      SELECT * FROM PointInTime;
    4. Lihat timestamp catatan terakhir setelah pemulihan data.

      Catatan terakhir dimasukkan pada 2024-08-27 15:27:54, lebih awal daripada waktu jeda 2024-08-27 15:27:55 yang dicatat di Langkah 4. Hal ini mengonfirmasi bahwa data telah dipulihkan dengan benar dari snapshot konsisten aplikasi.

      image