Sao chép / sao chép cơ sở dữ liệu mà không sử dụng mysqldump


427

Không có quyền truy cập cục bộ vào máy chủ, có cách nào để sao chép / sao chép một db MySQL (có nội dung và không có nội dung) sang một máy chủ khác mà không cần sử dụng mysqldumpkhông?

Tôi hiện đang sử dụng MySQL 4.0.


12
Có chuyện gì với bạn mysqldumpvậy?
Michael Mior

48
Hãy chắc chắn rằng bạn không làm điều này: CREATE TABLE t2 SELECT * FROM t1;vì bạn sẽ mất thông tin chỉ mục của mình, bất kỳ nội dung đặc biệt nào như auto_increment, v.v. .
John Hunt

59
Một câu hỏi ngoài chủ đề được 92 lượt upvote và 37 lượt yêu thích. Thumbs up cho câu hỏi ngoài chủ đề như vậy. Hướng dẫn lỗi thời.
pal4life

25
100% đồng ý rằng "đóng như lạc đề" là sai và rằng các bang hội cần được cập nhật - cần nhiều sự khoan dung hơn - SO đang đi sai hướng. Rõ ràng là @will hoàn toàn không phù hợp và cần loại bỏ các đặc quyền của người điều hành - câu hỏi này là đủ bằng chứng.
stolsvik

10
Đóng như lạc đề là sai 100%. Đây là câu hỏi chính xác mà tôi có, và nó có một câu trả lời kỹ thuật được xác định rõ ràng không liên quan đến ý kiến ​​đơn thuần. Tôi nghĩ rằng người điều hành phải làm như vậy để tìm kiếm những từ như "tốt nhất" để tìm câu hỏi để đóng.
Sam Goldberg

Câu trả lời:


686

Tôi có thể thấy bạn nói rằng bạn không muốn sử dụng mysqldump, nhưng tôi đã truy cập trang này trong khi tìm kiếm một giải pháp tương tự và những người khác cũng có thể tìm thấy nó. Với ý nghĩ đó, đây là một cách đơn giản để sao chép cơ sở dữ liệu từ dòng lệnh của máy chủ windows:

  1. Tạo cơ sở dữ liệu đích bằng MySQLAdmin hoặc phương thức ưa thích của bạn. Trong ví dụ này, db2là cơ sở dữ liệu đích, nơi cơ sở dữ liệu nguồn db1sẽ được sao chép.
  2. Thực hiện câu lệnh sau trên một dòng lệnh:

mysqldump -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2

Lưu ý: KHÔNG có khoảng cách giữa -p[password]


108
Trường hợp chống lại mysqldump là phải có một cách nhanh hơn sau đó tuần tự hóa dữ liệu thành các truy vấn, truyền các truy vấn bên ngoài quy trình và thông qua tty trở lại quy trình chính xác , lặp lại các truy vấn và thực hiện chúng dưới dạng các câu lệnh. Điều đó nghe có vẻ không hiệu quả và không cần thiết . Chúng ta không nói về việc vượt qua giữa các bậc thầy MySQL hoặc thay đổi công cụ lưu trữ. Thật sốc khi không có chuyển nhị phân nội bộ hiệu quả.
Toddius Zho

42
Nếu bạn không muốn lưu bản rõ mật khẩu trong lịch sử thiết bị đầu cuối của mình, bạn cần tách lệnh : mysqldump -h [server] -u [user] -p db1 > db1, mysql -h [server] -u [user] -p db2 < db1 Nếu không , dấu nhắc mật khẩu sẽ làm rối nó, ít nhất là đối với tôi khi sử dụng putty.
kapex

5
sử dụng mysqldump và mysql từ bash trở nên đơn giản hơn nhiều nếu bạn thiết lập tệp .my.cnf để lưu trữ tệp người dùng / máy chủ / mật khẩu của bạn
ErichBSchulz

4
mysqldump -u root -p -v db1 | mysql -u root -p db2và hai lần nhập pass
hlcs

