Vấn đề Unicode với Python 3- Oracle

Đối với Python 3 thì string tự động được sử dụng với Unicode nhưng khi sử dụng Tiếng Việt thao tác xuống Database Oracle hoặc hiển thị dữ liệu Tiếng Việt lên thì bị lỗi.

Để khắc phục điều này khi sử dụng connect tới DB thì cần khai báo encoding và nencoding: cx_Oracle.connect(‘admin’,’admin’,dsn_tns,encoding=”UTF-8″, nencoding=”UTF-8″)

Ví dụ hoàn thiện với việc thêm mới dữ liệu Tiếng Việt:

#!/usr/bin/python

# -*- coding: utf8 -*-
from unicodedata import normalize
import cx_Oracle
cursor, connection = None, None
try:
    dsn_tns = cx_Oracle.makedsn('192.168.177.xxx' , 1522, 'orcl')
    connection = cx_Oracle.connect('admin','admin',dsn_tns,encoding="UTF-8", nencoding="UTF-8")
    cursor = connection.cursor()
    a=u"Lý do"
    b="reasons"
    c="INSERT INTO VN_TEMP_DIC (VN, EN,DAY_TIME,STATUS) VALUES ('%s','%s',sysdate,0)" % (a,b)
    cursor.execute(c)
    cursor.execute("COMMIT")
except cx_Oracle.DatabaseError as e:
    raise e
except Exception as e:
    raise e     
finally:
    if cursor != None:
        cursor.close()
    if connection != None:
        connection.close()


    

Ví dụ hoàn thiện với việc hiển thị dữ liệu tiếng Việt load từ DB:

#!/usr/bin/python
# -*- coding: utf8 -*-

import cx_Oracle
dsn_tns = cx_Oracle.makedsn('xxxxxxxxx' , 1522, 'orcl')
connection = cx_Oracle.Connection('admin','admin',dsn_tns,encoding="UTF-8", nencoding="UTF-8")
cur=connection.cursor()
content = 'however it not depend on column INDPOSTPONEADVANTAGES'
listword=content.split()
listr="";
for re in listword:
    listr=listr+"','"+re
listr=listr
listr=listr[3:]   
print(listr)
query="select a.EN,a.VN from VN_TEMP_DIC a where trim(a.EN) in('%s') order by a.STATUS desc,a.DAY_TIME desc" % (listr)
#print(query)
cur.execute(query)
for result in cur:
    print(result[0]+" - "+result[1])
cur.close()
connection.close

Một số tài liệu cài đặt Oracle trên Oracle Linux

https://asktom.oracle.com/pls/asktom/asktom.search?tag=ora-01034-oracle-not-available

https://oracle-base.com/articles/linux/automating-database-startup-and-shutdown-on-linux

ORA-01078: failure in processing system parameters

https://stackoverflow.com/questions/18403125/how-to-create-a-new-schema-new-user-in-oracle-database-11g

Cài đặt từ thư viện Oracle

https://sites.google.com/site/loilmsite/oracle/cai-dat-oracle-database-11g-release-2-tren-oracle-linux-6

https://ora-data.blogspot.com/2016/11/sqlplus-not-connecting-in-oracle.html

https://community.oracle.com/thread/2178662

Oracle đã và đang ứng dụng trí tệ nhân tạo trong sản phẩm Database

Nghe thiên hạ đồn oracle đang phát triển thế hệ Database mới với ứng dụng trí tuệ nhân tạo trong đó. Trí tuệ nhân tạo sẽ giúp hệ thống tự động nhận diện các lỗi phát sinh trong hệ quản trị cơ sở dữ liệu và tiến hành tự sửa chữa. Việc ứng dụng AI này hệ thống Database sẽ cần ít thao tác từ người quản trị hơn mà sẽ tự động quản trị, ví dụ như:

  • Trước đây người quản trị (DBA) sẽ theo dõi hệ thống và ra các quyết định tác động lên hệ thống, ở mức cao hơn sẽ tự động hóa bằng các job hay tool để monitor và tự xử lý với các rule đặt trước. Nhưng trí tuệ nhân tạo sẽ hoàn toàn bỏ qua phần này, hệ thống sẽ tự động xác định và xử lý mà không cần sự can thiệp của DBA.
  • Việc tinh chỉnh, tối ưu, turning câu lệnh SQL sẽ được hệ thống ứng dụng trí tuệ nhân tạo xác định và tiến hành tối ưu. Hệ thống sẽ tự phân tích để đánh index, tạo view, sử dụng bảng tạm, bảng phẳng để tối ưu các tiến trình.
  • Trí tuệ nhân tạo sẽ tự tối ưu các job, đồng bộ dữ liệu, cân bằng tải… tự đưa ra các chiến lược backup hiệu quả để tiết kiệm tài nguyên và tăng tính sẵn sàng cho hệ thống…
  • Việc lấy các báo cáo sẽ nâng cao tính động, nhanh hơn và có thể hiểu người ra yêu cầu một cách chính xác hơn.

Nhìn chung sẽ làm cho hệ thống Database trở nên thông minh hơn, công việc DBA sẽ nhẹ nhàng và nhàn hạ đi rất nhiều nhưng cùng với đó là công việc DBA sẽ ít dần và dần chuyển sang công việc khác. Tất nhiên con đường đó vẫn còn xa, việc tự động hóa toàn bộ cũng nảy sinh nhiều vấn đề mà khó có thể lường trước được.

Winservice và Job scheduler – crontab

