Memodifikasi Skema MySQL dengan Skeema – Bagian 1 “Operasi Dasar”

Database


Sebagai seorang insinyur basis data, salah satu tantangan terbesar dalam aktivitas sehari-hari adalah melakukan DDL pada tabel dengan lalu lintas tinggi dan padat transaksi. Ini akan menjadi overhead ketika mengelola banyak server/pecahan.

Sebagai proses standar, pertama-tama kami menerapkan perubahan dalam DEV dan QA sebelum menerapkannya ke produksi.

Dalam lingkungan yang terfragmentasi, akan menjadi biaya besar untuk mempertahankan perubahan skema pada server DEV, QA, dan PROD. Karena kita akan memiliki beberapa server dalam berbagi.

Untuk mengatasi pengawasan penerapan ini, alat Skeema juga membantu menerapkan perubahan pada QA, DEV, dan PROD dengan cara yang aman dan paralel (untuk Pecahan).

Blog ini berfokus pada fungsionalitas dasar Skeema, akan memiliki serangkaian blog di Skeema

  1. Tentang alat Skeema:
  2. Alur kerja internal alat Skeema:
  3. Operasi dasar:
    1. Awal:
    2. Direktori tuan rumah:
    3. Perbedaan:
    4. dorongan :
    5. Seri :
    6. Lynette:
  4. Ringkasan :

Alat Skeema ditulis dalam bahasa Golang dan juga merupakan alat pengembangan aktif. Ini hanya mendukung DDL (buat, jatuhkan, modifikasi) di beberapa server. Itu tidak mendukung penggantian nama dan pemotongan di DDL.

Untuk informasi lebih lanjut – situs web Skeema

Alur kerja internal alat Skeema dijelaskan dalam diagram alur di bawah ini

Setelah menginstal alat Skeema, kami tidak dapat menggunakannya secara langsung. Pertama kita perlu menginisialisasi alat Skeema. Setelah inisialisasi, kita dapat menjalankan aktivitas menggunakan opsi.

Syntax : Skeema <command> <options>
Memerintah Keterangan
Mulailah Mulai server menggunakan alat Skeema. Jadi direktori host akan dibuat. Direktori host menyimpan direktori skema dan file metadata yang disebut file .skeema.
Direktori host mempertahankan struktur tabel dengan a sql pengaya. Dan .skema File yang menyimpan informasi metadata.
Jika ada perubahan yang perlu diterapkan melalui alat Skeema, Anda hanya boleh mengubah file *.sql.
Perbedaan Opsi diff digunakan untuk mengidentifikasi perubahan yang dibuat pada file *.sql di direktori host dan struktur aktual dalam produksi.
Lint Lint digunakan untuk mengurai perubahan yang dibuat ke *.sql sebelum mendorongnya ke server.
Ini mem-parsing kueri dengan menjalankannya terhadap database skeem_tmp. Setelah parsing, database secara otomatis dihapus.
dorongan Setelah mengonfirmasi perubahan, publikasikan menggunakan perintah push. Kami dapat mendorong perubahan ke server.
Seri Jika ada perubahan yang dilakukan langsung di server dan tidak melalui alat Skeema. Oleh karena itu, struktur file *.sql tidak diperbarui. Kita dapat menggunakan opsi tarik untuk memperbaruinya. Ini menarik struktur terakhir dari server dan meletakkannya di file *.sql.

Operasi dasar:

Awal:

root@localhost:/home/mydbops/skeema# skeema init -h *.*.*.* -u test -p -d production
Enter password:
2022-07-26 15:06:21 [INFO]  Using host dir /home/mydbops/skeema/production for *.*.*.*:3306

2022-07-26 15:06:21 [INFO]  Populating /home/mydbops/skeema/production/mysqldiff
2022-07-26 15:06:21 [INFO]  Created /home/mydbops/skeema/production/mysqldiff/mysqldiff_test.sql (191 bytes)

2022-07-26 15:06:21 [INFO]  Populating /home/mydbops/skeema/production/mydbops
2022-07-26 15:06:21 [INFO]  Created /home/mydbops/skeema/production/mydbops/sbtest.sql (271 bytes)

2022-07-26 15:06:21 [INFO]  Populating /home/mydbops/skeema/production/test
2022-07-26 15:06:21 [INFO]  Created /home/mydbops/skeema/production/test/message.sql (16649 bytes)

Kami menginisialisasi server menggunakan alat Skeema. Jadi direktori host dibuat sebagai “ProduksiKita dapat menentukan direktori menggunakan nama -D Opsi atau direktori dibuat berdasarkan nama host.

Di dalam folder host, file *.sql dan file .skeema akan dibuat.

Direktori tuan rumah:

