--------------- <> -----------------
--- KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM ---
--- Học để đi cùng bà con trên thế giới ---

Tìm kiếm trong Blog

Cookie (2) - Bài tập về cookie

 Phần trước: Cookie (1) - Tìm hiểu về cookie

-----

1.8       Bài tập về cookie

Bài tập 1: Viết chương trình để khi truy cập vào trang web, chương trình sẽ xuất thời gian truy cập lần gần đây nhất. Đây là đoạn mã tham khảo:

<?php

            echo "Chao ban, <br>";

            if(isset($_COOKIE['thoiGianTruyCap'])) {

                        echo "Thoi gian truy cap gan day nhat la: " .  date('d/m/Y H:i:s', $_COOKIE['thoiGianTruyCap']);

                        setcookie('thoiGianTruyCap', time(), time() + 600);

                       

            } else {

                        setcookie('thoiGianTruyCap', time(), time() + 600);

            }

?>

Xem thêm clip sau (của tác giả Lưu Trường Hải Lân): https://www.youtube.com/watch?v=PATRjYG2nhM&list=PLv6GftO355AsZFXlWLKob6tMsWZa4VCY1&index=105

Bài tập 2:

2.1. Thiết kế giao diện sau (vùng có viền đỏ) bằng HTML và CSS, có thể dùng Bootstrap hoặc không. (yêu cầu này là tùy chọn, cho bạn nào thích làm về front-end)

 


2.2. Kiểm tra thông tin đăng nhập của người dùng, nếu khớp với thông tin người dùng trong tập tin users.ini thì tạo cookie lưu lại thông tin đăng nhập. Lưu ý: Tên đăng nhập có thể là họ tên hoặc số điện thoại. Chưa xử lý phần Mã kiểm tra.

2.3. Sau khi người dùng đăng nhập thành công, duy trì việc đăng nhập này trong 3 phút, quá thời gian này, tự động đăng xuất người dùng.

Mã nguồn tham khảo:

[index.php]

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <title>Document</title>

  <link href="css/bootstrap.min.css" rel="stylesheet">

</head>

<body>

  <div class="container">

    <?php

    if (isset($_COOKIE['fullname'])) {

      echo '<h3> Xin chào: ' . $_COOKIE['fullname'] . '</h3>';

      echo '<a href="logout.php">Đăng xuất</a>';

    } else {

      ?>

    <h3 class="text-center">Login</h3>

    <div class="row">

      <div class="col-md-4 col-md-offset-4">

       <form action="process.php" method="post">

        <div class="form-group">

          <label for="username">Username</label>

          <input type="text" id="username" name="username"class="form-control">

        </div>

        <div class="form-group">

          <label for="password">Password</label>

          <input type="password" id="password" name="password" class="form-control">

        </div>

        <button type="submit" class="btn btn-primary">Đăng nhập</button>

      </form>

    </div>

  </div>

  <?php

      }

  ?>

</div>

</body>

</html>

 

[process.php]

 

<h3 class="text-center">process</h3>

<?php

  // kiểm tra dữ liệu khác rỗng

  function checkEmpty($value) {

    $flag = false;

    if (!isset($value) || trim($value) == '') {

      $flag = true;

    }

    return $flag;

  }

 

  if (isset($_COOKIE['fullname'])) {

    echo '<h3> Xin chào: ' . $_COOKIE['fullname'] . '</h3>';

    echo '<a href="logout.php">Đăng xuất</a>';

  } else {

    if (!checkEmpty($_POST['username']) && !checkEmpty($_POST['password'])) {

      $username = $_POST['username'];

      $password = md5($_POST['password']);

      $data = parse_ini_file('users.ini');

      if (array_key_exists($username, $data)) {

        $userInfo = explode ('|', $data[$username]);

        if ($username == $userInfo[0] && $password == $userInfo[1]) {

          setcookie('fullname', $userInfo[2], time() + 200);

          echo '<h3> Xin chào: ' . $userInfo[2] . '</h3>';

          echo '<a href="logout.php">Đăng xuất</a>';

        } else {

          header('location:index.php');

        }

      }else {

        header('location:index.php');

      }

    } else {

    // die('test');

      header('location:index.php');

    }

  }

?>

 

[logout.php]

 

<?php

  setcookie('fullname');

  header('location:index.php');

?>

 

[users.ini]

 

teo = "teo|c4ca4238a0b923820dcc509a6f75849b|Nguyen Van Teo"

ti = "ti|c81e728d9d4c2f636f067f89cc14862c|Tran Van Ti"

Video tham khảo phần backend: https://www.youtube.com/watch?v=PATRjYG2nhM&list=PLv6GftO355AsZFXlWLKob6tMsWZa4VCY1&index=105

-----

Cập nhật: [14/10/2020]
-----
Xem thêm: Cookie (3) - 

Cookie (1) - Tìm hiểu về cookie

1         Cookie

1.1       Khái niệm

Cookie (còn có tên gọi khác là http cookie, web cookie, Internet cookie, browser cookie) là một phần dữ liệu nhỏ, được lưu trên máy tính (đĩa cứng) của người dùng, khi người dùng truy cập một website.

Dữ liệu của cookie có định dạng kiểu “tên/giá trị” (name/value). Ví dụ: tên/nguyenvanteo, matkhau/abc.

Cookie được dùng để:

– Ghi lại thông tin trạng thái (ví dụ, tên các mặt hàng đã được bỏ vào giỏ hàng)

– Ghi lại hoạt động duyệt web của người dùng (ví dụ, đã bấm nút nào, quá trình đăng nhập, đã từng vào các trang nào)

– Lưu lại các thông tin mà người dùng đã từng nhập vào các form như tên, mật khẩu, địa chỉ, số tài khoản ngân hàng

 

1.2       Cookie được lưu ở đâu?

Mỗi trình duyệt trên máy tính sẽ có vị trí để lưu thông tin cookie của riêng nó, vì vậy nếu dùng hai trình duyệt truy cập vào cùng một website thì sẽ có hai cookie khác nhau.

Ví dụ trình duyệt Chrome trên Windows 10, sẽ lưu ở C:/Users/<user hiện hành>/AppData/Local/Google/Chrome/User Data/Default/Cookies.

Trình duyệt FireFox trên Windows 10, sẽ lưu ở C:\Users\user hiện hành\AppData\Roaming\Mozilla\Firefox\Profiles\xxxx.default\cookies.sqlite.

Lưu ý: với các trình duyệt web hiện đại, thông tin trong cookie luôn được mã hóa; vì vậy không thể sử dụng các chương trình mở tập tin thông thường (ví dụ File Explorer) để xem nội dung của cookie được;  mà phải sử dụng chính trình duyệt hoặc các ngôn ngữ lập trình.

Ví dụ, để xem cookie bằng trình duyệt Chrome, thực hiện các bước sau:

– Từ cửa sổ trình duyệt Chrome, trên thanh công cụ, bấm vào mục sau cùng (Customize and Control Chrome – mũi tên hướng lên, màu xanh), chọn mục Settings.

– Cuộn xuống, tìm tới mục Privacy and secutiry, chọn mục Cookies and other site data, bấm vào mũi tên bên phía phải

– Chọn tiếp mục See all cookies and site data để xem các cookie quan tâm. Có thể truy cập trang tiki.vn, sau đó trong mục này, tìm kiếm từ khóa tiki để xem các cookie đã được tạo ra.

1.3       Các loại cookie

Có nhiều loại cookie, mỗi loại có đặc điểm và mục đích sử dụng khác nhau. Ví dụ:

– HttpOnly

– Persistent

– SameSite

– Secure

– Session

– Supercookie

– Third-party

1.4       Cơ chế hoạt động của một cookie

Đặc tả của giao thức HTTP sẽ quy định cách thức web server thiết lập và đọc giá trị của cookie trong mỗi phiên làm việc với trình duyệt. Đây là cơ chế hoạt động của cookie:

– Khi trình duyệt muốn xem nội dung của một trang web, nó sẽ gửi một request (HTTP GET) tới web server. Trong request có chứa tên trang web muốn xem và tên miền của web server.

Ví dụ:

GET /index.php

Host: www.congty.com

– Sau khi nhận được request, web server sẽ gửi về trình duyệt một HTTP response, bên trong có chứa: mã trạng thái cho request, các cookie nó muốn thiết lập trên máy người dùng bằng lệnh Set-Cookie, và nội dung của trang web.

HTTP/1.0 GET OK

Content-type: text/html

Set-Cookie: name1=value1; attributes

Set-Cookie: name2=value2; attributes

Nội dung trang HTML   

– Trong một HTTP response, các thông tin về cookie được đặt trước nội dung trang HTML. Web server sẽ gán cho mỗi cookie một tên duy nhất, cùng với giá trị, và các thuộc tính tùy chọn (attributes) khác. Trình duyệt sẽ lưu các giá trị cookie này xuống đĩa cứng tại máy client.

Dưới đây là các thuộc tính (tùy chọn), có thể thiết lập cho mỗi cookie:

+ Domain=site

+ Expires=datetime

+ HttpOnly

            + Max-Age=number

+ Path=path

+ SameSite=setting

+ Secure

