Dokumen ini mencakup perubahan yang menghentikan kompatibilitas (breaking changes) serta perbedaan perilaku antara AnalyticDB for PostgreSQL V4.3 dan V6.0. Sebelum melakukan upgrade, tinjau setiap bagian untuk menilai dampaknya dan terapkan perbaikan yang diperlukan.
Daftar periksa sebelum upgrade
Tinjau item berikut sebelum melakukan upgrade. Setiap item mencakup tautan ke bagian terkait untuk informasi detail dan langkah pemulihan.
Pengoptimal kueri — Pengoptimal default berubah dari Legacy menjadi ORCA. Uji kueri Anda.
Karakter escape — Backslash dalam string tidak lagi berfungsi sebagai karakter escape.
Konversi tipe data — V6.0 tidak lagi melakukan konversi implisit tipe numerik ke TEXT. Tulis ulang kueri SQL yang terdampak.
Log error tabel eksternal — Klausul
INTO error_tabletelah dihapus. Beralihlah ke fungsi bawaan.Tipe data — Lima tipe data tidak dapat lagi digunakan sebagai kunci distribusi.
Kata kunci — Beberapa kata kunci telah mengalami perubahan kategori. Periksa potensi konflik dengan nama objek.
Tabel sistem — Enam kolom pada tabel sistem telah diubah namanya atau dihapus. Perbarui kode yang mereferensikannya.
[ ] Parameter fungsi bawaan —
int4_avg_accumdanstring_aggmengalami perubahan signature.
Query optimizers
| Item | V4.3 | V6.0 |
|---|---|---|
| Pengoptimal kueri default | Legacy | ORCA |
Kedua versi mendukung pengoptimal kueri Legacy dan ORCA. Pengoptimal default berubah dari Legacy ke ORCA mulai V6.0. Untuk informasi selengkapnya tentang pemilihan pengoptimal, lihat Choose a query optimizer.
Tindakan: Uji beban kerja Anda dengan pengoptimal ORCA sebelum melakukan upgrade. Jika mengalami masalah, kembalikan ke Legacy pada tingkat sesi.
Karakter escape
Di V6.0, backslash (\) dalam string diperlakukan sebagai karakter literal, bukan sebagai karakter escape (standard_conforming_strings = on secara default).
Untuk mengaktifkan kembali escaping backslash pada tingkat sesi:
SET standard_conforming_strings = off;Pengaturan ini hanya berlaku untuk sesi saat ini. Untuk mengonfigurasinya di tingkat instans, ajukan tiket untuk meminta dukungan.
Tindakan: Audit kode SQL Anda untuk mengidentifikasi urutan escape backslash dan perbarui agar menggunakan escape standar SQL (misalnya, '' untuk tanda kutip tunggal literal).
Konversi tipe data
Versi 6.0 menghapus dua konversi implisit yang didukung oleh Versi 4.3:
1. String YYYYMMDDHH24MISS tidak lagi dikonversi otomatis ke tipe timestamp.
Gunakan fungsi to_timestamp atau to_char secara eksplisit:
-- Mengonversi string YYYYMMDDHH24MISS menjadi timestamp
SELECT to_timestamp('20240101123045', 'YYYYMMDDHH24MISS');2. Tipe numerik tidak lagi dikonversi implisit ke TEXT.
Tambahkan fungsi pembungkus (wrapper functions) untuk memulihkan kompatibilitas pada pernyataan SQL yang terdampak:
CREATE OR REPLACE FUNCTION substr(numeric, integer, integer) RETURNS text AS $$
SELECT substr($1::text, $2, $3);
$$ LANGUAGE sql IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION pg_catalog.btrim(str numeric) RETURNS text AS $$
RETURN $_[0];
$$ LANGUAGE plperl IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION to_date(timestamp, text) RETURNS date AS $$
SELECT to_date($1::text, $2);
$$ LANGUAGE sql IMMUTABLE STRICT;
CREATE OR REPLACE FUNCTION to_date(integer, text) RETURNS date AS $$
SELECT to_date($1::text, $2);
$$ LANGUAGE sql IMMUTABLE STRICT;Tindakan: Identifikasi pernyataan SQL dan fungsi yang bergantung pada konversi implisit dari tipe numerik ke TEXT. Tambahkan fungsi pembungkus tersebut atau tulis ulang kueri SQL agar menggunakan cast eksplisit (value::text).
Log error tabel eksternal
Klausul INTO error_table telah dihapus dari pernyataan CREATE EXTERNAL TABLE dan COPY mulai versi V6.0.
Sebagai gantinya, gunakan fungsi bawaan berikut:
-- Membaca log error untuk tabel eksternal
SELECT * FROM gp_read_error_log('<external_table_name>');
-- Mengosongkan log error untuk tabel eksternal
SELECT gp_truncate_error_log('<external_table_name>');Tindakan: Hapus INTO error_table dari semua pernyataan CREATE EXTERNAL TABLE dan COPY. Perbarui logika penanganan error untuk menggunakan gp_read_error_log dan gp_truncate_error_log.
Tipe data
Dua perubahan pada tingkat penyimpanan memengaruhi ruang disk setelah upgrade:
Format penyimpanan NUMERIC berubah, yang memengaruhi ruang disk untuk kolom bertipe tersebut.
Tipe data MONEY berubah dari 32-bit menjadi 64-bit, yang juga memengaruhi ruang disk.
Selain itu, tipe data berikut tidak dapat lagi digunakan sebagai kunci distribusi di V6.0:
abstimereltimetintervalmoneyanyarray
Tindakan: Jika ada tabel yang menggunakan salah satu tipe ini sebagai kunci distribusinya, definisikan ulang kunci distribusi tersebut sebelum upgrade. Untuk kolom NUMERIC dan MONEY, pertimbangkan peningkatan kebutuhan ruang disk setelah upgrade.
Kata kunci
V6.0 mengubah kategori beberapa kata kunci. Nama objek (tabel, view, fungsi, indeks, kolom, tipe) yang sesuai dengan kata kunci yang kini dicadangkan akan menyebabkan error.
Untuk melihat semua kata kunci beserta kategorinya pada instans Anda saat ini:
SELECT * FROM pg_get_keywords();Kode kategori kata kunci
| Kode | Kategori | Boleh digunakan sebagai nama objek |
|---|---|---|
| U | Unreserved | Semua objek |
| C | Unreserved (tidak boleh sebagai nama fungsi atau tipe) | Semua objek kecuali fungsi dan tipe |
| T | Reserved (boleh sebagai nama fungsi atau tipe) | Hanya fungsi dan tipe |
| R | Reserved | Tidak diperbolehkan |
Perubahan kategori dari V4.3 ke V6.0
| Kata kunci | V4.3 | V6.0 |
|---|---|---|
| between | R | C |
| collation | None | T |
| concurrently | U | T |
| convert | C | None |
| filter | R | U |
| lateral | N/A | R |
| new | R | None |
| off | R | U |
| old | R | None |
| percentile_cont | C | None |
| percentile_disc | C | None |
| range | R | U |
| reindex | U | R |
| rows | R | U |
| sort | R | T |
| variadic | None | R |
Tindakan: Periksa apakah terdapat objek database yang dinamai menggunakan kata kunci yang menjadi reserved di V6.0 (collation, concurrently, lateral, reindex, variadic). Jalankan kueri berikut untuk mengidentifikasi objek yang berisiko:
-- Menemukan tabel dan kolom yang namanya bentrok dengan kata kunci yang kini dicadangkan
SELECT n.nspname AS schema, c.relname AS table_name, a.attname AS column_name
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid
WHERE c.relkind IN ('r', 'v', 'm')
AND NOT a.attisdropped
AND a.attname IN ('collation', 'concurrently', 'lateral', 'reindex', 'variadic')
ORDER BY schema, table_name, column_name;Ubah nama objek yang bentrok atau gunakan tanda kutip dalam pernyataan SQL sebelum melakukan upgrade.
Tabel sistem
V6.0 mengganti nama dan menghapus beberapa kolom pada tabel sistem. Perbarui kode aplikasi atau kueri apa pun yang mereferensikan hal-hal berikut:
| V4.3 | V6.0 | Perubahan |
|---|---|---|
pg_class.reltoastidxid | — | Dihapus |
pg_stat_activity.procpid | pg_stat_activity.pid | Kolom diganti nama |
pg_stat_activity.current_query | pg_stat_activity.state, pg_stat_activity.query | Dipecah menjadi dua kolom: state untuk status backend, query untuk pernyataan yang sedang dieksekusi |
gp_distribution_policy.attrnums | gp_distribution_policy.distkey | Kolom diganti nama; tipe data berubah menjadi int2vector |
sesion_level_memory_consumption.__gp_localid, sesion_level_memory_consumption.__gp_masterid | — | Dihapus |
pg_filespace, pg_filespace_entry | — | Dihapus |
Tindakan: Cari di kodebase Anda referensi ke nama kolom V4.3 pada kolom kiri dan perbarui ke padanan V6.0-nya.
Parameter fungsi bawaan
Dua fungsi bawaan mengalami perubahan tanda tangan (signature) di V6.0:
| V4.3 | V6.0 | Perubahan |
|---|---|---|
int4_avg_accum(bytea, integer) | int4_avg_accum(bigint[], integer) | Tipe parameter pertama berubah dari bytea ke bigint[] |
string_agg(expression) | string_agg(expression, delimiter) | delimiter kini wajib disertakan |
Tindakan: Perbarui semua pemanggilan string_agg agar menyertakan argumen delimiter. Jika int4_avg_accum dirujuk dalam agregat kustom, perbarui tanda tangan fungsinya sesuai.
Kemampuan baru di V6.0
V6.0 menambahkan kemampuan berikut yang tidak tersedia di V4.3:
| Fitur | V4.3 | V6.0 |
|---|---|---|
LEFT() function | Tidak didukung | Didukung |
| Operasi UPDATE pada kolom kunci distribusi | Tidak didukung | Didukung |
Langkah pasca-upgrade
Setelah upgrade, jalankan ANALYZE pada semua database untuk memperbarui statistik. Pengoptimal kueri bergantung pada statistik terkini, yang tidak ikut dipertahankan selama upgrade versi utama.
ANALYZE VERBOSE;Untuk bantuan terkait proses upgrade, lihat panduan upgrade AnalyticDB for PostgreSQL atau ajukan tiket untuk dukungan teknis.