root@localhost:/home/mydbops/skeema# ls -ltrh
total 8.0K
drwxr-xr-x 10 root root 4.0K Jul 26 15:04 production

root@localhost:/home/mydbops/skeema/production# ls -ltrh
total 32K
drwxr-xr-x 2 root root 4.0K Jul 26 15:06 mysqldiff
drwxr-xr-x 2 root root 4.0K Jul 26 15:06 sbtest
drwxr-xr-x 2 root root 4.0K Jul 26 15:06 test
drwxr-xr-x 2 root root 4.0K Jul 26 15:10 mydbops

root@localhost:/home/mydbops/skeema/production# cat .skeema
generator=skeema:1.7.1-community

[production]
flavor=percona:5.7
host=*.*.*.*
port=3306
user=test
password="*.*.*.*"

root@localhost:/home/mydbops/skeema/production/mydbops# ls -al
total 16
drwxr-xr-x  2 root root 4096 Jul 26 15:10 .
drwxr-xr-x 10 root root 4096 Jul 26 15:06 ..
-rw-r--r--  1 root root   80 Jul 26 15:06 .skeema
-rw-r--r--  1 root root  288 Jul 26 15:10 sbtest.sql
root@localhost:/home/mydbops/skeema/production/mydbops#
root@localhost:/home/mydbops/skeema/production/mydbops# pwd
/home/mydbops/skeema/production/mydbops
root@localhost:/home/mydbops/skeema/production/mydbops# cat sbtest.sql
CREATE TABLE `sbtest` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `k` int(10) unsigned NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

File .Skeema memiliki metadata dan file *.sql memiliki struktur tabel. Jika kita perlu menjalankan DDL pada salah satu tabel menggunakan alat Skeema, kita perlu mengubahnya di file *.sql.

Perbedaan:

Diff digunakan untuk mengidentifikasi perubahan yang kita buat di file *.sql dengan membandingkan struktur di file *.sql dengan struktur saat ini di server.

