Bagaimana cara menyimpan 'n' hari log server web di Sql Server?


18

Untuk pelaporan dan analisis kinerja yang lebih cepat, kami ingin memasukkan log server web kami ke dalam Sql Server. Ini akan memungkinkan kita untuk melihat pola lalu lintas, masalah, pelambatan dalam waktu dekat.

Kami memiliki daemon yang mendengarkan acara permintaan / respons dari penyeimbang beban dan sisipan massal kami ke dalam database.

Namun, kami mendapatkan sekitar 1 GB log per hari dan kami hanya perlu menyimpan sekitar satu minggu (setidaknya dalam bentuk mentah ini).

Apa cara terbaik untuk menyimpan data ini dan cara terbaik untuk menghapus entri lama?

Kami sudah bicara tentang menyimpan data setiap hari di tabelnya sendiri, mis. Log_2011_04_07Akan memiliki semua entri untuk hari itu, dan kemudian menjatuhkan tabel terlama. Tampilan dapat dibuat untuk menjangkau semua tabel hari agar mudah di-query. Apakah layak?


Ini adalah pertanyaan yang sangat mirip tetapi untuk Oracle; sintaks akan berbeda tetapi ini adalah aplikasi klasik dari partisi berdasarkan tanggal. Tidak perlu menemukan kembali roda :-)
Gayus

Jawaban:


17

Anda harus melihat ke partisi.

http://technet.microsoft.com/en-us/library/dd578580%28SQL.100%29.aspx

Yang keren tentang pemartisian adalah Anda hanya memiliki satu nama tabel (sebagai lawan dari pendekatan beberapa tabel) sehingga pernyataan penyisipan Anda tetap statis. Ini berfungsi dengan setiap aplikasi - ini sepenuhnya transparan untuk kueri. Anda tidak perlu khawatir tentang apa yang terjadi jika Anda berakhir dengan indeks atau statistik yang berbeda pada masing-masing tabel.

Anda membuat fungsi partisi yang memutuskan bagaimana memecah tabel menjadi beberapa tabel di belakang layar. Fungsi hanya dapat mengambil satu parameter input / bidang, dan dalam kasus Anda, itu akan menjadi bidang tanggal. Fungsi ini dapat membagi tabel berdasarkan tanggal, minggu, bulan, atau tahun - dalam kasus Anda, Anda ingin tanggal, periode 24 jam.

Kemudian membangun pekerjaan Agen SQL Server yang menggunakan T-SQL untuk menukar partisi terakhir setiap hari. Penghapusan menjadi operasi metadata, dan sangat cepat. Tukar partisi, lalu jatuhkan yang lama.


Saya akan melihat ke dalamnya - apakah ini memungkinkan untuk menjatuhkan partisi individu, sehingga penghapusan bisa berjalan dengan cepat?
Jarrod Dixon

3
Ya, Anda harus secara khusus melihat konsep "Partisi jendela geser otomatis". Serangkaian artikel bagus yang bisa Anda temukan di SQLServerCentral: part1 , part2 dan part3 .
Marian

7

Kami mengembangkan produk pencatatan statistik web 6 tahun lalu yang memungkinkan kami melacak setiap klik kunjungan pengguna.

Apa yang kami lakukan adalah membuat catatan setiap kunjungan saat Anda menulis dan daemon terjadwal mem-parsing log dan menormalkan data untuk pencarian lebih lanjut nanti. Segera setelah data / catatan diuraikan, itu dihapus untuk menjaga struktur data rendah.

Untuk versi produk kami selanjutnya, kami akan mendistribusikan pengumpul massal secara terpisah di situs web dan kemudian menggunakan daemon untuk mengumpulkan data dan membersihkannya setelah itu dengan mengeluarkan perintah ke layanan massal.

Dengan cara ini kita dapat menangani "pemeliharaan terjadwal" tanpa kehilangan data.

Mengenai masalah pembersihan di server pusat, rencana kami saat ini adalah menambahkan "cap waktu" untuk dapat mengarsipkan data setelah mis. 3 bulan.

Kami telah memikirkan ini seperti tekstur MIP-MAP dalam game / rendering 3D. Semakin dekat Anda, semakin banyak data terperinci, semakin jauh, semakin "dikelompokkan" dan kurang terperinci.

Jadi dari hari ke hari, kita dapat mengamati pola pengunjung, tetapi setelah 3 bulan data tersebut tidak benar-benar relevan dan kami mengompres data menjadi kurang detail.

Kami belum memutuskan apakah kami akan memecah database menjadi potongan-potongan untuk menjaga "detail level" tetap terpisah. basis data. Tapi kami mungkin saja, karena ada beberapa masalah penamaan jika kami menyimpan level yang berbeda dalam database yang sama.

Semoga Anda bisa menggunakan ini untuk sesuatu? Saya tidak dapat memberi Anda kode contoh sebagai bagian dari produk perusahaan kami.


1

Buat tabel lain Daily_tables dengan dua kolom: Table_name dan Date_table_created. Dalam kode Anda yang membuat tabel harian baru (yang memuat log web), tambahkan entri lain untuk mengisi tabel Daily_tables dengan nama tabel yang dibuat, dan timestamp (waktu tanggal saat ini). Buat pekerjaan agen SQL yang akan menjalankan skrip TSQL setiap minggu. TSQL akan menghapus semua nama tabel (Table_name) dari Daily_tables dengan timestamp Date_table_created yang lebih lama dari 7 hari.

Semoga ini yang kamu cari :)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.