– Sau khi web server đã thiết lập cookie trên trình duyệt, ở lần gửi request một trang web tiếp theo (cùng web server), trình duyệt sẽ gửi toàn bộ các cookie do web server đã thiết lập trước đó. Lưu ý: trình duyệt chỉ gửi name/value của cookie mà không gửi các thuộc tính mà web server đã thiết lập trước đó. Ví dụ:

GET /index.php

Host: www.congty.com

Cookie: name1=value1; name2=value2 

1.5       Cookie trên các trình duyệt

Mỗi trình duyệt sẽ xử lý cookie theo cách của riêng nó. Tuy nhiên, có một số yêu cầu tối thiểu đã được đặc tả trong giao thức HTTP gồm:

– Kích thước vùng lưu cookie trên trình duyệt không nhỏ hơn 4.096 byte

– Trình duyệt phải cho phép lưu ít nhất 50 cookie/website

– Tổng số cookie trình duyệt có thể lưu trữ không ít hơn 3.000

1.6       Tìm hiểu persistent cookie

Persistent cookie (tạm dịch là “cookie cố định”) là loại cookie có thời gian tồn tại được xác định cụ thể. Persistent cookie sẽ hết hiệu lực sau một mốc thời gian hoặc sau một khoảng thời gian được ấn định trước. Trong thời gian còn hiệu lực, thông tin của persistent cookie sẽ được gửi đến web server mỗi khi người dùng truy cập website, hoặc khi họ truy cập một nguồn tài nguyên thuộc website thông qua một website khác.

Đôi khi, người ta gọi persistent cookies là tracking cookie (cookie theo dõi), vì các nhà quảng cáo có thể sử dụng cookie này để theo dõi thói quen, hành vi duyệt web của người dùng.

Tuy nhiên, persistent cookie thường được dùng cho các tình huống hợp pháp, chính đáng như lưu lại thông tin đăng nhập của người dùng, để họ không phải nhập lại trong các lần đăng nhập sau.

Phần này sẽ minh họa hoạt động của cookie bằng ngôn ngữ PHP.

1.6.1       Tạo cookie

Để tạo cookie, sử dụng hàm setcookie($name, $value, $time)

– $name: tên cookie

– $value: giá trị gán cho cookie

– $time: thời gian tồn tại của cookie

Ví dụ,

<?php

            setcookie('username','nguyenvanteo', time()+120); //thời gian cookie có hiệu lực là 120 giây.

?>

Sau khi chạy đoạn mã trên bằng trình duyệt, vào xem giá trị của cookie vừa được lưu trên máy client. Ví dụ xem bằng trình duyệt chrome:

– Từ cửa sổ trình duyệt Chrome, trên thanh công cụ, bấm vào mục sau cùng (Customize and Control Chrome – mũi tên hướng lên, màu xanh), chọn mục Settings.

– Cuộn xuống, tìm tới mục Privacy and secutiry, chọn mục Cookies and other site data, bấm vào mũi tên bên phía phải

– Chọn tiếp mục See all cookies and site data để xem cookie vừa lưu. Lưu ý: trình duyệt sẽ sắp xếp các cookie theo chiều tăng của domain website. Do vậy, có thể xóa tất cả cookie bằng nút REMOVE ALL, sau đó chạy lại đoạn mã PHP, để tìm cookie dễ hơn. Ví dụ: website có đường dẫn là: http://localhost/mywebsite/trangweb.php, thì trong mục này sẽ tìm tới mục localhost để xem thông tin của cookie.

Ví dụ, thông tin của cookie username:

Name: username

Content: nguyenvanteo

Domain: localhost

Path: /mywebsite

Send for: Same-site connections only

Accessible to script: Yes

Created: Tuesday, October 13, 2020 at 2:52:26 AM

Expires: Tuesday, October 13, 2020 at 2:54:26 AM

1.6.2       Đọc cookie

Để đọc thông tin cookie do trình duyệt gửi về web server, sử dụng biến $_COOKIE

Ví dụ,

<?php

            setcookie('username','nguyenvanteo', time()+120); //thời gian cookie có hiệu lực là 120 giây.

            echo '<pre>';

            print_r($_COOKIE);

            echo '</pre>';

?>

Kết quả xuất ra màn hình là:

Array

(

    [username] => nguyenvanteo

)

Hoặc,

<?php

            setcookie('username','nguyenvanteo', time()+120); //thời gian cookie có hiệu lực là 120 giây.

            echo '<pre>';

            print_r($_COOKIE['username']);

            echo '</pre>';

?>

1.6.3       Xóa cookie

Để xóa cookie, sử dụng một trong hai hàm sau:

– setcookie($name), với $name là tên cookie muốn xóa

– setcookie($name, $value, $time), với $time thuộc về quá khứ

Ví dụ 1, xóa cookie bằng hàm setcookie($name):