root@localhost:/home/mydbops/skeema# skeema diff
2022-07-26 15:55:59 [INFO]  Generating diff of *.*.*.*:3306 mysqldiff vs /home/mydbops/skeema/production/mysqldiff/*.sql
2022-07-26 15:55:59 [INFO]  *.*.*.*:3306 mysqldiff: No differences found

2022-07-26 15:55:59 [INFO]  Generating diff of *.*.*.*:3306 mydbops vs /home/mydbops/skeema/production/mydbops/*.sql
-- instance: *.*.*.*:3306
USE `mydbops`;
\! /usr/bin/pt-online-schema-change --execute --alter 'ADD KEY `c` (`c`)' D=mydbops,t=sbtest,h=*.*.*.*,P=3306,u=test,p=XXXXX
2022-07-26 15:55:59 [INFO]  *.*.*.*:3306 mydbops: diff complete

2022-07-26 15:55:59 [INFO]  Generating diff of *.*.*.*:3306 sbtest vs /home/mydbops/skeema/production/sbtest/*.sql
2022-07-26 15:55:59 [INFO]  *.*.*.*:3306 sbtest: No differences found

2022-07-26 15:55:59 [INFO]  Generating diff of *.*.*.*:3306 test vs /home/mydbops/skeema/production/test/*.sql
2022-07-26 15:55:59 [INFO]  *.*.*.*:3306 test: No differences found

Saya telah membuat modifikasi di sbtest.sql sehingga perintah diff mengenalinya dan membagikan contoh perintah untuk dijalankan seperti lari kering.

dorongan :

Setelah mengonfirmasi perubahan, terapkan ke server. Untuk mengeksekusi DDL di server, kita harus menggunakan perintah push.

root@localhost:/home/mydbops/skeema/production# skeema push
2022-07-26 16:32:51 [INFO]  Pushing changes from /home/mydbops/skeema/production/mysqldiff/*.sql to *.*.*.*:3306 mysqldiff
2022-07-26 16:32:51 [INFO]  *.*.*.*:3306 mysqldiff: No differences found

2022-07-26 16:32:51 [INFO]  Pushing changes from /home/mydbops/skeema/production/mydbops/*.sql to *.*.*.*:3306 mydbops
-- instance: *.*.*.*:3306
USE `mydbops`;
\! /usr/bin/pt-online-schema-change --execute --alter 'ADD KEY `c` (`c`)' D=mydbops,t=sbtest,h=*.*.*.*,P=3306,u=test,p=XXXXX
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_CTYPE = "UTF-8",
	LC_TERMINAL_VERSION = "3.4.15",
	LC_TERMINAL = "iTerm2",
	LANG = (unset)
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Found 2 slaves:
  warehouse-b2b-db-playground-none-8491856
  warehouse-b2b-db-playground-none-8491857
Will check slave lag on:
  warehouse-b2b-db-playground-none-8491856
  warehouse-b2b-db-playground-none-8491857
Operation, tries, wait:
  analyze_table, 10, 1
  copy_rows, 10, 0.25
  create_triggers, 10, 1
  drop_triggers, 10, 1
  swap_tables, 10, 1
  update_foreign_keys, 10, 1
Altering `mydbops`.`sbtest`...
Creating new table...
Created new table mydbops._sbtest_new OK.
Altering new table...
Altered `mydbops`.`_sbtest_new` OK.
2022-07-26T16:35:05 Creating triggers...
2022-07-26T16:35:05 Created triggers OK.
2022-07-26T16:35:05 Copying approximately 1972656 rows...
2022-07-26T16:35:29 Copied rows OK.
2022-07-26T16:35:29 Analyzing new table...
2022-07-26T16:35:29 Swapping tables...
2022-07-26T16:35:29 Swapped original and new tables OK.
2022-07-26T16:35:29 Dropping old table...
2022-07-26T16:35:29 Dropped old table `mydbops`.`_sbtest_old` OK.
2022-07-26T16:35:29 Dropping triggers...
2022-07-26T16:35:29 Dropped triggers OK.
Successfully altered `mydbops`.`sbtest`.
2022-07-26 16:35:29 [INFO]  *.*.*.*:3306 mydbops: push complete

2022-07-26 16:35:29 [INFO]  Pushing changes from /home/mydbops/skeema/production/sbtest/*.sql to *.*.*.*:3306 sbtest
2022-07-26 16:35:29 [INFO]  *.*.*.*:3306 sbtest: No differences found

2022-07-26 16:35:29 [INFO]  Pushing changes from /home/mydbops/skeema/production/test/*.sql to *.*.*.*:3306 test
2022-07-26 16:35:29 [INFO]  *.*.*.*:3306 test: No differences found

Sekarang perubahan ditransfer ke server satu per satu. Saya telah menggunakan pt-osc sebagai rasa untuk mengimplementasikan perubahan.

Seri :

Perintah pull digunakan untuk mengeluarkan tabel dan struktur database terbaru dari server. Akan lebih berguna jika ada yang melakukan DDL langsung di server daripada melalui alat Skeema. Untuk memastikan bahwa alat Skeema menunjuk ke build yang benar, kita perlu menjalankan pull dan mengumpulkan build yang diperbarui.

root@localhost:/home/mydbops/skeema# skeema pull
2022-07-26 16:40:01 [INFO]  Updating /home/mydbops/skeema/production/mysqldiff to reflect *.*.*.*:3306 mysqldiff

2022-07-26 16:40:01 [INFO]  Updating /home/mydbops/skeema/production/mydbops to reflect *.*.*.*:3306 mydbops
2022-07-26 16:40:01 [INFO]  Wrote /home/mydbops/skeema/production/mydbops/sbtest.sql (271 bytes)

2022-07-26 16:40:01 [INFO]  Updating /home/mydbops/skeema/production/sbtest to reflect *.*.*.*:3306 sbtest

2022-07-26 16:40:01 [INFO]  Updating /home/mydbops/skeema/production/test to reflect *.*.*.*:3306 test

Lynette:

Lint adalah untuk menguraikan perubahan yang diterapkan ke file .sql dengan mengeksekusinya dalam skema sementara yang disebut _skeema_temp setelah penguraian. Paket akan dihapus secara otomatis.

root@warehouse-b2b-db-playground-none-8448763:/home/mydbops/skeema/production# skeema lint
2022-07-29 18:38:40 [INFO]  Linting /home/mydbops/skeema/production
2022-07-29 18:38:40 [INFO]  Linting /home/mydbops/skeema/production/mysqldiff
2022-07-29 18:38:40 [INFO]  Linting /home/mydbops/skeema/production/mydbops
"2022-07-29 18:38:40 [ERROR] /home/mydbops/skeema/production/mydbops/sbtest.sql:9: SQL syntax error: 
Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server 
version for the right syntax to use near ') ENGINE=InnoDB DEFAULT CHARSET=latin1' at line 9"
2022-07-29 18:38:40 [INFO]  Linting /home/mydbops/skeema/production/sbtest
2022-07-29 18:38:51 [INFO]  Linting /home/mydbops/skeema/production/test
2022-07-29 18:38:54 [ERROR] Found 1 error and 0 warnings
root@warehouse-b2b-db-playground-none-8448763:/home/mydbops/skeema/production#

Ringkasan :

Di blog ini, kami telah membahas operasi dasar dan alat skeema untuk mendapatkan gambaran umum tentangnya. Di blog mendatang, kita juga akan melihat cara menggunakan alat Skeema berdasarkan kasus produksi dan cara menambahkan rasa untuk membuat perubahan.



Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *