शनिवार, 24 फ़रवरी 2024

मारियाडीबी एन्क्रिप्शन (डेटा आराम पर)

मारियाडीबी एन्क्रिप्शन के लिए कुछ विकल्प दिखाने वाला एक सरल उदाहरण नीचे दिया गया है। 

आपको यह विचार करना होगा कि आप क्या एन्क्रिप्ट करना चाहते हैं। डेटा का संचार (पारगमन में डेटा) या उदाहरण में डेटा (बाकी पर डेटा)। 

यह पोस्ट अमेज़ॅन लिनक्स पर चलने वाले AWS फ्री टियर नोड का उपयोग करके डेटा एट रेस्ट विकल्प पर केंद्रित होगी। मैं एन्क्रिप्शन के साथ वर्तमान तालिकाओं को अद्यतन करने के साथ-साथ नई लोड तालिकाओं को दिखाने के लिए 2 अलग-अलग उदाहरणों पर वैश्विक डेटाबेस का उपयोग करूंगा जो स्वचालित रूप से एन्क्रिप्ट की जाएंगी। 


सबसे पहले, हम इंस्टालेशन के साथ शुरुआत करेंगे...सिर्फ इस डेमो के लिए त्वरित और आसान। 


# yum -y install mariadb105-server
# vi /etc/my.cnf.d/mariadb-server.cnf
# cat  /etc/my.cnf.d/mariadb-server.cnf | grep server_id 
server_id=100

# cat  /etc/my.cnf.d/mariadb-server.cnf | grep server_id
server_id=200
# systemctl start mariadb.service
# mysql
MariaDB [(none)]> status
--------------
mysql  Ver 15.1 Distrib 10.5.23-MariaDB, for Linux (x86_64) using  EditLine wrapper
Connection id: 3
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.5.23-MariaDB MariaDB Server
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db     characterset: latin1
Client characterset: utf8
Conn.  characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 27 sec
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+


हम वैश्विक डेटाबेस को उदाहरण सर्वर_आईडी 100 पर लोड करेंगे। 


# mysql < world.sql
# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.5.23-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| world              |
+--------------------+
4 rows in set (0.000 sec)
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.000 sec)  


अब हम देख सकते हैं कि दोनों उदाहरण वर्तमान में एन्क्रिप्शन का उपयोग नहीं कर रहे हैं। 


MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
Empty set (0.000 sec)

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
Empty set (0.000 sec)


अब दोनों प्रणालियों पर मैं यादृच्छिक कुंजियाँ स्थापित करूँगा और उन्हें एन्क्रिप्ट करूँगा। 


#  mkdir /etc/mysql/

#  mkdir /etc/mysql/encryption/
# (echo -n "1;" ; openssl rand -hex 32 ) | sudo tee -a  /etc/mysql/encryption/keyfile
# (echo -n "2;" ; openssl rand -hex 32 ) | sudo tee -a  /etc/mysql/encryption/keyfile
#  (echo -n "100;" ; openssl rand -hex 32 ) | sudo tee -a  /etc/mysql/encryption/keyfile

# cat /etc/mysql/encryption/keyfile
1;466139b487d5735b536a10502b0607d2b96dfa58a7f95ce4847d98ef585af8b5
2;a0f533c2e459dc64e0aeb1f0f8c9dfb496571e71001ca60fac35c8bbc6361096
100;4b4bfd61af39d57e068385cf1a023bdfc5972ed414a24167067ca5256fc314e6

# cat /etc/mysql/encryption/keyfile
1;f8b1b250d3bf7159e2abd15be146367415a80d3781bbcf7d96b26640d7efdc8a
2;c7eaccedd0ef561f0c08d461abfd651947230b08c71aec67c6064bbedb6408ec
100;90475521b6eb6be3c1ec02770f3e8f80b34130f37d25c89b51cf10ec6a7c5bb6

openssl rand -hex 128 > /etc/mysql/encryption/keyfile.key
openssl enc -aes-256-cbc -md sha1    -pass file:/etc/mysql/encryption/keyfile.key    -in /etc/mysql/encryption/keyfile    -out /etc/mysql/encryption/keyfile.enc

 ls -ltr /etc/mysql/encryption/
total 12
-rw-r--r--. 1 root root 203 Feb 24 23:39 keyfile
-rw-r--r--. 1 root root 257 Feb 24 23:40 keyfile.key
-rw-r--r--. 1 root root 224 Feb 24 23:41 keyfile.enc


अब हम प्लगइन के साथ-साथ एन्क्रिप्शन के विकल्पो ं को सक्षम करने के लिए सीएनएफ फ़ाइल सेट कर सकते ह ैं। 


# vi /etc/my.cnf.d/mariadb-server.cnf
[mariadb]
## File Key Management
plugin_load_add = file_key_management
loose_file_key_management_filename = /etc/mysql/encryption/keyfile
loose_file_key_management_filename = /etc/mysql/encryption/keyfile.enc
loose_file_key_management_filekey = FILE:/etc/mysql/encryption/keyfile.key
loose_file_key_management_encryption_algorithm = AES_CBC

## InnoDB/XtraDB Encryption Setup
innodb_encrypt_log = ON
innodb_encrypt_temporary_tables=ON
innodb_encryption_threads=4
innodb_encrypt_tables=ON
innodb_default_encryption_key_id=1

## Aria Encryption Setup
aria_encrypt_tables = ON

## Temp & Log Encryption
encrypt-tmp-disk-tables = 1
encrypt-tmp-files = 1
encrypt_binlog = ON

Restart MariaDB so we can check on the current status. 

systemctl restart mariadb.service
mysql
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
+----------------------------+-------------------+----------------+
| NAME                       | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------------------------+-------------------+----------------+
| innodb_system              |                 1 |              1 |
| mysql/innodb_table_stats   |                 1 |              1 |
| mysql/innodb_index_stats   |                 1 |              1 |
| mysql/transaction_registry |                 1 |              1 |
| mysql/gtid_slave_pos       |                 1 |              1 |
| world/city                 |                 1 |              1 |
| world/country              |                 1 |              1 |
| world/countrylanguage      |                 1 |              1 |
+----------------------------+-------------------+----------------+
8 rows in set (0.000 sec)

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
+----------------------------+-------------------+----------------+
| NAME                       | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------------------------+-------------------+----------------+
| innodb_system              |                 1 |              1 |
| mysql/innodb_index_stats   |                 1 |              1 |
| mysql/gtid_slave_pos       |                 1 |              1 |
| mysql/innodb_table_stats   |                 1 |              1 |
| mysql/transaction_registry |                 1 |              1 |
+----------------------------+-------------------+----------------+
5 rows in set (0.000 sec)


साथ ही विश्व डेटा को इंस्टेंस सर्वर_आईडी 200 पर अपलोड करें। 


# mysql < world.sql
# mysql 
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT NAME, ENCRYPTION_SCHEME, CURRENT_KEY_ID FROM information_schema.INNODB_TABLESPACES_ENCRYPTION ;
+----------------------------+-------------------+----------------+
| NAME                       | ENCRYPTION_SCHEME | CURRENT_KEY_ID |
+----------------------------+-------------------+----------------+
| innodb_system              |                 1 |              1 |
| mysql/innodb_index_stats   |                 1 |              1 |
| mysql/gtid_slave_pos       |                 1 |              1 |
| mysql/innodb_table_stats   |                 1 |              1 |
| mysql/transaction_registry |                 1 |              1 |
| world/city                 |                 1 |              1 |
| world/country              |                 1 |              1 |
| world/countrylanguage      |                 1 |              1 |
+----------------------------+-------------------+----------------+
8 rows in set (0.000 sec)


Information_schema.INNODB_TABLESPACES_ENCRYPTION के अनुसार अब हम एन्क्रिप्टेड हैं। हालाँकि, वे इसे स्कीमा स्तर पर नहीं दिखाते हैं। हालांकि वे कहते हैं कि यदि यह  INNODB_TABLESPACES_ENCRYPTION तालिका में दिखाई देता है तो यह एन्क्रिप्टेड है, मैं आश्वस्त होना पसंद करता हूं और इसे तालिका और स्कीमा में देखना पसंद करता हूं। 


MariaDB [(none)]> show create table world.city\G
*************************** 1. row ***************************
       Table: city
Create Table: CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.001 sec)


इस बिंदु तक, आप देख सकते हैं कि  स्कीमा और डेटा के पुनरारंभ या लोड होने के बाद दोनों उदाहरणों को INNODB_TABLESPACES_ENCRYPTION स्कीमा में शामिल किया गया है। 

तो...तालिका में कुछ संशोधनों से यहां मदद मिलेगी... 


MariaDB [world]> ALTER TABLE city ENCRYPTED=Yes  ENCRYPTION_KEY_ID=1;
Query OK, 0 rows affected (0.074 sec)
Records: 0  Duplicates: 0  Warnings: 0
MariaDB [world]> ALTER TABLE country ENCRYPTED=Yes  ENCRYPTION_KEY_ID=1;
Query OK, 0 rows affected (0.031 sec)
Records: 0  Duplicates: 0  Warnings: 0
MariaDB [world]> ALTER TABLE countrylanguage  ENCRYPTED=Yes  ENCRYPTION_KEY_ID=1;
Query OK, 0 rows affected (0.033 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [world]> show create table city\G
*************************** 1. row ***************************
       Table: city
Create Table: CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci `ENCRYPTED`=Yes `ENCRYPTION_KEY_ID`=1
1 row in set (0.000 sec)


यह सरल है आदि। अब तक... अब हमें बिनलॉग सक्षम करने और और अधिक जांचने की आवश्यकता है। 

vi /etc/my.cnf.d/mariadb-server.cnf
log_bin=demo

cat /etc/my.cnf.d/mariadb-server.cnf | grep log_bin
log_bin=demo

# systemctl restart mariadb.service

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         100 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> show master status\G
*************************** 1. row ***************************
            File: demo.000001
        Position: 363
    Binlog_Do_DB:
Binlog_Ignore_DB:

MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|         200 |
+-------------+
1 row in set (0.000 sec)

MariaDB [(none)]> show master status\G
*************************** 1. row ***************************
            File: demo.000001
        Position: 363
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.000 sec)


बिनलॉग्स पर एक नजर डालकर जांच की जा रही है.... 


mariadb-binlog--base64-output=DECODE-ROWS --verbose  demo.000001

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;

/*!40019 SET @@session.max_insert_delayed_threads=0*/;

/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;

DELIMITER /*!*/;

# at 4

#240225  0:06:06 server id 100  end_log_pos 256 CRC32 0x04ce3741  Start: binlog v 4, server v 10.5.23-MariaDB-log created 240225  0:06:06 at startup

# Warning: this binlog is either in use or was not closed properly.

ROLLBACK/*!*/;

# at 256

# Encryption scheme: 1, key_version: 1, nonce: eb7991b210f3f4d2f7f21537

# The rest of the binlog is encrypted!

ERROR: Error in Log_event::read_log_event(): 'Event decryption failure', data_len: 2400465656, event_type: 240

DELIMITER ;

# End of log file

ROLLBACK /* added by mysqlbinlog */;

/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;


यह देखकर अच्छा लगा कि यह अब एन्क्रिप्ट किया जा रहा है। 


MariaDB [world]> create table city2 like city;
Query OK, 0 rows affected (0.013 sec)

MariaDB [world]> insert into city2 select * from city;
Query OK, 4079 rows affected (0.078 sec)
Records: 4079  Duplicates: 0  Warnings: 0

MariaDB [world]> show create table city2\G
*************************** 1. row ***************************
       Table: city2
Create Table: CREATE TABLE `city2` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci `ENCRYPTED`=Yes `ENCRYPTION_KEY_ID`=1
1 row in set (0.000 sec)


हालाँकि मैं इन लेन-देन को बिनलॉग में देखना चाहत ा हूँ.. कैसे? लॉग में डेटा देखने में सक्षम होने के लिए आप --read-from-remote-server के साथ mariadb_binlog का उपयोग कर सकते हैं...