<?php

            setcookie('username','nguyenvanteo', time()+120); //thời gian cookie có hiệu lực là 120 giây.

            // xóa cookie

            setcookie('username');

            echo '<pre>';

            print_r($_COOKIE);

            echo '</pre>';

?>

Kết quả xuất ra màn hình là:

Array

(

)

Ví dụ 2, xóa cookie bằng hàm setcookie($name, $value, $time), với $time thuộc về quá khứ:

<?php

            setcookie('username','nguyenvanteo', time()+120); //thời gian cookie có hiệu lực là 120 giây.

            // xóa cookie

            setcookie('username', 'noi dung bat ki', time()-1);

            echo '<pre>';

            print_r($_COOKIE);

            echo '</pre>';

?>

Kết quả xuất ra màn hình là:

Array

(

)

1.7       Ví dụ minh họa về hoạt động của cookie

Minh họa bằng ngôn ngữ PHP.

– Vào trình duyệt xóa sạch cookie

– Tạo một trang web bất kì, với đoạn mã sau:

[trangweb.php]

<?php

            setcookie('thoiGianTruyCap', time(), time() + 600);

            if(isset($_COOKIE['thoiGianTruyCap'])) {

                        echo "Web server da gui_ghi cookie xuong trinh duyet vao luc" .  date('d/m/Y H:i:s', $_COOKIE['thoiGianTruyCap']);

            } else {

                        echo "Truy cap Web server lan dau, nen chua co gia tri cua cookie";

            }

?>

– Từ trình duyệt, truy cập trangweb.php lần đầu, sẽ có kết quả sau:

Truy cap Web server lan dau, nen chua co gia tri cua cookie

– Tuy nhiên, nếu mở trình duyệt, vào xem các cookie thì sẽ thấy cookie thoiGianTruyCap đã được ghi xuống trình duyệt.

– Thực hiện refresh trang web, nghĩa là truy cập tới web server lần 2, kết quả trên trình duyệt sẽ là:

Web server da gui_ghi cookie xuong trinh duyet vao luc14/10/2020 04:44:37

-----

Cập nhật: [14/10/2020]
-----

DBMS (2) - Làm quen với DBMS

Bài trước: DBMS (1) - Tổng quan

-----

1.1       Làm quen với DBMS

1.1.1       Định nghĩa và một số thông tin

Hệ quản trị cơ sở dữ liệu (Database Management System – DBMS) là một hệ thống phần mềm, được sử dụng để tạo, quản lý và khai thác cơ sở dữ liệu.

Một số hệ quản trị cơ sở dữ liệu phổ biến (theo khảo sát của Stackoverflow):

MySQL

PostgreSQL

Microsoft SQL Server

SQLite

MongoDB

Redis

Oracle

MariaDB

Elasticsearch

DynamoDB

Firebase

Cloud Firestore

Cassandra

Neo4j

IBM DB2

CouchDB

Couchbase

 

 

 

Hình sau là biểu tượng/biểu trưng (logo) của một số hệ quản trị cơ sở dữ liệu:


1.1.2       MySQL

Để dễ dàng tìm hiểu về hệ quản trị cơ sở dữ liệu, chúng ta sẽ tìm hiểu về MySQL, là một trong các hệ quản trị cơ sở dữ liệu phổ biến.

MySQL là một hệ quản trị cơ sở dữ liệu (kiểu quan hệ, mã nguồn mở). Hiện nay, Oracle đang sở hữu MySQL. Dựa trên MySQL người ta tạo ra MariaDB. MariaDB được khuyến cáo sử dụng cho các dự án thực tế.

Một số hệ thống đang sử dụng MySQL: Drupal, Joomla, Wordpress, phpBB, Facebook, Youtube, Twitter.

Phiên bản đầu tiên được công bố 1995. Một số phiên bản của MySQL: 5.1; 5,5; 5.6; 5.7; 8.0

MySQL cũng như các DBMS khác, nó thường gồm 3 thành phần sau:

– Thành phần cốt lõi của một DBMS thường gọi là Database Engine, thành phần này thực hiện việc lưu trữ, xử lý và bảo mật dữ liệu.

– Công cụ giúp người sử dụng có thể giao tiếp/làm việc được với Database Engine.

– Cơ sở dữ liệu được tạo trong Database Engine.

Tải và cài đặt MySQL thủ công

Bước 1. Tải gói Database Engine về máy

– Vào trang google, gõ từ khóa mysql để tìm kiếm