Hôm trước có đồng nghiệp cũ hỏi mình config thời gian chạy của winservice tự động gửi lại tin nhắn nằm ở đâu? Thực ra vòng vo một hồi thì đó là 1 cái Job chạy 5 phút 1 lần kiểm tra xem hàng đợi gửi tin nhắn xử lý có bị tồn không để thông báo tới admin để kiểm tra hệ thống. Về hệ thống này mình sẽ trình bày ở một bài khác.
Nhân tiện việc này mình muốn chia sẻ sự hiểu biết của mình về Winservice và Scheduler – Crontab:

  • Winservice: mình đã tiếp xúc với winservice sớm hơn trong công việc. Winservice bản chất là một chương trình thực thi một khối lệnh nào đó hoặc công việc nào đó lặp đi lặp lại sau một khoảng thời gian nghỉ nào đó. Ví dụ như ta phải dán con hạc giấy đã được gấp lên một bước tường chẳng hạn, ta cứ dán được 1 con lên thì ta lại ngồi nghỉ 5 phút chẳng hạn. Ta không quan tâm dán nó trong bao lâu 1 phút, 2 phút hay 5 phút… miễn là cứ dán xong thì ta ngồi nghỉ 5 phút rồi dán tiếp. Ứng dụng của Winservice là xử lý hàng đợi – queue, trong hàng đợi ta không cần biết có bao nhiêu, cứ lấy 1 cái (có thể random hoặc cái đầu hàng đợi hoặc cuối hàng đợi…) đem ra để xử lý xong rồi nghỉ một thời gian nào đó rồi lại vào lấy 1 cái… tất nhiên hàng đợi có thể tiếp tục được cập nhật hoặc không, hoặc có thể cập nhật ở một thời điểm bất kỳ nào đó. Do vậy với winservice ta không thể biết trước khi nào thì một khối lệnh hoặc công việc mới được thực hiện do ta không nắm được khối lệnh đó hoặc công việc được xử lý trong bao lâu. Cứ phải xong thì mới thực hiện các việc tiếp theo. Đối với Winservice ta có thể làm xử lý 1 luồng nhưng để hiệu quả ta có thể làm nó chạy đa luồng (nghĩa là các công việc xử lý song song nhau) nhưng nếu sử dụng chung tài nguyên thì rất dễ xảy ra xung đột dẫn đến bị deadlock và winservice bị treo không chạy được nữa. Ta buộc phải xử lý khéo léo khi code trong vấn đề này, và việc này xảy ra là chuyện bình thường.
  • Scheduler – Crontab: Cũng như Winservice, Scheduler – Crontab (mình không rõ tên của nó nên đang dùng tên lần lượt mà hệ đều hành Window và Linux cung cấp cho người dùng) cũng thực thi một khối lệnh hoặc công việc nào đó nhiều lần nhưng được xác định thời gian bắt đầu của công việc đó. Ví dụ với việc dán hạc giấy, thì cứ đầu từng giờ ta tiến hành dán một con hạc giấy, việc dán này không cần biết có xong hay không, nhanh hay chậm, cứ đầu từng giờ là lấy 1 con hạc lên gián mà thôi. Như vậy có thể lần giờ trước ta dán chưa xong thì tới lần giờ tiếp theo ta sẽ vẫn lấy 1 con hạc đem đi dán.

Một số ứng dụng của Winservice và Scheduler – Crontab mà mình biết như sau:

Winservice:

  • Xử lý hàng đợi nạp tiền của khách hàng: Ví dụ hàng trăm nghìn tin nhắn nạp thẻ đến trong 1 phút của nhà mạng, nhà mạng chắc chắn sẽ dựng queue để đón nhận các yêu cầu này và lần lượt lấy 1 hoặc 1 số giao dịch để đem đi xử lý. Có thể nghỉ 1 chút lại tiếp tục lấy để xử lý……

Scheduler – Crontab: Các phần job chạy theo năm – tháng – giờ – phút – giây như:

  • Job backup hệ thống vào cuối mỗi ngày
  • Job kiểm tra cứ 5 phút lại check hệ thống hoặc tác vụ gì đó như winservice còn sống không để thông báo
  • Job gửi dữ liệu vào ngày đầu tháng tất cả số liệu của tháng trước

Winservice và Scheduler – Crontab có các tính chất và ưu nhược điểm khác nhau nên tùy từng tác vụ cụ thể ta phải xem xét và sử dụng cho phù hợp.

Oracle thông báo về các Procedure, PACKAGE được sửa trong ngày

Một ngày đẹp trời như thường lệ mình đến công ty nhưng được thông báo là có 1 vài job chạy hàng đêm của hôm trước bị lỗi. Kiểm tra nguyên nhân thì do mình đã tiến hành sửa một PACKAGE nhưng khi compile thì bị lỗi mà mình đã không để ý. Đó chính là sơ suất của mình khi thực hiện sửa 1 PACKAGE trên PROD mà không verify lại. Để khắc phục hậu quả này là phải đi tìm lại đoạn code bị mất trên con test (mà đã backup rồi) và tiến hành chạy lại những job bị lỗi.

Để kiểm soát việc này, vào cuối ngày ta phải check lại các PACKAGE được sửa đổi trong ngày có compile thành công hay không. Sau đây là câu lệnh liệt kê các PACKAGE, PROCEDURE được sửa trong ngày:

SELECT owner,
object_name,
object_type,
last_ddl_time,
status
FROM dba_objects
WHERE object_name IN
(SELECT A.REFERENCED_NAME
FROM DBA_DEPENDENCIES a
WHERE object_type IN ('PROCEDURE', 'PACKAGE BODY', 'PACKAGE'))
AND last_ddl_time >= TRUNC(SYSDATE - 1)
ORDER BY last_ddl_time DESC;

Để tự động hóa việc này ta tiến hành lập crontab hoặc schedule gửi email thông tin để người trực cuối ngày kiểm tra để tiến hành sửa kịp thời. Tránh bị lỗi như trên.