mariadb-binlog  --base64-output=DECODE-ROWS --verbose --read-from-remote-server   demo.000001 | more
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#240225  0:06:06 server id 100  end_log_pos 256 CRC32 0x04ce3741  Start: binlog v 4, server v 10.5.23-MariaDB-log created 240225  0:06:06 at startup
ROLLBACK/*!*/;
# at 256
#240225  0:06:06 server id 100  end_log_pos 296 CRC32 0x0c89f3bb  Ignorable
# Ignorable event type 164 (Start_encryption)
# at 296
#240225  0:06:06 server id 100  end_log_pos 325 CRC32 0x535776a2  Gtid list []
# at 325
#240225  0:06:06 server id 100  end_log_pos 363 CRC32 0x2ac4a61b  Binlog checkpoint demo.000001
# at 363
#240225  0:09:40 server id 100  end_log_pos 405 CRC32 0x93e10dc4  GTID 0-100-1 ddl
/*!100101 SET @@session.skip_parallel_replication=0*//*!*/;
/*!100001 SET @@session.gtid_domain_id=0*//*!*/;
/*!100001 SET @@session.server_id=100*//*!*/;
/*!100001 SET @@session.gtid_seq_no=1*//*!*/;
# at 405
#240225  0:09:40 server id 100  end_log_pos 501 CRC32 0x39269040  Query thread_id=5 exec_time=0 error_code=0
use `world`/*!*/;
SET TIMESTAMP=1708819780/*!*/;
SET @@session.pseudo_thread_id=5/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1, @@session.sql_if_exists=0, @@session.explicit_defaults_
for_timestamp=0/*!*/;
SET @@session.sql_mode=1411383296/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=utf8,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create table city2 like city
/*!*/;
# at 501
#240225  0:09:49 server id 100  end_log_pos 543 CRC32 0xde82b753  GTID 0-100-2 trans
/*!100001 SET @@session.gtid_seq_no=2*//*!*/;
START TRANSACTION
/*!*/;
# at 543
# at 602
#240225  0:09:49 server id 100  end_log_pos 602 CRC32 0x05bbb9e6  Annotate_rows:
#Q> insert into city2 select * from city
#240225  0:09:49 server id 100  end_log_pos 661 CRC32 0x9e0b4e0d  Table_map: `world`.`city2` mapped to number 21
# at 661


उम्मीद है कि यह कम से कम आपको आरंभ करने में मदद कर सकता है... 


संसाधन :

https://mariadb.com/kb/en/securing-mariadb-encryption/  

गुरुवार, 12 नवंबर 2020

स्कीमा पाने के लिए अपनी FRM फ़ाइल का उपयोग करना और फिर आईडीबी फ़ाइलों को दोबारा करना ..

 यह एक ऐसा विषय है जो कुल मिलाकर आपको कभी नहीं करना चाहिए ... क्यों? क्योंकि आपने बैकअप सही बनाया है ... आपने परीक्षण किया है और बैकअप का काम जानते हैं इसलिए आप बस उन बैकअप को सुरक्षित कर सकते हैं और अपना खोया हुआ स्कीमा और संबंधित डेटा प्राप्त कर सकते हैं ... 

हालाँकि उस कोने के कार्यालय में एक उदाहरण .. आपको स्थापित करने के लिए कभी नहीं मिला .. यह महत्वपूर्ण नहीं है ... बस दुर्घटनाग्रस्त हो गया है और अब आपको एहसास हुआ कि आप वास्तव में इसका उपयोग कैसे करते हैं ... 

सब कुछ खोया नहीं है ।।  

MySQL ने अपनी MySQL उपयोग सूची को थोड़ा देर बाद जारी किया और चूंकि MySQL शेल के साथ इसे और अधिक बदल दिया गया।  

mysqlfrm अभी भी बहुत आसान है, जब एक त्वरित और सरलैंड में FRM फ़ाइल से स्कीमा को बाहर निकालने की आवश्यकता होती है और यह एक साधारण इंस्टॉल है। 

mysqlfrm --diagnostic city.frm
# WARNING: Cannot generate character set or collation names without the --server option. # CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for city.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement:

CREATE TABLE `city` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(160) DEFAULT NULL,
  `CountryCode` char(12) NOT NULL,
  `District` char(80) NOT NULL,
  `Population` int(11) NOT NULL,
PRIMARY KEY `PRIMARY` (`ID`),
KEY `CountryCode` (`CountryCode`),
KEY `popkey` (`Population`)
) ENGINE=InnoDB;

#...done.


इसलिए अब आपके पास जो स्कीमा है वह आप खो चुके हैं ... डीबी या टेबल का दोबारा करें। उदाहरण के लिए, मैं कहूंगा कि हमने दुनिया का डेटा डीबी से खो दिया है। 

$ cp  city.ibd  / tmp /  

$ cp city.ibd /tmp/
mysql> LOCK TABLES city WRITE;
mysql> ALTER TABLE city DISCARD TABLESPACE;

cp city.ibd /edb/local/mysql/data/rundeck/
chown tmdba:dba /edb/local/mysql/data/rundeck/city.ibd

mysql> ALTER TABLE city IMPORT TABLESPACE;
mysql> UNLOCK TABLES;
mysql> SELECT COUNT(*) FROM city;


सोमवार, 21 सितंबर 2020

MySQL mysql_config_editor और उम्मीद है

 यह किसी को भी मदद करने के लिए एक नोट है जो अपने बच्चों को 10.1 में mysql_config_editorand का उपयोग करना चाह सकता है। 

mysql_config_editor पासवर्ड तर्क नहीं लेता है, इसलिए उपकरण उपकरण जो आपके पासवर्ड को mysql_config_editor विफल करने के लिए उपयोग करने के लिए .my.cnf फ़ाइल सेट करने से पहले हो सकता है। 

यह संभव उपकरण के साथ यद्यपि संभव और काफी सरल है। 

 yum -y install expect  

यह उपयुक्त नहीं है के लिए भी काम करता है। 


इसलिए इस उदाहरण में, मैं एक सरल बैश स्क्रिप्ट संस्करण दिखाऊंगा। 

1 .. मेरा लॉगिन पथ काम नहीं करता है ... 

mysql --login-path=local

ERROR 1045 (28000): Access denied for user


यह उम्मीद के साथ सेट करें 

आप इसे अपने बैश स्क्रिप्ट के माध्यम से निष्पादित करेंगे।  

expect <<EOD

spawn mysql_config_editor set --login-path=local --host=localhost --user=root --password 

expect "password"

send  -- "<PASSWORD>\r"

interact

EOD


अब यह काम कर रहा है ...

mysql --login-path=local

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

Your MySQL connection id is 1002

रविवार, 15 मार्च 2020

MySQL और डॉकर्स ... एक साधारण सेट अप

MySQL & Dockers ... नई अवधारणाएं नहीं हैं, लोग पिछले कुछ समय से डॉकर्स की ओर बढ़ रहे हैं। किसी ऐसे व्यक्ति के लिए, जो विकास के लिए बस आगे बढ़ रहा है, उसके लिए कुछ बाधाएँ हो सकती हैं।

जबकि MySQL स्थानीय रूप से ठीक चलने में काम करता है, यदि आप MySQL के विभिन्न संस्करणों में कोड का परीक्षण कर रहे हैं तो कई संस्करणों को आसानी से उपलब्ध होना अच्छा है।

वर्षों के लिए एक विकल्प Giuseppe Maxia द्वारा https://mysqlsandbox.net/ का रहा है। यह कई उदाहरणों को प्राप्त करने और प्रतिकृति और परीक्षण आदि को प्राप्त करने में सक्षम होने के लिए एक बहुत ही वैध समाधान है।

जब यह MySQL के विभिन्न संस्करणों में परीक्षण करने की बात आती है, तो डॉकर अब एक और अक्सर उपयोग किया जाने वाला परिदृश्य है। निम्नलिखित केवल कुछ संस्करणों को आसानी से स्थापित करने के लिए कुछ चरणों पर जाएंगे। मैं OSX का उपयोग करता हूं इसलिए ये उदाहरण OSX के लिए हैं।

आपको शुरू करने के लिए डॉकर की आवश्यकता है और निश्चित रूप से डॉकर डेस्कटॉप आपके लिए एक आसान उपकरण है जिससे आप आसानी से पहुँच प्राप्त कर सकते हैं।

एक बार जब मैंने डॉकर सेट किया तो मैं अपने वातावरण को MySQL के लिए तैयार कर सकता था।

यहाँ मैंने एक डॉकर फ़ोल्डर बनाया है जिसमें MySQL डेटा डाइरेक्टरीज़, फाइल्स फाइल के साथ-साथ mysql-files डाइरेक्टरी भी शामिल हैं अगर ज़रूरत हो।

mkdir ~/Docker ;

mkdir ~/Docker/mysql_data;
mkdir ~/Docker/mysql-files;
mkdir ~/Docker/cnf;

अब mysql_data के अंदर


cd ~/Docker/mysql_data;
mkdir 8.0;
mkdir 5.7;
mkdir 5.6;
mkdir 5.5;


अब मैंने इस उदाहरण के लिए सरल cnf फाइलें स्थापित की हैं। नोट करने के लिए प्राथमिक चीज बाइंड-एड्रेस है। यह यह सुनिश्चित करने के लिए सेट किया गया है कि यह हमारे लिए खोला गया है कि MySQL को डॉकटर के बाहर कैसे पहुँचा जाए। आप यह भी देख सकते हैं कि इन फ़ाइलों का उपयोग अतिरिक्त कॉन्फ़िगरेशन जानकारी सेट करने के लिए किया जा सकता है जैसा कि आप प्रति MySQL docker उदाहरण में फिट देखते हैं।



cd ~/Docker/cnf;

cat my.8.0.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= /var/lib/mysql-files
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
bind-address = 0.0.0.0
port=3306
server-id=80


# Custom config should go here
!includedir /etc/mysql/conf.d/

cat my.5.7.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=57
max_allowed_packet=32M

$ cat my.5.6.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=56

$ cat my.5.5.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=55


अब ठीक है कि हमारे पास कॉन्फ़िगरेशन फ़ाइलें सेट हैं, हमें डॉकर्स बनाने की आवश्यकता है। बिल्ड कमांड के लिए ध्यान देने योग्य कुछ बातें।

--name हमने डॉकटर के लिए एक नामांकित संदर्भ सेट किया है।

यहाँ हम विन्यास फाइल, डेटा निर्देशिका और mysql-files निर्देशिकाओं को मैप कर रहे हैं। यह हमें आसानी से my.cnf फ़ाइल और आदि को समायोजित करने की अनुमति देता है।
-v ~ / डॉकटर / cnf / my.8.0.cnf: /etc/mysql/my.cnf
-v ~ / डॉकटर / mysql_data / 8.0: / var / lib / mysql
-v ~ / Docker / mysql-files: / var / lib / mysql-files

हम डॉक के बाहर इन MySQL उदाहरणों तक पहुंचने में सक्षम होना चाहते हैं, इसलिए हमें तदनुसार पोर्ट को प्रकाशित और मैप करने की आवश्यकता है।
-पी 3306: 3306 इसका मतलब है कि डॉकटर के अंदर 3306 लोकल से 3306
-p 3307: 3306 इसका मतलब है कि dock के अंदर 3307 लोकल से 3306
-p 3308: 3306 इसका मतलब है कि 3308 लोकल डॉकटर के अंदर 3306 है
-p 3309: 3306 इसका मतलब है कि dock के अंदर 3309 लोकल से 3306

फिर हम कुछ पर्यावरण चर भी पास करते हैं।
-मे MYSQL_ROOT_HOST =% -e MYSQL_ROOT_PASSWORD = <पासवर्ड यहां सेट करें>

इसलिए यह सब एक साथ ...


docker run --restart always --name mysql8.0 -v ~/Docker/cnf/my.8.0.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/8.0:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3306:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:8.0

docker run --restart always --name mysql5.7 -v ~/Docker/cnf/my.5.7.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.7:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3307:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.7

docker run --restart always --name mysql5.6 -v ~/Docker/cnf/my.5.6.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.6:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3308:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.6

docker run --restart always --name mysql5.5 -v ~/Docker/cnf/my.5.5.cnf:/etc/mysql/my.cnf -v ~/Docker/mysql_data/5.5:/var/lib/mysql -v ~/Docker/mysql-files:/var/lib/mysql-files -p 3309:3306 -d -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here> mysql:5.5

उपरोक्त आदेशों के प्रत्येक निष्पादन के बाद, आपको एक आईडी वापस मिलनी चाहिए।
उदाहरण: 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316

आप डॉकर डेस्कटॉप के माध्यम से प्रत्येक डॉक टर्मिनल को आसानी से शुरू कर सकते हैं / पुनः आरंभ कर सकते हैं या संबंधित आईडी का ध्यान रख सकते हैं और आप टर्मिनल के माध्यम से निष्पादित कर सकते हैं।

डॉकर डेस्कटॉप आपको उन सभी चरों को भी दिखाता है जिन्हें आपने पास किया था ताकि आप उसे सत्यापित कर सकें।
आप निश्चित रूप से यहां सीएलआई तक भी पहुंच सकते हैं, रोक सकते हैं और इसे आसानी से शुरू या नष्ट कर सकते हैं।


$ docker exec -it 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316 /bin/sh; exit
# mysql -p

अगर डॉकटर कंटेनर पहले से चल रहा है, तो आप अपने लोकलहोस्ट टर्मिनल के माध्यम से MySQL तक पहुँच सकते हैं।

$ mysql --host=localhost --protocol=tcp --port=3306 -p -u root

अब यदि आपके पास कोई एक्सेस समस्या है, तो यह सुनिश्चित करने के लिए याद रखें कि MySQL खाते सही हैं और आपके पोर्ट और मैपिंग सही हैं।
  • 'प्रारंभिक संचार पैकेट पढ़ने' पर MySQL सर्वर से कनेक्शन खो गया
  • ERROR 1045 (28000): उपयोगकर्ता 'root'@'192.168.0.5' (पासवर्ड का उपयोग कर: Y:) के लिए अस्वीकृत

अब आप देख सकते हैं कि सभी उपलब्ध हैं और उपलब्ध हैं और सर्वर Ids मेल खाता है जो हम प्रति cnf फ़ाइल ईयरइलर सेट करते हैं।

$ mysql --host=localhost --protocol=tcp --port=3306 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 58e9663afe8d | 8.0.19 | 80 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3307 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b240917f051a | 5.7.29 | 57 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3308 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b4653850cfe9 | 5.6.47 | 56 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3309 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 22e169004583 | 5.5.62 | 55 |
+--------------+-----------+-------------+


शुक्रवार, 12 जुलाई 2019

MySQL आप टेबलस्पेस को कैसे पुनर्स्थापित करते हैं

MySQL आप टेबलस्पेस को कैसे पुनर्स्थापित करते हैं?

यह नई जानकारी नहीं है, लेकिन मैंने इसे अभी तक इसे कवर नहीं किया है, जो इसे इसकी आवश्यकता है।

यदि आप अपनी ibd फ़ाइलें खो देते हैं ... तो आप अपना डेटा खो देते हैं। इसलिए यदि आपके पास एक प्रति उपलब्ध है .. या यदि आप किसी अन्य डेटाबेस से सिंक्रनाइज़ कर रहे हैं, तो भी आप इसे आयात कर सकते हैं क्या / आप कैसे टेबलस्पेस खो देते हैं?

यहाँ टेबलस्पेस को पुनर्प्राप्त करने के लिए एक सरल उदाहरण है।



mysql> Create database demo;

mysql> use demo;