– Mở trang web của mysql (https://www.mysql.com/)

– Tìm tới mục Downloads

– Nên chọn bản miễn phí (community) để cài đặt. Ví dụ bấm vào mục “MySQL Community (GPL) Downloads” để tìm bản miễn phí

– Chọn MySQL Community Server (đây chính là hệ quản trị cơ sở dữ liệu MySQL và các công cụ đi kèm), chọn gói cài đặt thủ công “Windows (x86, 64-bit), ZIP Archive”, kích thước khoảng 215MB.

– Sau khi tải về máy, giải nén, chép toàn bộ tập tin và thư mục con (ví dụ: bin, docs, include, lib, share,…) vào thư mục C:\Program Files\mysql (nhớ tạo mới thư mục mysql).

– Mở chương trình dòng lệnh (CMD, Command Prompt), chuyển dấu nhắc tới thư mục C:\Program Files\mysql/bin

– Chạy lệnh khởi tạo (initialize) một số thành phần của MySQL server trước khi bạn có thể sử dụng nó. Lệnh khởi tạo sẽ tạo thư mục data, tạo ra các bảng hệ thống, khởi tạo tablespace, tải server-side help tables, cài đặt sys schema, tạo một tài khoản quản trị. Vì lệnh này khởi tạo các thông tin ban đầu cho hệ thống, nên chỉ cần thực hiện lệnh này một lần duy nhất.

C:\Program Files\mysql\bin>mysqld --initialize

C:\Program Files\mysql\bin>

 

Nếu chạy lệnh mysqld –initialize thành công, hệ thống sẽ không có thông báo gì trong cửa sổ dòng lệnh, tuy nhiên bạn sẽ thấy trong thư mục C:\Program Files\mysql sẽ có thêm thư mục data

– Tới đây, bạn đã có thể chạy MySQL server bằng lệnh mysqld, thêm tham số --console để xuất các thông báo ra màn hình dòng lệnh

 C:\Program Files\mysql\bin>mysqld --console

2022-08-08T03:59:06.279226Z 0 [System] [MY-010116] [Server] C:\Program Files\mysql\bin\mysqld.exe (mysqld 8.0.30) starting as process 18720

2022-08-08T03:59:06.499289Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.

2022-08-08T03:59:11.153973Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.

2022-08-08T03:59:13.156572Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.

2022-08-08T03:59:13.157031Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.

2022-08-08T03:59:13.286810Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060

2022-08-08T03:59:13.287237Z 0 [System] [MY-010931] [Server] C:\Program Files\mysql\bin\mysqld.exe: ready for connections. Version: '8.0.30'  socket: ''  port: 3306  MySQL Community Server - GPL.

Nếu chạy thành công, bạn mở Task Manager\Processes\ sẽ thấy tiến trình mysqld.exe đang chạy (nếu không có trong tab Processes, bạn có thể tìm trong tab Task Manager/Details).

– Bạn đã có thể kết nối (truy cập) vào MySQL server bằng lệnh. Mở thêm cửa sổ dòng lệnh mới (CMD, Command Prompt), nhập lệnh sau:

C:\Program Files\mysql\bin>mysql -u root -h localhost

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Trong đó,

– mysql: lệnh để kết nối vào MySQL server

– -u: (user) tên đăng nhập là root

– -h: (host) địa chỉ máy server là localhost

Lệnh trên bị lỗi, không kết nối được tới MySQL server, do hệ thống đã đặt mật khẩu mặc định cho user root, nhưng bạn lại không nhập mật khẩu mặc định này.

– Bạn cần lấy được mật khẩu của root trong tập tin C:\Program Files\mysql\data\ %tài khoản windows hiện tại%.err (ví dụ C:\Program Files\mysql\data\ DESKTOP-7LPDOL6.err). Mở tập tin bằng phần mềm hiển thị văn bản bất kì (ví dụ : notepad).

2022-08-08T03:50:05.403069Z 0 [System] [MY-013169] [Server] C:\Program Files\mysql\bin\mysqld.exe (mysqld 8.0.30) initializing of server in progress as process 7936

2022-08-08T03:50:06.648513Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.

2022-08-08T03:50:16.600127Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.

2022-08-08T03:50:26.735031Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: we=:uo<t*5Dl

– Bạn sẽ thấy được mật khẩu của root hiện tại (ví dụ: we=:uo<t*5Dl)

– Kết nối lại vào MySQL server với mật khẩu của root ở trên

C:\Program Files\mysql\bin>mysql -u root -h localhost -p

Enter password: ************

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 10

Server version: 8.0.30

 

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

– Vậy là bạn đã kết nối được vào MySQL server, dấu nhắc lệnh hiện tại đang là mysql>

– Bạn có thể đổi mật khẩu cho user root bằng lệnh sau:

mysql> alter user 'root'@'localhost' identified by '123456';

Query OK, 0 rows affected (0.06 sec)

 

mysql>

 

– Để ngắt (thoát khỏi) phiên kết nối, sử dụng lệnh exit

mysql> exit

Bye

 

C:\Program Files\mysql\bin>

– Kết nối lại vào MySQL server bằng mật khẩu vừa thay đổi xem có được không?

C:\Program Files\mysql\bin>mysql -u root -h localhost -p

Enter password: ******

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 12

Server version: 8.0.30 MySQL Community Server - GPL

 

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

 

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

mysql>

 

Tắt (shutdown) MySQL server

Để tắt (kết thúc) MySQL server bạn có thể sử dụng 2 cách.

Cách 1, sử dụng lệnh mysqladmin

C:\Program Files\mysql\bin>mysqladmin -u root -p shutdow

Enter password: ******

 

C:\Program Files\mysql\bin>

Ra ngoài cửa sổ Task Manager/Processes kiểm tra sẽ không thấy còn tiến trình mysqld.exe. Hoặc mở cửa sổ dòng lệnh đang chạy lệnh mysqld --console sẽ thấy thông báo MySQL server đã shutdow.

…

2022-08-08T08:04:13.945957Z 0 [System] [MY-013105] [Server] C:\Program Files\mysql\bin\mysqld.exe: Normal shutdown.

2022-08-08T08:04:16.046530Z 0 [System] [MY-010910] [Server] C:\Program Files\mysql\bin\mysqld.exe: Shutdown complete (mysqld 8.0.30)  MySQL Community Server - GPL.

 

C:\Program Files\mysql\bin>

 

Cách 2, tại cửa sổ dòng lệnh đang chạy MySQL server, bấm tổ hợp phím Ctrl + C. Ví dụ:

C:\Program Files\mysql\bin>mysqld --console

2022-08-08T08:32:41.649959Z 0 [System] [MY-010116] [Server] C:\Program Files\mysql\bin\mysqld.exe (mysqld 8.0.30) starting as process 13352

2022-08-08T08:32:41.674777Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.

2022-08-08T08:32:46.478917Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.

2022-08-08T08:32:47.637889Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.

2022-08-08T08:32:47.638357Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.

2022-08-08T08:32:47.832739Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060

2022-08-08T08:32:47.833051Z 0 [System] [MY-010931] [Server] C:\Program Files\mysql\bin\mysqld.exe: ready for connections. Version: '8.0.30'  socket: ''  port: 3306  MySQL Community Server - GPL.

2022-08-08T08:32:52.057427Z 0 [System] [MY-013105] [Server] C:\Program Files\mysql\bin\mysqld.exe: Normal shutdown.

^C

C:\Program Files\mysql\bin>2022-08-08T08:32:52.594288Z 0 [System] [MY-010910] [Server] C:\Program Files\mysql\bin\mysqld.exe: Shutdown complete (mysqld 8.0.30)  MySQL Community Server - GPL.

Chạy MySQL server dưới dạng một dịch vụ (services)

Trong một số tình huống sử dụng thực tế, bạn cần chạy MySQL server dưới dạng một dịch vụ, chứ không phải dưới dạng một chương trình như ở ví dụ trên.

Để chạy MySQL dưới dạng một dịch vụ, bạn thực hiện như sau:

C:\Program Files\mysql\bin>mysqld --install "MySQL 8.0"

Service successfully installed.

 

C:\Program Files\mysql\bin>

Nếu lệnh trên thực hiện thành công, khi bạn vào Task Manager/Processes hoặc Task Manager/Details sẽ không thấy có tiến trình MySQL. Vì nó đang chạy dưới dạng dịch vụ, nên nó sẽ có trong Task Manager/Services. Trạng thái của nó đang là stopped, bạn chuột phải vào dịch vụ MySQL 8.0 > chọn start để khởi chạy dịch vụ MySQL. Nếu thành công trạng thái của dịch vụ sẽ là running.

Tắt service MySQL

Để tắt dịch vụ MySQL, bạn sử dụng lệnh sau:

C:\Program Files\mysql\bin>mysqld --remove "MySQL 8.0"

Failed to remove the service because the service is running

Stop the service and try again

Lệnh mysqld --remove không thực hiện được, do chưa dừng dịch vụ MySQL, nên cần thực hiện lệnh stop như sau:

C:\Program Files\mysql\bin>mysqladmin -u root -p shutdow

Enter password: ******

 

C:\Program Files\mysql\bin>mysqld --remove "MySQL 8.0"

Service successfully removed.

 

C:\Program Files\mysql\bin>

Bạn có thể thực hiện các lệnh trên nhiều lần, mở cửa sổ Task Manager để quan sát kết quả. Mục đích để bạn thực sự kiểm soát được tình trạng hoạt động của MySQL server. Trước khi bạn có thể tạo dữ liệu và khai thác dữ liệu trên máy MySQL server.

1.1.3       Xem và đọc thêm

– Dùng các từ khóa sau để tìm kiếm trên mạng và đọc thêm: hệ quản trị cơ sở dữ liệu, DBMS, MySQL server

– Chu Thị Hường, Bài giảng Hệ quản trị CSDL, trang [3,4] [ebook]

– Tải, cài đặt MySQL thủ công: https://www.youtube.com/watch?v=zyW83fDBt5A

1.1.4       Bài tập và thực hành

Bài tập 1: Tải và cài đặt MySQL thủ công.

Bài tập 2: Thực hiện thuần thục các thao tác trên MySQL server: khởi tạo, chạy, kết nối, đổi mật khẩu root, ngắt kết nối, tắt chương trình MySQL, chạy và tắt MySQL server dưới dạng một dịch vụ (service)

1.1.5       Câu hỏi ôn tập

Câu 1. Một số hệ quản trị cơ sở dữ liệu gồm:

A. Excel, MongoDB, Oracle, Firebase, Neo4j

B. MySQL, Windows, Oracle, Firebase, Neo4j

C. MySQL, MongoDB, Oracle, Linux, Neo4j

D. MySQL, MongoDB, Oracle, Firebase, Neo4j

Câu 2. Trong MySQL, lệnh mysqld --install "MySQL 8.0" dùng để làm gì?

A. Cài đặt MySQL server dưới dạng một dịch vụ

B. Chạy chương trình MySQL server

C. Tải MySQL server từ trên mạng về máy tính

D. Gỡ bỏ MySQL server

Câu 3. Tham số ‘--console’ trong lệnh mysqld --console, có ý nghĩa gì?

A. Để tắt MySQL server

B. Để ngắt kết nối tới MySQL server

C. Để xuất các thông báo của lệnh mysqld ra cửa sổ dòng lệnh

D. Để chạy MySQL server

Đáp án: 1(D), 2(A), 3(C)

////// 2

-----

Cập nhật: [8/8/2022]
-----


Sử dụng máy tính () - Thay đổi kích thước ổ đĩa - không mất dữ liệu

Khi mua máy, người ta tạo ra ổ đĩa C để cài đặt hệ điều hành (ví dụ Windows 10) và các phần mềm ứng dụng. Kích thước của ổ đĩa C khoảng 70GB, ban đầu tưởng là nhiều.

Tuy nhiên, theo thời gian, do nhu cầu học và làm việc nên cần cài đặt rất nhiều phần mềm. Kết quả là ổ đĩa C luôn trong tình trạng cảnh báo sắp hết dung lượng đĩa trống.

Để giải quyết tình trạng trên, sẽ thực hiện:

1. Thu hẹp (shrink) các ổ đĩa ít dùng tới (ví dụ ổ D, E)

2. Dịch chuyển các ổ đĩa (D, E) ra phía sau, để tạo khoảng trống liền kề ổ đĩa C

3. Mở rộng ổ đĩa C

Sử dụng phần mềm miễn phí sau để thực hiện (dùng chức năng Resize/Move Partition):

IM-Magic Partition Resizer (https://www.resize-c.com/).


[Cập nhật: 6/10/2020]

Docker (2) - Chia sẻ dữ liệu giữa hệ điều hành chủ và container

 Bài trước: Docker (1) - Docker, image và container

-------

1.1       Chia sẻ dữ liệu giữa hệ điều hành chủ và container

Ý tưởng của chia sẻ dữ liệu giữa hệ điều hành chủ (host OS) và container là tạo một thư mục trong hệ điều hành chủ > chia sẻ thư mục đó > tạo một kết nối từ Docker tới thư mục chia sẻ > rồi từ container thực hiện tạo ánh xạ tới thư mục trong Docker.

Khi đã có thư mục chia sẻ, muốn chia sẻ thông tin giữa hệ điều hành chủ và container sẽ thực hiện chép thông tin vào thư mục chia sẻ.

Ví dụ:

– Trong ổ đĩa D:\ của hệ điều hành chủ, tạo thư mục dulieu, trong thư mục dulieu, tạo tập tin test.txt, trong tập tin test.txt nhập nội dung “Xin chao bac Teo”

– Chia sẻ thư mục dulieu cho everyone với quyền đầy đủ (full control)

– Bấm chuột trái vào biểu tượng docker (trên khay hệ thống – system tray) > chọn Settings > chọn Resources > chọn FILE SHARING > bấm dấu + ở khung bên phải trỏ tới D:\dulieu

– Mở PowerShell, tạo một container chứa hệ điều hành Ubuntu, có ánh xạ tới thư mục D:\dulieu

docker run –it –v <đường dẫn thư mục trên hệ điều hành chủ>:<đường dẫn thư mục ánh xạ trên container><một phần ID container>

Ví dụ:

docker run -it -v d:/dulieu:/home/dulieu 4e2

– Khi tạo được container, cửa sổ PowerShell sẽ chuyển sang dòng lệnh của container Ubuntu

– Dùng lệnh cd để chuyển qua thư mục home/dulieu, dùng lệnh ls để kiểm tra nội dung trong dulieu

– Tạo tập tin bên hệ điều hành Windows; dùng lệnh touch để tạo tập tin trong Ubuntu để kiểm tra dữ liệu xuất hiện trong thư mục chia sẻ.

1.2        Chia sẻ dữ liệu giữa các container

Ý tưởng để chia sẻ dữ liệu giữa các container, là cho các container cùng trỏ về một thư mục chia sẻ của docker.

Ví dụ:

– Tạo container đầu tiên trỏ tới thư mục chia sẻ của docker là dulieu

docker run -it -v d:/dulieu:/home/dulieu 4e2

– Tạo thêm container thứ hai trỏ tới ổ đĩa của container đầu tiên

docker run -it --name container2 --volumes-from 27d1 ubuntu:latest

– Chuyển dấu nhắc lệnh vào conatiner2 để kiểm tra thư mục dulieu

docker attach 48a

1.3       Tạo các volume cho docker

Trong docker bạn có thể tạo ra các ổ đĩa cứng logic, gọi là các volume. Các volume này có thể gắn vào các container bất kì. Khi xóa các container thì không các volume không bị ảnh hưởng (vẫn tồn tại).

Để kiểm tra các volume trên docker, sử dụng lệnh docker volume ls

Để tạo volume sử dụng lệnh: docker volume create <tên volume>

Ví dụ:

docker volume create data1

Để xem thông tin của một volume, sử dụng lệnh docker volume inspect <tên volume>

Ví dụ:

docker volume inspect data1

Kết quả là:

[

    {

        "CreatedAt": "2020-09-06T09:42:11Z",

        "Driver": "local",

        "Labels": {},

        "Mountpoint": "/var/lib/docker/volumes/data1/_data",

        "Name": "data1",

        "Options": {},

        "Scope": "local"

    }

]

Để xóa một volume, sử dụng lệnh docker volume rm <tên volume>

Ví dụ:

docker volume rm data1

1.4       Gắn volume vào container

Khi đã có các volume trên docker, để gắn volume vào container, sử dụng lệnh sau:

docker run –it --mount source=<tên volume>, target=<tên thư mục sẽ gắn tới volume> <ID của image>

Ví dụ:

docker run -it --name may3 --mount source=data1,target=/home/dulieu 4e2

1.5       Tạo volume và gắn vào thư mục của hệ điều hành chủ

Để tạo một volume và gắn vào thư mục của hệ điều hành chủ, sử dụng lệnh sau (lưu ý: thư mục trên hệ điều hành chủ phải được chia sẻ):

docker volume create --opt device=<thư mục trên hệ điều hành chủ> --opt type=none –opt o=bind <tên volume>

Ví dụ:

docker volume create --opt device=/localhost/dulieu --opt type=none --opt o=bind data2

Xem thông tin của data2:

docker volume inspect data2

Kết quả:

[

    {

        "CreatedAt": "2020-09-06T10:46:19Z",

        "Driver": "local",

        "Labels": {},

        "Mountpoint": "/var/lib/docker/volumes/data2/_data",

        "Name": "data2",

        "Options": {

            "device": "/localhost/dulieu",

            "o": "bind",

            "type": "none"

        },

        "Scope": "local"

    }

]

Để gắn volume vừa tạo vào một container, sử dụng lệnh sau:

docker run –it –v <tên volume>:<đường dẫn của thư mục đích><một phần ID của image>

Ví dụ:

docker run -it -v data3:/home/disk 4e2

docker: Error response from daemon: error while mounting volume '/var/lib/docker/volumes/data3/_data': failed to mount local volume: mount /localhost/dulieu:/var/lib/docker/volumes/data3/_data, flags: 0x1000: no such file or directory.

1.9       Luồng làm việc dựa trên Docker

Quan sát hình sau:




Khi làm việc với Docker thường gồm các công đoạn: Build, Ship và Run.
– Build: thiết lập, cài đặt môi trường phát triển
­– Ship: lưu các thiết lập ở bước Build thành image
– Run: chạy và quản lý các image ở bước Ship
Quá trình Build do các lập trình viên (developer) thực hiện. Quá trình Run do các quản trị viên tại bộ phận triển khai (IT Operation) thực hiện.

-----

Cập nhật: [1/10/2020]
-----
Xem thêm: Docker (3) -
Xem thêm: Danh sách bài học