Cách giảm dung lượng Log file của SQL Server

SQL Server

Nếu bạn đang sử dụng một web-hosting và dùng SQL Server làm cơ sở dữ liệu, bạn sẽ gặp vấn đề về dung lượng khi sử dụng một thời gian dài. SQL Server sẽ ghi file LOG với dung lượng rất lớn, nếu bạn không biết điều này thì dù bạn có nâng dung lượng web-hosting lên bao nhiêu đi nữa cũng không thể ngăn tình trạng này về sau.

Dữ liệu SQL Server có thể chỉ vài chục hoặc vài trăm MB nhưng file LOG có thể lên đến hàng chục GB, nó sẽ lưu bất kỳ transaction nào vào LOG kể cả khi đã commit.

Có nhiều cách để giải quyết vấn đề này:

- Detach DB => Xóa file LOG => Sau đó Attach lại DB: Tuy nhiên CSDL đòi hỏi tính sẵn sàng cao thì cách này không khả thi khi buộc phải dừng lại mọi hoạt động đến DB.

- Backup LOG với OpTION là TRUNCATE_ONLY hoặc NO_LOG: Với phiên bản SQL Server 2008 thì đã bỏ Option này.

- Cách tối ưu nhất:

Gả sử DB của bạn là AGT gồm 2 file:

+ File Data: AGT_Data.MDF

+ File Log: AGT_Log.LDF

Bạn chỉ cần chạy câu truy vấn sau:

USE AGT;
GO 
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AGT
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 Mb.
DBCC SHRINKFILE (AGT_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AGT
SET RECOVERY FULL;
GO

Giải thích câu truy vấn:

- Có 3 chế độ Recovery trong SQL Server: FULL, BULK LOGGED và SIMPLE. Chế độ mặc định là FULL. Bạn có thể click chuột phải vào Database rồi chọn Properties, sau đó vào phần Option của database, xem trong Recovery Model. Khi ở chế độ FULL thì bất kì một transaction nào, kể cả khi đã commit cũng đều được lưu trong LOG, do đó có thể dựa vào những Transaction này để “quay lui (rollback)” DB về bất kì thời điểm nào. Vì thế với những DB có Transaction nhiều, DATA ít thì file LOG vẫn có thể rất lớn.

ALTER DATABASE AGT
SET RECOVERY SIMPLE;

- Câu truy vấn đầu tiên: SET RECOVERY của DB về SIMPLE, ở chế độ này sau khi Transaction được COMMIT, sẽ tự động xóa. Do vậy File LOG của database ở chế độ này thường rất nhỏ.

DBCC SHRINKFILE (AGT_Log, 1);

- Câu truy vấn thứ 2: Dùng DBCC SHRINKFILE để SHRINK file log xuống còn 1 Mb. Nếu không set Recovery về SIMPLE, thì sẽ không thể xóa bỏ hết các Transaction đã được COMMIT. SHRINKFILE chỉ thu dọn và sắp xếp và phân bố lại dữ liệu, bỏ các vùng trống để giải phóng bộ nhớ, chứ không phải xóa dữ liệu. Vì thế ở chế độ FULL, SHRINKFILE hầu như không tác dụng, hoặc nếu có thì file LOG dung lượng giảm đi không đáng kể.

ALTER DATABASE AGT
SET RECOVERY FULL;

- Câu truy vấn cuối: SET RECOVERY về lại FULL. Trên MSDN cũng khuyên nếu muốn Backup LOG, các bạn nên chuyển về chế độ SIMPLE, hơn là backup LOG với Truncate_OnlyNo_LOG.

Chú ý: Đối với những DB có dung lượng lớn bạn nên backup database trước và hỏi ý kiến bên nhà cung cấp web-hosting trước khi thực hiện vì LOG file rất cần thiết để khôi phục dữ liệu khi gặp vấn đề.

ReportViewer - object datasource, nested objects return #Error

Nếu bạn đang sử dụng Visual Studio 2012 và Trình xem báo cáo, bạn có thể đã gặp sự cố với việc sử dụng Thuộc tính lồng nhau trên báo cáo với các trường trả về lỗi #Error.

Cách khắc phục:
Bạn phải đảm bảo tất cả các lớp được tham chiếu trong báo cáo đều có thuộc tính [Serializable] cho MỌI thuộc tính, và phải được khai báo các lớp dạng Public.

để sử dụng các thuộc tính lồng vào nhau trên báo cáo,  cần điền vào biểu thức sao:
=Fields!SanPham.Value.DonViTinh.Ten

Biểu thức này thêm một trường vào báo cáo là ba thuộc tính nằm sâu trong đối tượng mà báo cáo ràng buộc.

Nguồn dữ liệu báo cáo liên kết với lớp Sản Phẩm, lớp Sản Phẩm chứa thuộc tính Đơn Vị Tính, lớp Đơn Vị Tính có chứa thuộc tính Tên.

Các lớp Sản Phẩm, Đơn Vị Tính, Tên phải được sắp xếp theo thứ tự và phải có thuộc tính [Serializable].
Vd: lớp Sản Phẩm

Lớp Đơn Vị Tính

Và kết quả sẽ được :

Ứng dụng phần mềm android tra cứu cây thuốc An Giang

Hiện nay, có rất nhiều cây thuốc (dược liệu) quý hiếm với những công dụng điều trị bệnh, giúp bổ sung dưỡng chất tăng cường sức khỏe. Việc tìm những cây thuốc trên rừng sẽ rất khó khăn khi không biết được hình dáng và đặc tính của loại cây đó.

Nhằm mục đích nắm rõ những thông tin của các cây dược liệu quý khi tìm kiếm trên rừng. Chi cục Kiểm Lâm An Giang đã đầu tư dự án xây dựng "Phần mềm Tra cứu cây thuốc An Giang" cung cấp thông tin đa phương thức về cây thuốc Việt, cho phép duyệt cây thuốc theo nhóm công dụng. Với mỗi cây thuốc, hệ thống cung cấp các thông tin chi tiết: tên cây thuốc, tên khoa học, thông tin giới thiệu, mô tả, thông tin về phân bố, thu hoạch, chế biến, thành phần hóa học, tác dụng, công dụng, liều dùng và các đơn thuốc có sử dụng cây thuốc đó.

Phần mềm Tra cứu cây thuốc An Giang được đồng bộ hóa với thông tin các cây thuốc trên website https://kiemlamangiang.gov.vn, bạn sẽ dễ dàng tìm kiếm các cây thuốc quý trên rừng với điện thoại thông minh được cài đặt ứng dụng này.

Cách cài đặt trên CH PLAY:

Tìm kiếm ứng dụng trên CH PLAYCài đặt ứng dụng tra cứu cây thuốc an giang trên CH PLAY

 

Phần mềm tra cứu cây thuốc An GiangPhần mềm tra cứu cây thuốc An Giang V1.0

Phần mềm tra cứu cây thuốc An Giang sử dụng trên điện thoại di động thông minh với hệ điều hành Android.

Phần mềm trập trung vào chức năng tra cứu cây thuốc An Giang theo bốn tiêu chí:

- Tìm theo tên VN và tên khoa học

- Tìm theo công dụng

- Tìm theo hình đại diện

- Tìm theo hình vị trí.

Mọi chi tiết xin liên hệ:

Bành Thanh Hùng - 0919.819.072

Chi cục Kiểm lâm An Giang

10/1 Châu Văn Liêm, Mỹ Bình, TP Long Xuyên, An Giang

Đặc biệt: Phần mềm có thể chạy trên 2 cơ chế online và offline

Mời các bạn download trong file đính kèm Phần mềm Tra cứu Android

 

 

=========================================================

HƯỚNG DẪN SỬ DỤNG PHẦN MỀM TRA CỨU

Phần 1: Tìm theo tên việt nam và tên khoa học 

Bước 1: Chọn vào mục menu "Tìm kiếm tên cây thuốc".

 

Chọn tìm kiếm tên cây thuốcGiao diện tìm kiếm tên cây thuốc

 

Bước 2: Để xem thông tin chi tiết của cây thuốc hãy chạm tay vào tên cây thuốc cần xem.

Chọn xem chi tiết cây thuốcXem chi tiết cây thuốc

 

Phần 2: Tìm theo hình ảnh

Bước 1: Chọn vào mục menu "Tìm theo hình ảnh".

Chọn tìm theo hình ảnhGiao diện tìm theo hình ảnh

 

Bước 2: Chọn vào "Xem chi tiết" để xem các thông tin khác của cây thuốc.

Chọn xem chi tiết cây thuốc theo hình ảnhChọn xem chi tiết nội dung cây thuốc

 

Phần 3: Tìm theo công dụng

Bước 1: Chọn vào mục menu "Tìm theo công dụng".

Chọn tìm theo công dụngGiao diện tìm kiếm theo công dụng

Bước 2: Chọn vào tên công dụng cần tìm. Danh sách các cây thuốc có công dụng được chọn sẽ hiện thị như mục tìm kiếm theo tên để người dùng chọn.

 

Phần 4: Tìm theo vị trí

Bước 1: Chọn vào mục menu "Tìm theo vị trí".

Tìm kiếm theo vị tríGiao diện tìm cây thuốc theo vị trí

 

Bước 2: Chọn vào cây thuốc cần xem chi tiết. Tiếp tục chọn nút "Xem chi tiết" sẽ hiển thị các thống tin khác của cây thuốc.

Chọn xem cây thuốc trong tìm theo vị tríxem thông tin cây thuốc theo vị trí

 

Phần 5:  Hướng dẫn cập nhật CSDL từ Internet (online) về thẻ nhớ (Sdcard)

- Phần mềm tra cứu cây thuốc của chúng có thể sử dụng từ CSDL Internet hoặc CSDL từ thẻ nhớ.

- Để sử dụng CSDL từ thẻ nhớ 

Bước 1: Tại giao diện menu ta chọn "Cập nhật dữ liệu". Hệ thống sẽ tự động cập nhật CSDL. Đến khi hoàn tất, lúc này phần mềm có thể chạy trên 2 cơ chế online và offline.

Chọn cập nhật dữ liệu

 

Bước 2: Để cấu hình kết nối CSDL. Chọn vào "Cấu hình kết nối".

+ Nếu muốn sử dụng CSDL trên mạng. Chọn vào mục wifi

+ Nếu không muốn sử dụng CSDL từ thẻ nhớ. Chọn vào mục no wifi

Chọn cấu hình kết nốiCài đặt hệ thống

 

Phần 6: Hướng dẫn nâng cấp hoặc cập nhật phiên bản mới

- Trong quá trình sử dụng. Nếu phần mềm có sự thay đổi mới về mặt cấu trúc, giao diện, csdl, lỗi người dùng. Thì chương trình sẽ tự động download phiên bản ứng dụng mới hoặc bạn có thể vào mục số (Cập nhật phiên bản mới) để tải phiên bản được nâng cấp vào máy và trải nghiệm.

Phần 7: Hỗ trợ cài đặt ứng dụng tra cứu cây dược liệu bằng phần  điều khiển từ xa

- Trong quá  trình sử dụng, tải và cài đặt, nếu quý khách gặp trục trặc hoặc xảy ra sự cố lỗi phần mềm. có thể liên hệ với chúng tôi qua 2 cách

Cách 1: Gửi qua email. hotrokythuat.agitech@gmail.com hoặc hltnhan@gmail.com

   ==> Tiêu đề Email: Lỗi "Tra cứu cây thuốc an giang"

   ==> Nội dung email: Chụp lại phần lỗi & ghi mô tả sơ lược khi thực hiện thao tác bị lỗi

+ Cách 2: Vào chợ CHPLAY và cài đặt phần mềm Teamview Quicksupport ( Chú ý: Đọc ID của bạn cho chúng tôi để hỗ trợ trực tuyến)

 

(Rất mong sự đóng góp của quý khách về phần mềm tra cứu cây dược liệu cũng như  cách sử dụng, giao diện, báo sự cố lỗi để chúng tôi hoàn thiện ứng dụng tốt hơn)

Nguồn: Chi cục Kiểm lâm An Giang

Code php dùng để backup database mysql không lỗi tiếng việt

Backup Database Mysql

Việc Backup dữ liệu thường xuyên sẽ đảm bảo về vấn đề website bị mất dữ liệu khi bị hacker tấn công.

Trung bình mỗi tuần hoặc mỗi tháng các nhà quản trị website sẽ Backup dữ liệu trang web về máy. Việc Backup dữ liệu Mysql sẽ rất tốn thời gian vì phải trải qua giai đoạn như:

+ Đăng nhập vào hosting website.

+ Vào hệ thống quản trị cơ sở dữ liệu Mysql (Mysql database).

+ Chọn cơ sở dữ liệu (database) cần Backup.

+ Export dữ liệu về máy.

Dưới đây, là đoạn code php giúp bạn Backup dữ liệu về máy mà không cần phải qua các thao tác trên. Dữ liệu được backup khi khôi phục (restore) sẽ không gây ra lỗi tiếng việt cho website.

Các bước tạo file php Backup Database:

- Trước tiên bạn cần tạo ra một file connection.php để kết nối đến cơ sở dữ liệu với nội dung như sau:

$host="localhost"; // Mặc định là localhost
$uname="username_database";
$pass="password_database";
$database = "database_name";
// Hàm bỏ qua lỗi kết nối
error_reporting(E_ALL ^ E_DEPRECATED);
// Xử lý kết nối database
$connection=mysql_pconnect($host,$uname,$pass) or die("Database Connection Failed");
// Xử lý lấy dữ liệu ngôn ngữ utf8
mysql_set_charset('utf8',$connection);
// Kết nối đến cơ sở dữ liệu
$selectdb=mysql_select_db($database) or die("Database could not be selected");
$result=mysql_select_db($database) or die("Database cannot be selected");

- Tiếp theo bạn tạo file database_backup.php với hàm xuất dữ liệu thành file .sql có nội dung:

// Lấy đường dẫn file kết nối cơ sở dữ liệu
include("connection.php");
function backup_db(){
	// Lưu trữ tất cả tên Table vào một mảng
	$return='';
	$allTables = array();
	$result = mysql_query('SHOW TABLES');
	while($row = mysql_fetch_row($result)){
		 $allTables[] = $row[0];
	}
	 
	foreach($allTables as $table){
		$result = mysql_query('SELECT * FROM '.$table);
		$num_fields = mysql_num_fields($result);
		 
		$return.= 'DROP TABLE IF EXISTS '.$table.';';
		$row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table));
		$return.= "\n\n".$row2[1].";\n\n";
		 
		for ($i = 0; $i < $num_fields; $i++) {
			while($row = mysql_fetch_row($result)){
				$return.= 'INSERT INTO '.$table.' VALUES(';
				for($j=0; $j<$num_fields; $j++){
					$row[$j] = addslashes($row[$j]);
					$row[$j] = str_replace("\n","\\n",$row[$j]);
					if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; }
					else { $return.= '""'; }
					if ($j<($num_fields-1)) { $return.= ','; }
				}
				$return.= ");\n";
			}
		}
		$return.="\n\n";
	}
	 
	// Tạo thư mục Backup
	$folder = 'DB_Backup/';
	if (!is_dir($folder))
	mkdir($folder, 0777, true);
	chmod($folder, 0777);	
	// Đặt tên file
	$date = date('m-d-Y-H-i-s', time());
	$filename = $folder."db-backup-".$date;
	//Tạo file .sql
	$handle = fopen($filename.'.sql','w+');
	fwrite($handle,($return));
	fclose($handle);
}
 