6
Chúa ơi, xin vui lòng ai đó giải thích lý do tại sao một câu hỏi nêu "không có mysqldump" có câu trả lời đầu tiên sử dụng mysqldump không? với số lượt thích, nhiều hơn 6 lần so với số phiếu đúng ? xin chào, SO ...
igorsantos07

135

Bạn có thể nhân đôi một bảng mà không có dữ liệu bằng cách chạy:

CREATE TABLE x LIKE y;

(Xem Tài liệu TẠO TẠO MySQL )

Bạn có thể viết một tập lệnh lấy đầu ra SHOW TABLEStừ một cơ sở dữ liệu và sao chép lược đồ sang cơ sở dữ liệu khác. Bạn sẽ có thể tham chiếu lược đồ + tên bảng như:

CREATE TABLE x LIKE other_db.y;

Theo như dữ liệu, bạn cũng có thể làm điều đó trong MySQL, nhưng nó không nhất thiết phải nhanh. Sau khi bạn đã tạo các tài liệu tham khảo, bạn có thể chạy các mục sau để sao chép dữ liệu:

INSERT INTO x SELECT * FROM other_db.y;

Nếu bạn đang sử dụng MyISAM, bạn nên sao chép các tệp bảng; nó sẽ nhanh hơn nhiều Bạn sẽ có thể làm tương tự nếu bạn đang sử dụng INNODB với mỗi không gian bảng .

Nếu bạn cuối cùng làm một INSERT INTO SELECT, hãy chắc chắn tạm thời tắt chỉ mục với ALTER TABLE x DISABLE KEYS!

EDIT Maatkit cũng có một số tập lệnh có thể hữu ích cho việc đồng bộ hóa dữ liệu. Nó có thể không nhanh hơn, nhưng bạn có thể có thể chạy các kịch bản đồng bộ hóa của họ trên dữ liệu trực tiếp mà không bị khóa nhiều.


1
công việc này cho bảng trùng lặp? kể từ khi tôi thấy lệnh là CREATE TABLE
GusDeCooL

4
Bạn có thể làm CREATE TABLE ... SELECT.
eggyal

3
Tôi đã thử sao chép các tệp bảng của cơ sở dữ liệu MyISAM một lần, nhưng điều đó chỉ làm hỏng cơ sở dữ liệu mới. Có lẽ là xấu của tôi, nhưng nó chắc chắn không phải là một hoạt động tầm thường như một số người nói nó là.
Johan Fredrik Varen

2
Đây là một mẹo hay và tôi là một người hâm mộ, nhưng một lưu ý quan trọng: điều này không mang theo bất kỳ ràng buộc khóa ngoại nào (ngay cả những ràng buộc bên ngoài lược đồ đang được sao chép) trên Tài liệu MySQL
abigperson

59

Nếu bạn đang sử dụng Linux, bạn có thể sử dụng tập lệnh bash này: (có lẽ nó cần thêm một số mã làm sạch nhưng nó hoạt động ... và nó nhanh hơn nhiều so với mysqldump | mysql)

#!/bin/bash

DBUSER=user
DBPASSWORD=pwd
DBSNAME=sourceDb
DBNAME=destinationDb
DBSERVER=db.example.com

fCreateTable=""
fInsertData=""
echo "Copying database ... (may take a while ...)"
DBCONN="-h ${DBSERVER} -u ${DBUSER} --password=${DBPASSWORD}"
echo "DROP DATABASE IF EXISTS ${DBNAME}" | mysql ${DBCONN}
echo "CREATE DATABASE ${DBNAME}" | mysql ${DBCONN}
for TABLE in `echo "SHOW TABLES" | mysql $DBCONN $DBSNAME | tail -n +2`; do
        createTable=`echo "SHOW CREATE TABLE ${TABLE}"|mysql -B -r $DBCONN $DBSNAME|tail -n +2|cut -f 2-`
        fCreateTable="${fCreateTable} ; ${createTable}"
        insertData="INSERT INTO ${DBNAME}.${TABLE} SELECT * FROM ${DBSNAME}.${TABLE}"
        fInsertData="${fInsertData} ; ${insertData}"
done;
echo "$fCreateTable ; $fInsertData" | mysql $DBCONN $DBNAME

7
Nếu bạn đang sử dụng các kịch bản ở trên với các bảng InnoDB và có phím nước ngoài, thay đổi dòng cuối cùng để những điều sau đây:echo "set foreign_key_checks = 0; $fCreateTable ; $fInsertData ; set foreign_key_checks = 1;" | mysql $DBCONN $DBNAME
pegli

Điều này cũng sao chép dữ liệu ràng buộc và các thuộc tính khác của bảng?
Lucas Moeskops

1
Có vẻ như vậy, bởi vì anh ta sử dụng câu lệnh "SHOW CREATE TABLE" để tạo ra một BẢNG TẠO với tất cả các thuộc tính của bản gốc.
Danita

1
Nếu bạn gặp vấn đề @zirael mô tả thì có lẽ là do tập lệnh không sao chép được lượt xem. Bạn có thể bỏ qua lượt xem từ bản sao bằng cách thay đổi SHOW TABLESdòng thành SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'và thêm | cut -f 1. Dòng hoàn chỉnh sẽ trông giống như thế này nhưng thay thế backticks đôi bằng backticks duy nhất: for TABLE in ``echo "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" | mysql $DBCONN $DBSNAME | tail -n +2 | cut -f 1``; do
Code Commander

1
Tôi đã làm sạch lên kịch bản này bằng cách @jozjan và áp dụng một số các yêu cầu liên quan phím nước ngoài và khác để tạo ra phiên bản này trên GIST gist.github.com/christopher-hopper/8431737
Christopher

11

Trong PHP:

function cloneDatabase($dbName, $newDbName){
    global $admin;
    $db_check = @mysql_select_db ( $dbName );
    $getTables  =   $admin->query("SHOW TABLES");   
    $tables =   array();
    while($row = mysql_fetch_row($getTables)){
        $tables[]   =   $row[0];
    }
    $createTable    =   mysql_query("CREATE DATABASE `$newDbName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;") or die(mysql_error());
    foreach($tables as $cTable){
        $db_check   =   @mysql_select_db ( $newDbName );
        $create     =   $admin->query("CREATE TABLE $cTable LIKE ".$dbName.".".$cTable);
        if(!$create) {
            $error  =   true;
        }
        $insert     =   $admin->query("INSERT INTO $cTable SELECT * FROM ".$dbName.".".$cTable);
    }
    return !isset($error);
}


// usage
$clone  = cloneDatabase('dbname','newdbname');  // first: toCopy, second: new database

Nếu bạn đang làm việc trên cửa sổ máy. Sau đó, vui lòng sử dụng này thay vì tìm cách kéo dài để thực hiện lệnh.
Parixit

tập lệnh này không có số lượt xem
sd1sd1

4

Lưu ý rằng có một lệnh mysqldbcopy như là một phần của tiện ích bổ sung trên mysql .... https://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html


Nhưng nó yêu cầu cài đặt một gói phần mềm bổ sung:apt install mysql-utilities
Joel G Mathew

2
Nhưng không có giới hạn nào nói rằng điều đó là không thể .... và đó là một thứ thường được cài đặt (nhưng không bắt buộc như bạn nói) Nếu nó không được cài đặt, nhiều người sẽ thấy việc cài đặt gói đó dễ dàng hơn là thiết lập và chạy tập lệnh Bash 60 dòng , vv ....
furicle

Bài đăng của bạn có thể đã được bỏ phiếu vì bạn không bao gồm bất kỳ thông tin nào khác ngoài liên kết. Câu trả lời được cho là toàn diện hơn.
Joel G Mathew

1

Tôi thực sự không biết ý của bạn là "truy cập địa phương". Nhưng đối với giải pháp đó, bạn cần có khả năng truy cập qua ssh máy chủ để sao chép các tệp được lưu trữ cơ sở dữ liệu .

Tôi không thể sử dụng mysqldump, vì cơ sở dữ liệu của tôi lớn (7Go, mysqldump không thành công) Nếu phiên bản của cơ sở dữ liệu 2 mysql quá khác nhau, nó có thể không hoạt động, bạn có thể kiểm tra phiên bản mysql của mình bằng mysql -V.

