Pengantar
File data adalah objek fisik yang merupakan bagian terpenting dari sistem basis data karena berisi data aktual. Anda dapat menganggap database sebagai kumpulan file data. Sebuah instance memberi Anda sarana untuk memasang dan mengakses file tersebut.
Di sini, mengelola file data adalah memahami cara memantau dan mengubah ukuran file data yang ada dan cara menambah atau menghapus file data dari database.
Kode T-SQL untuk operasi ini ada dalam dokumentasi Microsoft. Namun, dalam artikel ini, kami ingin membahas taktik seputar pengelolaan file ini bagi kami yang masih menjalankan penginstalan SQL Server di tempat.
Jenis File Data dan Kemungkinan Masalah
Untuk setiap database baru yang dibuat di SQL Server, kita harus memiliki setidaknya dua file yang dibuat – file data primer dan file log.
- File data utama memiliki ekstensi .MDF.
- File log memiliki ekstensi .LDF.
- Saat kami menambahkan file data ke database SQL Server, kami biasanya menggunakan ekstensi .NDF.
Catatan :Dimungkinkan untuk membuat file data di SQL Server tanpa ekstensi apa pun, tetapi itu bukan praktik terbaik. Penggunaan .mdf, .ndf, dan .ldf berfungsi untuk membedakan file-file ini ketika kita melihatnya di level sistem operasi.
Jelas, file data dibuat saat Anda membuat database. Anda dapat melakukannya dengan CREATE DATABASE memerintah. Meskipun kelihatannya sangat mudah, Anda harus mewaspadai kemungkinan masalah.
Bergantung pada seberapa besar database dan file data terkait pada akhirnya, Anda mungkin menghadapi masalah fragmentasi dan masalah lain dengan waktu pencadangan dan pemindahan data Anda. Ini terjadi karena ukuran file data tidak benar.
Perhatikan ilustrasi di bawah ini. Ini menunjukkan hasil mengeksekusi CREATE DATABASE dan memberikan nama database (MyDB).
Listing 1 menunjukkan detail database yang dibuat:
-- Listing 1: Create Database Script
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Anda mungkin bertanya-tanya dari mana SQL Server mendapatkan semua opsi itu, karena yang kami lakukan hanyalah menerbitkan CREATE DATABASE MyDB.
SQL Server menggunakan pengaturan database model sebagai nilai default untuk database baru yang dibuat pada instans tersebut. Dalam hal ini kita melihat ukuran file awal 100MB. Pertumbuhan otomatis masing-masing adalah 12MB dan 64MB untuk data dan file log.
Masalah Berikutnya
Implikasi dari pengaturan yang disorot pada Gambar 1 adalah:
- File data primer dimulai dari ukuran 100MB. Ini adalah ukuran kecil. Oleh karena itu, bergantung pada tingkat aktivitas dalam database, hal itu perlu segera berkembang.
- Setiap kali ada kebutuhan untuk tumbuh otomatis datafile, SQL server perlu memperoleh 128MB dari ruang yang tersedia di sistem operasi. Sekali lagi, ini kecil, menyiratkan bahwa database akan tumbuh sering . Pertumbuhan basis data adalah operasi mahal yang dapat memengaruhi kinerja jika terlalu sering terjadi. Selain itu, pertumbuhan basis data yang sering dapat menyebabkan fenomena yang disebut fragmentasi yang, pada gilirannya, dapat menyebabkan penurunan kinerja yang parah pada basis data. Ekstrem lain dari menyetel peningkatan ke nilai tinggi dapat mengakibatkan operasi pertumbuhan membutuhkan waktu lama untuk diselesaikan, tergantung pada kinerja sistem penyimpanan yang mendasarinya.
- File database dapat berkembang tanpa batas. Artinya, dengan waktu yang cukup, file-file ini dapat menghabiskan semua ruang pada volume tempat mereka duduk. Untuk memindahkannya, Anda memerlukan volume ukuran mereka atau lebih. Opsi lainnya adalah menambahkan penyimpanan ke volume saat file-file ini disimpan.
Ini adalah masalah utama yang terkait dengan bergantung pada nilai default untuk membuat database.
Pra-alokasi
Mengingat dampak kinerja pertumbuhan, akan lebih masuk akal untuk mengukur database dengan benar di awal proyek. Dengan cara ini, kami mengakomodasi kebutuhan solusi di masa mendatang.
Asumsikan bahwa kita tahu database kita pada akhirnya akan menjadi berukuran 1GB. Kami mungkin mengalokasikan penyimpanan 1GB saat proyek dimulai. Kemudian, database tidak perlu berkembang. Ini menghilangkan masalah fragmentasi yang disebabkan oleh pertumbuhan database.
Daftar 2 menunjukkan skrip yang berlaku untuk pra-alokasi:
-- Listing 2: Create Database Script with Pre-allocation
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 1024MB , MAXSIZE = 2048MB, FILEGROWTH = 512MB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Kami menyebutkan ruang 1GB untuk tujuan demonstrasi. Biasanya, database produksi mungkin memerlukan 1TB. Intinya adalah:mengalokasikan ruang yang diperlukan di awal. Kemudian Anda menghilangkan atau secara signifikan mengurangi kebutuhan akan pertumbuhan.
Sekarang, kita harus bertanya pada diri sendiri apakah kita benar-benar menginginkan satu file 1TB duduk di volume kita. Akan lebih bijaksana untuk memecahnya menjadi potongan-potongan kecil. Ketika operasi paralel, seperti pencadangan, terjadi, setiap file akan ditangani oleh satu utas CPU untuk sistem multiprosesor. Dengan satu file, itu tidak akan berjalan lancar.
Sekali lagi, kami memodifikasi skrip kami untuk mengakomodasi persyaratan ini di Listing 3:
-- Listing 3: Create Database Script with Pre-allocation and
USE [master]
GO
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.mdf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB )
( NAME = N'MyDB03', FILENAME = N'C:\MSSQL\Data\MyDB03.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB04', FILENAME = N'C:\MSSQL\Data\MyDB04.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB05', FILENAME = N'C:\MSSQL\Data\MyDB05.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Informasi Tambahan
Kami juga harus menyebutkan bahwa tidak ada gunanya menggunakan pendekatan ini untuk file log. Masalahnya, SQL Server selalu menulis ke file log secara berurutan. Selain itu, kami telah menggunakan ekstensi .ndf untuk file baru yang kami tambahkan.
Klausa MAXSIZE memastikan bahwa file data kami tidak akan bertambah tanpa batas. Kami telah memberikan setiap file nama logis dan fisik yang berbeda – klausa NAME menentukan nama logis dari file, dan klausa FILENAME menentukan nama fisik.
Membuat database dengan file data yang lebih besar akan memakan waktu lebih lama daripada yang lain. Mungkin saya lebih masuk akal untuk membuat database kecil terlebih dahulu, lalu memanipulasinya dengan perintah yang sesuai untuk mengubah ukuran dan menambahkan file, sampai kita membuat struktur database yang ideal.
Dengan membuat database dengan opsi eksplisit, kami telah mengatasi tiga masalah yang diangkat sebelumnya dalam artikel ini. Gambar 2 menunjukkan hasil dari pendekatan ini:
Sekarang kami memiliki database yang dikonfigurasi dengan benar untuk mengakomodasi pertumbuhan data untuk waktu yang lama tanpa perlu pertumbuhan file data. Ini menghilangkan risiko fragmentasi dan membantu memastikan pengelolaan file data yang lebih baik.
Mengelola File Data
Alih-alih membuat empat atau lima file data dalam pernyataan CREATE DATABASE, kita dapat menggunakan klausa MODIFY dan ADD dari pernyataan T-SQL ALTER DATABASE.
Sekali lagi, kita mulai dengan pernyataan yang ditunjukkan pada Listing 4 di bawah ini. Ini membuat database tunggal dengan file data 100MB dan file log yang menyertainya. Tujuan kami adalah memastikan pra-alokasi dengan memperluas file ini dan kemudian menambahkan lebih banyak file.
-- Listing 4: Create Database Script
USE [master]
GO
IF EXISTS (SELECT * FROM sys.databases WHERE name='MyDB')
DROP DATABASE MyDB;
/****** Object: Database [MyDB] Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
LOG ON
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
Memperluas File Data
Pernyataan T-SQL yang memperluas file data ditunjukkan pada Listing 5. Ini menentukan nama database, nama file, dan ukuran awal dan kenaikan yang diinginkan. Dalam hal ini, kami mengatur SQL Server untuk mengalokasikan 1GB saat mulai dan kemudian mengalokasikan 512MB untuk semua pertumbuhan otomatis berikutnya.
-- Listing 5: Extend the Primary Datafile
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , FILEGROWTH = 524288KB )
GO
Listing 6 menunjukkan seperti apa tampilan kode jika kita menentukan MAXSIZE 2GB:
-- Listing 6: Extend the Primary Datafile with Maximum Size
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB )
GO
Jika kita menyetel klausa FILEGROWTH ke 0, kita menyetel SQL Server TIDAK untuk menumbuhkan file data secara otomatis . Dalam hal ini, kita perlu mengeluarkan perintah secara eksplisit untuk menumbuhkan file data atau menambahkan file lain.
Menambahkan File Data
Listing 7 menunjukkan kode yang kita gunakan untuk menambahkan file data baru ke database. Perhatikan bahwa kita harus menentukan lagi nama file logis dan nama file fisik yang menyertakan path lengkap.
Juga, kita dapat menempatkan file fisik pada volume yang berbeda. Untuk itu, kita hanya perlu mengubah jalurnya.
-- Listing 7: Add Data Files to the Primary Filegroup
USE [master]
GO
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.ndf' , SIZE = 1048576KB , FILEGROWTH = 524288KB ) TO FILEGROUP [PRIMARY]
GO
Memperluas dan menambahkan file data juga berlaku untuk skenario di mana kita memilih untuk menonaktifkan pertumbuhan otomatis untuk database kita (Lihat Gambar 4).
Kemudian kita perlu memperluas database secara manual menggunakan kode di atas dari Listing 5 atau 6, atau menambahkan file seperti pada Listing 7.
Menggunakan Filegroups
Filegroups memungkinkan kita mengelola koleksi file data bersama-sama. Kami secara logis dapat mengelompokkan beberapa file data yang disimpan pada disk yang berbeda atau volume yang berbeda ke dalam satu grup file. Filegroup itu membuat lapisan abstraksi antara tabel dan indeks, dan file fisik sebenarnya yang menyimpan data.
Oleh karena itu, jika kita membuat tabel di grup file, data dalam tabel ini tersebar di semua file data yang ditetapkan ke grup file.
Sampai saat ini, kita hanya berurusan dengan filegroup PRIMARY. Listing 8 menunjukkan bagaimana kita dapat menambahkan file baru MyDB02 ke grup file, selain grup file utama.
Pernyataan pertama setelah mengatur konteks basis data ke master membuat grup file baru FG01. Pernyataan berikutnya kemudian menambahkan file ke grup file baru ini dengan opsi serupa dengan yang digunakan di Listing 7.
-- Listing 8: Add Data Files to the Primary Filegroup
USE [master]
GO
ALTER DATABASE [MyDB] ADD FILEGROUP [FG01]
GO
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 102400KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB ) TO FILEGROUP [FG01]
GO
Menjatuhkan File Data
Gambar 5 menunjukkan hasil dari operasi yang telah kami lakukan sejauh ini. Kami memiliki tiga file data. Dua di antaranya ada di grup file PRIMARY, dan yang ketiga ada di grup file FG01.
Mari kita asumsikan kita telah melakukan sesuatu yang salah, misalnya, mengatur ukuran file yang salah. Kemudian, kita dapat membuang filegroup menggunakan kode berikut di Listing 9:
-- Listing 9: Drop Data Files
USE [MyDB]
GO
ALTER DATABASE [MyDB] REMOVE FILE [MyDB02]
GO
Kesimpulan
Artikel ini mengeksplorasi jenis file database, kemungkinan komplikasi yang disebabkan oleh pertumbuhan file data, dan cara menyelesaikan masalah. Juga, kami memeriksa kode T-SQL untuk memperluas file data dan menambahkan file data baru ke database. Kami juga menyentuh penggunaan filegroups.
Tujuan kami adalah untuk memastikan bahwa ketika kami menerapkan basis data, kami menyiapkan basis data untuk menyimpan semua data yang diperlukan untuk aplikasi tertentu.
Referensi
- File Database dan Filegroups