Hiển thị các bài đăng có nhãn MySql. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn MySql. Hiển thị tất cả bài đăng

Thứ Hai, 24 tháng 7, 2023

Xử lý lỗi khởi động mySqlRouter

 1. Nếu MySqlRouter không tìm thấy thư mục chứa tập tin  mysqlrouter.pid (chẳng hạn thư mục /var/run/mysqlrouter/ thì tạo thư mục ấy :

$ sudo mkdir /var/run/mysqlrouter/
$ sudo chown -R mysql:mysql /var/run/mysqlrouter/

 

2. Nếu service không khởi động được, ta có thể loại nó ra khỏi systemd rồi sau đó cập nhật tập biến RestartSec của tập tin service
$ sudo systemctl disable mysqlrouter.service


3. Cập nhật mysqlrouter.service để gia hạn thêm thời gian tái khởi động dịch vụ

$ sudo vi /etc/systemd/system/mysqlrouter.service

....

RestartSec=20

....


4. Sau đó cập nhật lại systemd
$ sudo systemctl daemon-reload


5.Rồi khởi động lại dịch vụ
$ sudo systemctl start mysqlrouter.service 



Thứ Sáu, 21 tháng 4, 2023

MySql : Ví dụ viết một thủ tục procedure

 Một thủ tục trong MySql có cú pháp như sau :

DELIMITER {custom delimiter}
CREATE PROCEDURE {procedureName}([optional parameters])
BEGIN
// procedure body...
// procedure body...
END
{custom delimiter}

Ví dụ
Ta có bảng customer như sau :


Table "customer"
Column | Type | Modifiers
------------+-------------+-----------
id | integer | not null
address | varchar(64) |
first_name | varchar(32) |
last_name | varchar(32) |
email | varchar(64) |
Indexes:
"customer_pkey" PRIMARY KEY, btree (id)

Ta muốn tạo một bảng temp_customer có cấu trúc giống hệt bảng customer; và bảng này có dữ liệu lấy từ bảng customer :

DROP TABLE IF EXISTS temp_customer;
CREATE TABLE temp_customer
(
id binary(16) not null primary key,
address varchar(64),
first_name varchar(32),
last_name varchar(32),
email varchar(64)
);

 

Ta định nghĩa một thủ tục như sau :

DROP PROCEDURE IF EXISTS ADD_TEMP_CUSTOMER;
DELIMITER $$
CREATE PROCEDURE ADD_TEMP_CUSTOMER()
BEGIN
DECLARE retrieved_address varchar(64);
DECLARE retrieved_first_name varchar(32);
DECLARE retrieved_last_name varchar(32);
DECLARE retrieved_email varchar(64);
DECLARE new_id binary(16);
DECLARE num_row int;
DECLARE finished INTEGER DEFAULT 0;

DECLARE customer_cursor CURSOR FOR
SELECT address, first_name, last_name, email FROM customer;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

OPEN customer_cursor;
insert_loop:
LOOP
FETCH customer_cursor INTO retrieved_address, retrieved_first_name, retrieved_last_name, retrieved_email;
IF finished THEN
LEAVE insert_loop;
END IF;

SET @temp_count = (SELECT count(*) FROM temp_customer);
SELECT count(*) into num_row FROM temp_customer;

IF num_row = 0 THEN
SET new_id = UUID_TO_BIN(UUID());
INSERT IGNORE INTO temp_customer(id, address, first_name, last_name, email)
VALUES (new_id, retrieved_address, retrieved_first_name, retrieved_last_name, retrieved_email);
END IF;

END LOOP;
CLOSE customer_cursor;
END $$
DELIMITER ;

CALL ADD_TEMP_CUSTOMER();
DROP PROCEDURE IF EXISTS ADD_TEMP_CUSTOMER;

Giải thích : thủ tục này sẽ dùng một cursor để đọc hết bảng customer và lấy thông tin từ đây điền vào bảng temp_customer


Chú ý để có thể thực thi thủ tục, user phải có quyền thực thi nó, ta có thể gán quyền ấy như sau :

GRANT CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON *.* TO 'toan'@'127.0.0.1';
FLUSH PRIVILEGES;

Hoặc có thể gán mọi quyền như sau :

GRANT ALL PRIVILEGES ON *.* TO 'toan'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;