1) Sao chép dữ liệu từ máy chủ từ xa sang máy tính cục bộ của bạn (vps là bí danh cho máy chủ từ xa của bạn, có thể được thay thế bằng root@1.2.3.4)

ssh vps:/etc/init.d/mysql stop
scp -rC vps:/var/lib/mysql/ /tmp/var_lib_mysql
ssh vps:/etc/init.d/apache2 start

2) Nhập dữ liệu được sao chép trên máy tính cục bộ của bạn

/etc/init.d/mysql stop
sudo chown -R mysql:mysql /tmp/var_lib_mysql
sudo nano /etc/mysql/my.cnf
-> [mysqld]
-> datadir=/tmp/var_lib_mysql
/etc/init.d/mysql start

Nếu bạn có một phiên bản khác nhau, bạn có thể cần phải chạy

/etc/init.d/mysql stop
mysql_upgrade -u root -pPASSWORD --force #that step took almost 1hrs
/etc/init.d/mysql start

Đây là cách hiệu quả nhất để làm điều đó nhưng tôi nghĩ rằng "không có quyền truy cập cục bộ vào máy chủ" có nghĩa là chúng ta không thể truy cập vào hệ thống. Có lẽ là một lưu trữ chia sẻ? Vì vậy, đây không phải là câu trả lời.
Valerio Bozz

1

Tất cả các giải pháp trước khi có được tại thời điểm một chút, tuy nhiên, họ chỉ không sao chép tất cả mọi thứ kết thúc. Tôi tạo ra một hàm PHP (mặc dù hơi dài dòng) cho phép sao chép tất cả mọi thứ bao gồm cả bảng biểu, khóa ngoài, dữ liệu, quan điểm, thủ tục, chức năng, gây nên, và các sự kiện. Đây là mã:

/* This function takes the database connection, an existing database, and the new database and duplicates everything in the new database. */
function copyDatabase($c, $oldDB, $newDB) {

    // creates the schema if it does not exist
    $schema = "CREATE SCHEMA IF NOT EXISTS {$newDB};";
    mysqli_query($c, $schema);

    // selects the new schema
    mysqli_select_db($c, $newDB);

    // gets all tables in the old schema
    $tables = "SELECT table_name
               FROM information_schema.tables
               WHERE table_schema = '{$oldDB}'
               AND table_type = 'BASE TABLE'";
    $results = mysqli_query($c, $tables);

    // checks if any tables were returned and recreates them in the new schema, adds the foreign keys, and inserts the associated data
    if (mysqli_num_rows($results) > 0) {

        // recreates all tables first
        while ($row = mysqli_fetch_array($results)) {
            $table = "CREATE TABLE {$newDB}.{$row[0]} LIKE {$oldDB}.{$row[0]}";
            mysqli_query($c, $table);
        }

        // resets the results to loop through again
        mysqli_data_seek($results, 0);

        // loops through each table to add foreign key and insert data
        while ($row = mysqli_fetch_array($results)) {

            // inserts the data into each table
            $data = "INSERT IGNORE INTO {$newDB}.{$row[0]} SELECT * FROM {$oldDB}.{$row[0]}";
            mysqli_query($c, $data);

            // gets all foreign keys for a particular table in the old schema
            $fks = "SELECT constraint_name, column_name, table_name, referenced_table_name, referenced_column_name
                    FROM information_schema.key_column_usage
                    WHERE referenced_table_name IS NOT NULL
                    AND table_schema = '{$oldDB}'
                    AND table_name = '{$row[0]}'";
            $fkResults = mysqli_query($c, $fks);

            // checks if any foreign keys were returned and recreates them in the new schema
            // Note: ON UPDATE and ON DELETE are not pulled from the original so you would have to change this to your liking
            if (mysqli_num_rows($fkResults) > 0) {
                while ($fkRow = mysqli_fetch_array($fkResults)) {
                    $fkQuery = "ALTER TABLE {$newDB}.{$row[0]}                              
                                ADD CONSTRAINT {$fkRow[0]}
                                FOREIGN KEY ({$fkRow[1]}) REFERENCES {$newDB}.{$fkRow[3]}({$fkRow[1]})
                                ON UPDATE CASCADE
                                ON DELETE CASCADE;";
                    mysqli_query($c, $fkQuery);
                }
            }
        }   
    }

    // gets all views in the old schema
    $views = "SHOW FULL TABLES IN {$oldDB} WHERE table_type LIKE 'VIEW'";                
    $results = mysqli_query($c, $views);

    // checks if any views were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $view = "SHOW CREATE VIEW {$oldDB}.{$row[0]}";
            $viewResults = mysqli_query($c, $view);
            $viewRow = mysqli_fetch_array($viewResults);
            mysqli_query($c, preg_replace("/CREATE(.*?)VIEW/", "CREATE VIEW", str_replace($oldDB, $newDB, $viewRow[1])));
        }
    }

    // gets all triggers in the old schema
    $triggers = "SELECT trigger_name, action_timing, event_manipulation, event_object_table, created
                 FROM information_schema.triggers
                 WHERE trigger_schema = '{$oldDB}'";                 
    $results = mysqli_query($c, $triggers);

    // checks if any triggers were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $trigger = "SHOW CREATE TRIGGER {$oldDB}.{$row[0]}";
            $triggerResults = mysqli_query($c, $trigger);
            $triggerRow = mysqli_fetch_array($triggerResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $triggerRow[2]));
        }
    }

    // gets all procedures in the old schema
    $procedures = "SHOW PROCEDURE STATUS WHERE db = '{$oldDB}'";
    $results = mysqli_query($c, $procedures);

    // checks if any procedures were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $procedure = "SHOW CREATE PROCEDURE {$oldDB}.{$row[1]}";
            $procedureResults = mysqli_query($c, $procedure);
            $procedureRow = mysqli_fetch_array($procedureResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $procedureRow[2]));
        }
    }

    // gets all functions in the old schema
    $functions = "SHOW FUNCTION STATUS WHERE db = '{$oldDB}'";
    $results = mysqli_query($c, $functions);

    // checks if any functions were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $function = "SHOW CREATE FUNCTION {$oldDB}.{$row[1]}";
            $functionResults = mysqli_query($c, $function);
            $functionRow = mysqli_fetch_array($functionResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $functionRow[2]));
        }
    }

    // selects the old schema (a must for copying events)
    mysqli_select_db($c, $oldDB);

    // gets all events in the old schema
    $query = "SHOW EVENTS
              WHERE db = '{$oldDB}';";
    $results = mysqli_query($c, $query);

    // selects the new schema again
    mysqli_select_db($c, $newDB);

    // checks if any events were returned and recreates them in the new schema
    if (mysqli_num_rows($results) > 0) {
        while ($row = mysqli_fetch_array($results)) {
            $event = "SHOW CREATE EVENT {$oldDB}.{$row[1]}";
            $eventResults = mysqli_query($c, $event);
            $eventRow = mysqli_fetch_array($eventResults);
            mysqli_query($c, str_replace($oldDB, $newDB, $eventRow[3]));
        }
    }
}

Bị từ chối vì câu hỏi không phải là "không sử dụng mysqldump" mà là "sử dụng cách tiếp cận tốt hơn mysqldump". Điều này thậm chí còn tồi tệ hơn mysqldumpvề hiệu quả.
Valerio Bozz

1

Trên thực tế tôi muốn đạt được chính xác điều đó trong PHP nhưng không có câu trả lời nào ở đây rất hữu ích vì vậy đây là giải pháp - khá đơn giản của tôi khi sử dụng MySQLi:

// Database variables

$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '1234';

$DB_SRC = 'existing_db';
$DB_DST = 'newly_created_db';



// MYSQL Connect

$mysqli = new mysqli( $DB_HOST, $DB_USER, $DB_PASS ) or die( $mysqli->error );



// Create destination database

$mysqli->query( "CREATE DATABASE $DB_DST" ) or die( $mysqli->error );