// Gọi hàm thực thi
backup_db();

Khi bạn chạy file database_backup.php thì nó sẽ thực thi xuất ra file .sql cho bạn.

Với đoạn code trên bạn có thể viết thêm một ứng quản lý backup dữ liệu trên host thật dễ dàng mà không mất nhiều thời gian.

Chúc các bạn thành công!

PHÂN CHIA SỐ ĐIỆN THEO NHÓM TRÊN C#

- NHƯ CHÚNG TA ĐÃ BIẾT SỐ ĐIỆN THOẠI CÓ CẤU TRÚC NHƯ SAU: XXXX.XXX.XX (10 SỐ) HOẶC XXXX.XXX.XXXX (12 SỐ)

- Trên các diễn đàn và website có nhiều cách xử lý cho trường hợp này. Nhưng tôi thấy quá gườm gà. sau đây tôi xin giới thiệu cách làm đơn giản nhất

B1: BẮT SỰU KIỆN KEYUP

if (!e.KeyCode.Equals(Keys.Back))
{
   if (txt_dt_nguoinhan.Text.Length == 4)
   txt_dt_nguoinhan.Text = txt_dt_nguoinhan.Text + ".";  ==> GROUP 4 SỐ ĐẦU
   else if (txt_dt_nguoinhan.Text.Length == 8)
   txt_dt_nguoinhan.Text = txt_dt_nguoinhan.Text + "."; ==> GROUP 3 SỐ TIẾP THEO
}
  txt_dt_nguoinhan.Select(txt_dt_nguoinhan.Text.Length, 0);

B2: BẮT SỰU KIỆN KEYPRESS KHÔNG CHO NHẬP DÂU CHẤM

if (char.IsLetter(e.KeyChar) || char.IsSymbol(e.KeyChar) || char.IsWhiteSpace(e.KeyChar) || char.IsPunctuation(e.KeyChar))
{
   e.Handled = true; //Không cho thể hiện lên TextBox
}

CHÚC THÀNH CÔNG!