mysql> CREATE TABLE `demotable` (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `dts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB;


अब हम कुछ डेटा स्टोर करते हैं ...


mysql> INSERT INTO demotable (id) VALUES (NULL);
Query OK, 1 row affected (0.10 sec)

mysql> INSERT INTO demotable (id) VALUES (NULL);
Query OK, 1 row affected (0.08 sec)

mysql> SELECT * FROM demotable;
+----+---------------------+
| id | dts |
+----+---------------------+
| 1 | 2019-07-12 23:31:34 |
| 2 | 2019-07-12 23:31:35 |
+----+---------------------+
2 rows in set (0.00 sec)


ठीक है अब इसे तोड़ने दो ।।


# systemctl stop mysqld
# cd /var/lib/mysql/demo/
# ls -ltr
total 80
-rw-r-----. 1 mysql mysql 114688 Jul 12 23:31 demotable.ibd
# mv demotable.ibd /tmp/

# systemctl start mysqld
# mysql demo

mysql> show tables;
+----------------+
| Tables_in_demo |
+----------------+
| demotable |
+----------------+
1 row in set (0.00 sec)

mysql> desc demotable;
+-------+-----------+------+-----+-------------------+-----------------------------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| dts | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------------------------+
2 rows in set (0.01 sec)

mysql> INSERT INTO demotable (id) VALUES (NULL);
ERROR 1812 (HY000): Tablespace is missing for table `demo`.`demotable`.


टूटी हुई और खोई हुई मेज़ ... अब हम इसे पुनः प्राप्त कर सकते हैं।


demo]# cp /tmp/demotable.ibd .

mysql> ALTER TABLE demotable DISCARD TABLESPACE;

demo]# cp /tmp/demotable.ibd .
demo]# ls -ltr
total 112
-rw-r-----. 1 root root 114688 Jul 12 23:50 demotable.ibd
demo]# chown mysql:mysql demotable.ibd
demo]# mysql demo
mysql> ALTER TABLE demotable IMPORT TABLESPACE;
ERROR 1034 (HY000): Incorrect key file for table 'demotable'; try to repair it

mysql> REPAIR TABLE demotable;
+----------------+--------+----------+---------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------------+--------+----------+---------------------------------------------------------+
| demo.demotable | repair | note | The storage engine for the table doesn't support repair |
+----------------+--------+----------+---------------------------------------------------------+


ध्यान दें कि अब हमें एक और त्रुटि भी मिली .. यह आमतौर पर tmpdir के लिए उपलब्ध स्थान से जुड़ा होता है, और मरम्मत वैसे भी .ibd के लिए काम नहीं करता है।


mysql> select @@tmpdir;
+----------+
| @@tmpdir |
+----------+
| /tmp |
+----------+

# vi /etc/my.cnf
tmpdir=/var/lib/mysql-files/

# systemctl restart mysqld
# mysql demo


उदाहरण के लिए ओके ने mysql-files डायरेक्टरी का इस्तेमाल किया।
अब हम फिर से कोशिश कर सकते हैं।


mysql> ALTER TABLE demotable IMPORT TABLESPACE;
Query OK, 0 rows affected, 1 warning (0.61 sec)

mysql> INSERT INTO demotable (id) VALUES (NULL);
Query OK, 1 row affected (0.11 sec)

mysql> SELECT * FROM demotable;
+----+---------------------+
| id | dts |
+----+---------------------+
| 1 | 2019-07-12 23:31:34 |
| 2 | 2019-07-12 23:31:35 |
| 3 | 2019-07-12 23:56:08 |
+----+---------------------+


ठीक है काम किया।
अब, यह सब अच्छा और सरल है यदि आपके पास सिर्फ एक टेबल है। लेकिन 100 का क्या ...

इसे स्वचालित रूप से और निश्चित रूप से मदद करने के लिए अपने info_schema का उपयोग करें।

परीक्षण के लिए कुछ और प्रतियां बनाएं।

mysql> create table demotable1 like demotable;
Query OK, 0 rows affected (0.51 sec)

mysql> create table demotable2 like demotable;
Query OK, 0 rows affected (1.04 sec)

mysql> create table demotable3 like demotable;
Query OK, 0 rows affected (0.74 sec)

mysql> create table demotable4 like demotable;
Query OK, 0 rows affected (2.21 sec)


उन सब को तोड़ो ।।

demo]# mv *.ibd /tmp/


अब अपनी information_schema.tables तालिका का उपयोग करके, आप उन सभी कमांड का निर्माण कर सकते हैं जिनकी आपको आवश्यकता होगी।

# vi build_discard.sql
# cat build_discard.sql
SELECT CONCAT(" ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," DISCARD TABLESPACE; ") as CMD FROM information_schema.TABLES WHERE TABLE_SCHEMA='demo';

# vi build_import.sql
# cat build_import.sql
SELECT CONCAT(" ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," IMPORT TABLESPACE; ") as CMD FROM information_schema.TABLES WHERE TABLE_SCHEMA='demo';



# mysql -N < build_import.sql > import_tablespace.sql
# mysql -N < build_discard.sql | mysql demo

demo]# cp /tmp/*.ibd .
demo]# chown mysql:mysql *.ibd
# systemctl restart mysqld
# mysql demo < import_tablespace.sql
# mysql demo

mysql> INSERT INTO demotable (id) VALUES (NULL);
Query OK, 1 row affected (0.08 sec)

mysql> INSERT INTO demotable1 (id) VALUES (NULL);
Query OK, 1 row affected (0.05 sec)

mysql> INSERT INTO demotable2 (id) VALUES (NULL);
Query OK, 1 row affected (0.09 sec)

mysql> INSERT INTO demotable3 (id) VALUES (NULL);
^[[AQuery OK, 1 row affected (0.37 sec)

mysql> INSERT INTO demotable4 (id) VALUES (NULL);
Query OK, 1 row affected (0.12 sec)



और इसने काम किया।

MySQL Binlogs :: कैसे पुनर्प्राप्त करें

इसलिए मुझे एहसास हुआ कि मैंने इस स्थिति के बाद इस बारे में एक पोस्ट नहीं किया था कि हाल ही में आया था।

यहाँ परिदृश्य है: एक बैकअप आधी रात को लिया गया था, उन्होंने प्रति डेटाबेस MySQL डंप का उपयोग किया। फिर अगले दिन सुबह दस बजे डेटाबेस क्रैश हो गया। मुझे बुलाए जाने से पहले घटनाओं की एक श्रृंखला हुई थी, लेकिन वे इसे डेटाबेस के एक संस्करण तक ले गए थे, जिसमें MyISAM तालिकाओं और तालिकाओं से गायब IBD फाइलें थीं।

तो विकल्प 1, बैकअप से बहाल करना हमें आधी रात को मिलेगा और हम घंटों डेटा खो देंगे। विकल्प 2, हम 1000 की ibd फ़ाइलों को फिर से जोड़ते हैं और सब कुछ रखते हैं। तब हमारे पास विकल्प 3 था, बैकअप से पुनर्स्थापित करें, फिर हाल के परिवर्तनों के लिए बिनलॉग लागू करें।

इसे और दिलचस्प बनाने के लिए, उनके पास मेरे द्वारा बताई गई सभी ibd फाइलें नहीं थीं, और मुझे कुछ याद नहीं था। तो यकीन नहीं है कि यह कैसे संभव था लेकिन विकल्प 2 एक अमान्य विकल्प बन गया। वे निश्चित रूप से, कम से कम डेटा हानि संभव चाहते थे, इसलिए हम विकल्प 3 के साथ गए।

इसे सुरक्षित रूप से करने के लिए मैंने पोर्ट 3307 के तहत MySQL का एक और उदाहरण शुरू किया। इससे मुझे काम करने के लिए एक सुरक्षित जगह मिल गई, जबकि यातायात ने बंदरगाह 3306 उदाहरण पर MyISAM डेटा तक पहुंच पढ़ी थी।

एक बार सभी बैकअप डंप फ़ाइलें असम्पीडित और 3307 उदाहरण में आयातित मैं Binlog फ़ाइलों पर ध्यान केंद्रित करने में सक्षम था।

पहले तो यह अवधारणा वास्तव में जितना कठिन है, उससे कहीं अधिक जोखिम भरा है। यह वास्तव में बहुत आगे और सरल है।

इसलिए सबसे पहले आपको अपने बाद का डेटा ढूंढना होगा। बिनलॉग फाइलों की समीक्षा आपको यह बताती है कि क्या फाइलें प्रासंगिक हैं। मेरे मामले में, किसी तरह वे बिनलॉग को रीसेट करने में कामयाब रहे, इसलिए 117 फ़ाइल में 2 तारीख सीमाएं थीं।

पहले बिनलॉग समीक्षा के लिए, निम्न कमांड मानव-पठनीय प्रारूप में डेटा को आउटपुट करता है।
mysqlbinlog --defaults-file=/root/.my.cnf --base64-output=DECODE-ROWS --verbose mysql-bin.000117 > review_mysql-bin.000117.sql

* नोट ... उपरोक्त कमांड को चलाने में सावधानी बरतें। ध्यान दें कि मेरे पास फ़ाइल को सीधे उसी स्थान पर डंप करना है जैसे कि बिनलॉग। इसलिए मान्य करें कि आपका फ़ाइल नाम मान्य है। यह mysql-bin.000117.sql, इस mysql-bin.000101 .sql से अलग है। आप अपने बिनलॉग को 2 विकल्प और .sql से पहले एक स्थान के साथ ढीला कर देंगे।

अब डेटा को बचाने के लिए इसे लागू किया जा सकता है। चूँकि मेरे पास कई सारे बैनॉगल्स थे, जिससे मैंने एक फाइल बनाई और मैं वैसे भी समय-सीमा की दोबारा जाँच करना चाहता था।


mysqlbinlog --defaults-file=/root/.my.cnf --start-datetime="2019-07-09 00:00:00" --stop-datetime="2019-07-10 00:00:00" mysql-bin.000117 > binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf mysql-bin.000118 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf mysql-bin.000119 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf --start-datetime="2019-07-10 00:00:00" --stop-datetime="2019-07-10 10:00:00" mysql-bin.000117 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf --stop-datetime="2019-07-10 10:00:00" mysql-bin.000120 >> binlog_restore.sql
mysqlbinlog --defaults-file=/root/.my.cnf --stop-datetime="2019-07-10 10:00:00" mysql-bin.000121 >> binlog_restore.sql

mysql --socket=/var/lib/mysql_restore/mysql.sock -e "source /var/lib/mysql/binlog_restore.sql"

अब मैंने दिए गए समय सीमाओं के लिए उन बिनलॉग से सभी डेटा को लागू किया। क्लाइंट ने सभी डेटा को डबल-चेक किया और यह सब वापस पाकर बहुत खुश था।

इस स्थिति के लिए कई अलग-अलग विकल्प मौजूद थे, यह क्लाइंट के साथ सबसे अच्छी कसरत करने के लिए हुआ।

एक बार जब सभी को पुनर्स्थापित किए गए संस्करण पर सभी मान्य थे, तो यह दोनों डेटाबेसों का एक सरल पड़ाव था, डेटा निर्देशिकाओं को स्थानांतरित कर दिया (डेटादिर डिफॉल्ट्स को अक्षुण्ण रखना चाहता था), निर्देशिकाओं को केवल सुरक्षित होने के लिए और MySQL को शुरू करने के लिए चुना। अब बहाल किया गया उदाहरण 3306 पोर्ट पर था। 

सोमवार, 17 जून 2019

MySQL ग्रुप प्रतिकृति

इसलिए MySQL का समूह प्रतिकृति MySQL 5.7 के साथ सामने आया। अब यह थोड़ा बाहर हो गया है जबकि लोग इसके बारे में अधिक पूछना शुरू कर रहे हैं।
नीचे इसको कैसे सेट किया जाए इसका एक उदाहरण है और कुछ दर्द बिंदु उदाहरण हैं जैसे मैंने इसके साथ चारों ओर पोक किया है।
मैं तीन अलग-अलग सर्वरों का उपयोग कर रहा हूं,

सर्वर CENTOSA

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
Query OK, 0 rows affected (0.02 sec)

vi my.cnf
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE

transaction_write_set_extraction=XXHASH64
group_replication_group_name="90d8b7c8-5ce1-490e-a448-9c8d176b54a8"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.111.17:33061"
group_replication_group_seeds= "192.168.111.17:33061,192.168.111.89:33061,192.168.111.124:33061"
group_replication_bootstrap_group=off

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER repl@'%' IDENTIFIED BY 'replpassword';
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;


CHANGE MASTER TO
MASTER_USER='repl',
MASTER_PASSWORD='replpassword'
FOR CHANNEL 'group_replication_recovery';


mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)


mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.11 sec)


mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)


mysql> SELECT * FROM performance_schema.replication_group_members \G

*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
MEMBER_ID: 1ab30239-5ef6-11e9-9b4a-08002712f4b1
MEMBER_HOST: centosa
MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
MEMBER_ROLE: PRIMARY
MEMBER_VERSION: 8.0.15
इसलिए अब हम और सर्वर जोड़ सकते हैं।
सर्वर CENTOSB

vi my.cnf
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE


transaction_write_set_extraction=XXHASH64
group_replication_group_name="90d8b7c8-5ce1-490e-a448-9c8d176b54a8"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.111.89:33061"
group_replication_group_seeds= "192.168.111.17:33061,192.168.111.89:33061,192.168.111.124:33061"
group_replication_bootstrap_group=off

mysql> CHANGE MASTER TO
MASTER_USER='repl',
MASTER_PASSWORD='replpassword'
FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> CHANGE MASTER TO GET_MASTER_PUBLIC_KEY=1;
Query OK, 0 rows affected (0.02 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (4.03 sec)

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 1ab30239-5ef6-11e9-9b4a-08002712f4b1 | centosa | 3306 | ONLINE | PRIMARY | 8.0.15 |
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb | 3306 | RECOVERING | SECONDARY | 8.0.15 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
2 rows in set (0.00 sec)


सर्वर CENTOSC

vi my.cnf
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE

transaction_write_set_extraction=XXHASH64
group_replication_group_name="90d8b7c8-5ce1-490e-a448-9c8d176b54a8"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.111.124:33061"
group_replication_group_seeds= "192.168.111.17:33061,192.168.111.89:33061,192.168.111.124:33061"
group_replication_bootstrap_group=off

mysql> CHANGE MASTER TO
-> MASTER_USER='repl',
-> MASTER_PASSWORD='replpassword'
-> FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> CHANGE MASTER TO GET_MASTER_PUBLIC_KEY=1;
Query OK, 0 rows affected (0.02 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.58 sec)
mysql> SELECT * FROM performance_schema.replication_group_members \G
*************************** 1. row ***************************
CHANNEL_NAME: group_replication_applier
MEMBER_ID: 1ab30239-5ef6-11e9-9b4a-08002712f4b1
MEMBER_HOST: centosa
MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
MEMBER_ROLE: PRIMARY
MEMBER_VERSION: 8.0.15

*************************** 2. row ***************************
CHANNEL_NAME: group_replication_applier
MEMBER_ID: 572ca2fa-5eff-11e9-8df9-08002712f4b1
MEMBER_HOST: centosb
MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
MEMBER_ROLE: SECONDARY
MEMBER_VERSION: 8.0.15

*************************** 3. row ***************************
CHANNEL_NAME: group_replication_applier
MEMBER_ID: c5f3d1d2-8dd8-11e9-858d-08002773d1b6
MEMBER_HOST: centosc
MEMBER_PORT: 3306
MEMBER_STATE: ONLINE
MEMBER_ROLE: SECONDARY
MEMBER_VERSION: 8.0.15
3 rows in set (0.00 sec)


तो यह सब बहुत अच्छा है, लेकिन इसका मतलब यह नहीं है कि वे ऑनलाइन जाते हैं, वे अक्सर वसूली मोड में बैठ सकते हैं।
मैंने देखा है कि यह MySQL दुर्घटनाओं के साथ अभी तक इसे स्थिर रखने की आवश्यकता है।
mysql> create database testcentosb;<br> ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement<br>
साइड नोट उन कारकों में से कुछ को संबोधित करने के लिए -
mysql> START GROUP_REPLICATION;
ERROR 3094 (HY000): The START GROUP_REPLICATION command failed as the applier module failed to start.

mysql> reset slave all;
Query OK, 0 rows affected (0.03 sec)
- इसके बाद चेंज मास्टर कमांड से शुरुआत करें
mysql> START GROUP_REPLICATION;
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.

[ERROR] [MY-011735] [Repl] Plugin group_replication reported: '[GCS] Error on opening a connection to 192.168.111.17:33061 on local port: 33061.'
[ERROR] [MY-011526] [Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: c5f3d1d2-8dd8-11e9-858d-08002773d1b6:1-4 >
[ERROR] [MY-011522] [Repl] Plugin group_replication reported: 'The member contains transactions not present in the group. The member will now exit the group.'

https://ronniethedba.wordpress.com/2017/04/22/this-member-has-more-executed-transactions-than-those-present-in-the-group/


[ERROR] [MY-011620] [Repl] Plugin group_replication reported: 'Fatal error during the recovery process of Group Replication. The server will leave the group.'
[ERROR] [MY-013173] [Repl] Plugin group_replication reported: 'The plugin encountered a critical error and will abort: Fatal error during execution of Group Replication'

SELECT * FROM performance_schema.replication_connection_status\G


मेरे विचार...
ध्यान रखें कि समूह प्रतिकृति एकल प्राथमिक मोड या बहु-नोड में स्थापित की जा सकती है
mysql> select @@group_replication_single_primary_mode\G
*************************** 1. row ***************************
@@group_replication_single_primary_mode: 1

mysql> create database testcentosb;
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
यदि आप कोई भी प्राथमिक नोड नहीं लिखते हैं तो आपको निश्चित रूप से एक त्रुटि मिलेगी।


समूह-प्रतिकृति-एकल-प्राथमिक-मोड = बंद <- cnf फ़ाइलों में जोड़ा गया।
mysql> SELECT * FROM performance_schema.replication_group_members;
+ --------------------------- + --------------------- ----------------- + ------------- + ------------- + ---- ---------- + ------------- + ---------------- +
| चैनल का नाम               | सदस्य आईडी                             | Cross.tv_HOST | Cross.tv_PORT | Cross.tv_STATE | Cross.tv_ROLE | Cross.tv_VERSION |
+ --------------------------- + --------------------- ----------------- + ------------- + ------------- + ---- ---------- + ------------- + ---------------- +
| group_replication_applier | 1ab30239-5ef6-11e9-9b4a-08002712f4b1 | centosa     |         3306 | ठीक हो   | प्राथमिक     | 8.0.15         |
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb     |         3306 | ऑनलाइन       | प्राथमिक     | 8.0.15         |
| group_replication_applier | c5f3d1d2-8dd8-11e9-858d-08002773d1b6 | centosc     |         3306 | ठीक हो   | प्राथमिक     | 8.0.15         |
+ --------------------------- + --------------------- ----------------- + ------------- + ------------- + ---- ---------- + ------------- + ---------------- +

सेट में 3 पंक्तियाँ (0.00 सेकंड)


हालाँकि यह तब है जब आप अपने ट्रैफिक को संभालने के लिए अपने ट्रैफिक को संभालने के लिए कीपलाइज्ड, माईएसक्यूएल राउटर, प्रोक्सीएसक्यूएल आदि का इस्तेमाल करते हैं। हम नीचे से यह देख सकते हैं कि जब मैं प्राथमिक रुका था, तो वह तुरंत ही विफल हो गया।

mysql> SELECT * FROM performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 1ab30239-5ef6-11e9-9b4a-08002712f4b1 | centosa | 3306 | ONLINE | PRIMARY | 8.0.15 |
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb | 3306 | ONLINE | SECONDARY | 8.0.15 |
| group_replication_applier | c5f3d1d2-8dd8-11e9-858d-08002773d1b6 | centosc | 3306 | ONLINE | SECONDARY | 8.0.15 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)

[root@centosa]# systemctl stop mysqld

mysql> SELECT * FROM performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb | 3306 | ONLINE | PRIMARY | 8.0.15 |
| group_replication_applier | c5f3d1d2-8dd8-11e9-858d-08002773d1b6 | centosc | 3306 | ONLINE | SECONDARY | 8.0.15 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
2 rows in set (0.00 sec)

[root@centosa]# systemctl start mysqld
[root@centosa]# mysql
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (3.34 sec)

mysql> SELECT * FROM performance_schema.replication_group_members ;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 1ab30239-5ef6-11e9-9b4a-08002712f4b1 | centosa | 3306 | RECOVERING | SECONDARY | 8.0.15 |
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb | 3306 | ONLINE | PRIMARY | 8.0.15 |
| group_replication_applier | c5f3d1d2-8dd8-11e9-858d-08002773d1b6 | centosc | 3306 | ONLINE | SECONDARY | 8.0.15 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)


अब रिकवरी अभी भी एक मुद्दा था, क्योंकि यह केवल वापस शामिल नहीं होगा। फिर से सभी खातों और चरणों की समीक्षा करनी थी, लेकिन मैंने इसे अंततः वापस ले लिया।

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 1ab30239-5ef6-11e9-9b4a-08002712f4b1 | centosa | 3306 | ONLINE | SECONDARY | 8.0.15 |
| group_replication_applier | 572ca2fa-5eff-11e9-8df9-08002712f4b1 | centosb | 3306 | ONLINE | PRIMARY | 8.0.15 |
| group_replication_applier | c5f3d1d2-8dd8-11e9-858d-08002773d1b6 | centosc | 3306 | ONLINE | SECONDARY | 8.0.15 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
3 rows in set (0.00 sec)


मुझे इसके साथ और अधिक परीक्षण करने की आवश्यकता है क्योंकि मैं अभी तक 100% बेचा नहीं गया हूं क्योंकि मुझे इसकी आवश्यकता है क्योंकि मैं गैलेरा प्रतिकृति की ओर झुक रहा हूं।

ब्याज का URLS


  • https://dev.mysql.com/doc/refman/8.0/en/group-replication.html
  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-deploying-in-single-primary-mode.html
  • http://datacharmer.blogspot.com/2017/01/mysql-group-replication-vs-multi-source.html
  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-launching.html
  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html
  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-adding-instances.html
  • https://ronniethedba.wordpress.com/2017/04/22/how-to-setup-mysql-group-replication/
  • https://www.digitalocean.com/community/tutorials/how-to-configure-mysql-group-replication-on-ubuntu-16-04
  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-options.html#sysvar_group_replication_group_seeds
  • https://bugs.mysql.com/bug.php?id=90534
  • https://www.percona.com/blog/2017/02/24/battle-for-synchronous-replication-in-mysql-galera-vs-group-replication/
  • https://lefred.be/content/mysql-group-replication-is-sweet-but-can-be-sour-if-you-misunderstand-it/
  • https://www.youtube.com/watch?v=IfZK-Up03Mw
  • https://mysqlhighavailability.com/mysql-group-replication-a-quick-start-guide/