// Iterate through tables of source database

$tables = $mysqli->query( "SHOW TABLES FROM $DB_SRC" ) or die( $mysqli->error );

while( $table = $tables->fetch_array() ): $TABLE = $table[0];


    // Copy table and contents in destination database

    $mysqli->query( "CREATE TABLE $DB_DST.$TABLE LIKE $DB_SRC.$TABLE" ) or die( $mysqli->error );
    $mysqli->query( "INSERT INTO $DB_DST.$TABLE SELECT * FROM $DB_SRC.$TABLE" ) or die( $mysqli->error );


endwhile;

Tôi không chắc rằng tihis tạo bản sao 1: 1 nhưng có vẻ như đối với các cơ sở dữ liệu đơn giản có thể là đủ.
beppe9000

Tôi đang sử dụng để tạo cài đặt WordPress nhanh trên máy chủ phát triển của mình. Phần này được ghép nối với một số thói quen khác trùng lặp và điều chỉnh cài đặt nguồn vào một dự án mới. Vì nó hoạt động tốt, nhưng cơ sở dữ liệu wordpress trống không phức tạp lắm nên tôi không thể đưa ra tuyên bố cho các trường hợp sử dụng mở rộng hơn
GDY

0

Cách tốt nhất để sao chép các bảng cơ sở dữ liệu mà không cần mysqldump:

  1. Create a new database.
  2. Tạo truy vấn clone với truy vấn:

    SET @NewSchema = 'your_new_db';
    SET @OldSchema = 'your_exists_db';
    SELECT CONCAT('CREATE TABLE ',@NewSchema,'.',table_name, ' LIKE ', TABLE_SCHEMA ,'.',table_name,';INSERT INTO ',@NewSchema,'.',table_name,' SELECT * FROM ', TABLE_SCHEMA ,'.',table_name,';') 
    FROM information_schema.TABLES where TABLE_SCHEMA = @OldSchema AND TABLE_TYPE != 'VIEW';
  3. Chạy đầu ra đó!

Nhưng lưu ý, tập lệnh ở trên chỉ là các bảng sao chép nhanh - không phải dạng xem, kích hoạt và chức năng người dùng: bạn có thể nhanh chóng có được cấu trúc bằng cách mysqldump --no-data --triggers -uroot -ppassword, sau đó sử dụng để sao chép chỉ câu lệnh chèn.

Tại sao nó là câu hỏi thực tế? Bởi vì việc tải lên mysqldumps chậm một cách xấu xí nếu DB trên 2Gb. Và bạn không thể sao chép các bảng InnoDB chỉ bằng cách sao chép các tệp DB (như sao lưu ảnh chụp nhanh).


0

một SQL hiển thị các lệnh SQL, cần phải chạy để sao chép cơ sở dữ liệu từ cơ sở dữ liệu này sang cơ sở dữ liệu khác. đối với mỗi bảng có tạo một câu lệnh bảng và một câu lệnh chèn. nó giả sử cả hai cơ sở dữ liệu trên cùng một máy chủ:

select @fromdb:="crm";
select @todb:="crmen";

SET group_concat_max_len=100000000;


SELECT  GROUP_CONCAT( concat("CREATE TABLE `",@todb,"`.`",table_name,"` LIKE `",@fromdb,"`.`",table_name,"`;\n",
"INSERT INTO `",@todb,"`.`",table_name,"` SELECT * FROM `",@fromdb,"`.`",table_name,"`;") 

SEPARATOR '\n\n')

as sqlstatement
 FROM information_schema.tables where table_schema=@fromdb and TABLE_TYPE='BASE TABLE';

-1

Mysqldump không phải là giải pháp tồi. Cách đơn giản nhất để sao chép cơ sở dữ liệu:

mysqldump -uusername -ppass dbname1 | mysql -uusername -ppass dbname2

Ngoài ra, bạn có thể thay đổi công cụ lưu trữ bằng cách này:

mysqldump -uusername -ppass dbname1 | sed 's/InnoDB/RocksDB/' | mysql -uusername -ppass dbname2

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.