You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardexpand all lines: docs/data-masking-function-list.md
+94-8
Original file line number
Diff line number
Diff line change
@@ -1,8 +1,26 @@
1
-
# Data masking component functions
1
+
# Data masking component functions and variables
2
2
3
3
The feature is in [tech preview](glossary.md#tech-preview).
4
4
5
-
|**Name**|**Usage**|
5
+
## Permissions
6
+
7
+
In Percona Server for MySQL 8.4.4-1, dictionary-related functions no longer run internal queries as the root user without a password. Following MySQL best practices, many admins disable the `root` user, which previously caused these functions to stop working. The server now uses the built-in `mysql.session` user to execute dictionary queries.
8
+
9
+
However, for this to work, you need to grant the mysql.session user `SELECT`, `INSERT`, `UPDATE`, and `DELETE` privileges on the `masking_dictionaries` table.
10
+
11
+
```{.bash data-prompt="mysql>"}
12
+
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON mysql.masking_dictionaries TO 'mysql.session'@'localhost';
13
+
```
14
+
15
+
If you change the value of the `masking_functions.masking_database` system variable to something other than `mysql`, make sure to update the `GRANT` query to match the new value.
16
+
17
+
```{.bash data-prompt="mysql>"}
18
+
mysql> GRANT SELECT, INSERT, UPDATE, DELETE ON <masking_functions.masking_database>.masking_dictionaries TO 'mysql.session'@'localhost';
|[`gen_blocklist(str, from_dictionary_name, to_dictionary_name)`](#gen_blockliststr-from_dictionary_name-to_dictionary_name)| Replace a term from a dictionary |
8
26
|[`gen_dictionary(dictionary_name)`](#gen_dictionarydictionary_name)| Returns a random term from a dictionary |
@@ -24,13 +42,19 @@ The feature is in [tech preview](glossary.md#tech-preview).
24
42
|[`mask_ssn(str [,mask_char])`](#mask_ssnstr-mask_char)| Masks the US Social Security number |
25
43
|[`mask_uk_nin(str [,mask_char])`](#mask_uk_ninstr-mask_char)| Masks the United Kingdom National Insurance number |
26
44
|[`mask_uuid(str [,mask_char])`](#mask_uuidstr-mask_char)| Masks the Universally Unique Identifier |
45
+
|[`masking_dictionaries_flush()`](#masking_dictionaries_flush)| Resyncs the internal dictionary term cache |
27
46
|[`masking_dictionary_remove(dictionary_name)`](#masking_dictionary_removedictionary_name)| Removes the dictionary |
28
47
|[`masking_dictionary_term_add(dictionary_name, term_name)`](#masking_dictionary_term_adddictionary_name-term_name)| Adds a term to the masking dictionary |
29
48
|[`masking_dictionary_term_remove(dictionary_name, term_name)`](#masking_dictionary_term_removedictionary_name-term_name)| Removes a term from the masking dictionary |
Replaces one term in a dictionary with a term, selected at random, in another dictionary.
53
+
Replaces a term from one dictionary with a randomly selected term in another dictionary.
54
+
55
+
### Version update
56
+
57
+
Percona Server for MySQL 8.4.4-1 introduces an internal term cache. The server now uses in-memory data structures for lookups instead of querying the `<masking_functions.masking_database>.masking_dictionaries` table every time. This improvement boosts performance, especially when handling multiple rows.
Returns a term from a dictionary selected at random.
68
92
93
+
### Version update
94
+
95
+
Percona Server for MySQL 8.4.4-1 introduces an internal term cache. The server now uses in-memory data structures for lookups instead of querying the `<masking_functions.masking_database>.masking_dictionaries` table every time. This improvement boosts performance, especially when handling multiple rows.
Returns an integer value of `1` (one) when successful.
803
+
804
+
### Example
805
+
806
+
```{.bash data-prompt="mysql>"}
807
+
mysql> SELECT masking_dictionaries_flush();
808
+
```
809
+
??? example "Expected output"
810
+
811
+
```{.text .no-copy}
812
+
+------------------------------+
813
+
| masking_dictionaries_flush() |
814
+
+------------------------------+
815
+
| 1 |
816
+
+---------------------------- +
817
+
```
818
+
763
819
## masking_dictionary_remove(dictionary_name)
764
820
765
821
Removes all of the terms and then removes the dictionary.
@@ -775,7 +831,7 @@ Requires the `MASKING_DICTIONARIES_ADMIN` privilege.
775
831
776
832
### Returns
777
833
778
-
Returns a string value of `1` (one) in the `utf8mb4` character set if the operation is successful or `NULL` if the operation could not find the `dictionary_name`.
834
+
Returns an integer value of `1` (one) if the operation is successful. Returns the integer value of `0` (zero) for a failure.
779
835
780
836
### Example
781
837
@@ -807,9 +863,7 @@ Adds a term to the dictionary and requires the `MASKING_DICTIONARIES_ADMIN` priv
807
863
808
864
### Returns
809
865
810
-
Returns a string value of `1` (one) in the `utf8mb4` character set if the operation is successful. If the `dictionary_name` does not exist, the operation creates the dictionary.
811
-
812
-
Returns `NULL` if the operation fails. An operation can fail if the `term_name` is already available in the dictionary specified by `dictionary_name`.
866
+
Returns an integer value of `1` (one) if the operation is successful. Returns an integer value of `0` (zero) for a failure. If the `dictionary_name` does not exist, the operation creates the dictionary.
813
867
814
868
The operation uses `INSERT IGNORE` and can have the following outcomes:
815
869
@@ -872,7 +926,7 @@ Requires the `MASKING_DICTIONARIES_ADMIN` privilege.
872
926
873
927
### Returns
874
928
875
-
Returns a string value of `1` (one) in the `utf8mb4` character set if the operation is successful.
929
+
Returns a integer value of `1` (one) if the operation is successful. Returns the integer value of `0` (zero) for a failure.
876
930
877
931
Returns `NULL` if the operation fails. An operation can fail if the following occurs:
|[`dictionaries_flush_interval_seconds (integer, unsigned)`](#dictionaries_flush_interval_secondsinteger-unsigned)| The number of seconds between updates to the internal dictionary cache to match changes in the dictionaries table.|
966
+
|[`masking_database(str)`](#masking_databasestr)| Set a different database name to use for the dictionaries table. |
Percona Server for MySQL 8.4.4-1 adds this variable. The number of seconds between a synchronization between the dictionaries table and the internal dictionary cache. The default value is 0 seconds (disabled). The minimum value is 1 second. The maximum value is 31,536,000 seconds (1 year).
979
+
980
+
### masking_database(string)
981
+
982
+
| Option | Description |
983
+
| -------------- | ------------------ |
984
+
| Scope: | Global |
985
+
| Read, Write, or Read-Only: | Read-Only |
986
+
| Data type | String |
987
+
| Default value | "mysql" |
988
+
989
+
Specify the name of the database that holds the `masking_dictionaries` table. By default, it uses the `mysql` database.
Data masking helps to limit the exposure of sensitive data by preventing access to non-authorized users. Masking provides a way to create a version of the data in situations, such as a presentation, sales demo, or software testing, when the real data should not be used. Data masking changes the data values while using the same format and cannot be reverse engineered. Masking reduces an organization's risk by making the data useless to an outside party.
3
+
Data masking protects sensitive information by restricting data access to authorized users only. When you need to present, demonstrate, or test software without revealing actual data, masking creates safe versions of your data. The masking process changes values while keeping the same data format, making the original values impossible to recover. This security approach reduces organizational risk because any exposed data becomes worthless to unauthorized parties.
4
+
5
+
Data masking in Percona Server for MySQL is an essential tool for protecting sensitive information in various scenarios:
6
+
7
+
| Scenario | Description |
8
+
|---|----|
9
+
| Protecting data in development and testing | Developers and testers require realistic data to validate applications. By masking sensitive details, such as credit card numbers, Social Security numbers, and addresses, accurate user information can be safeguarded in non-production environments. |
10
+
| Compliance with data privacy regulations | Stringent laws like GDPR, HIPAA, and CCPA mandate the protection of personal data. Data masking enables the anonymization of personal information, facilitating its use for analysis and reporting while ensuring compliance with regulations. |
11
+
| Securing data when collaborating with external entities | Sharing data with third-party vendors demands the masking of sensitive information to prevent access to accurate personal details. |
12
+
| Supporting customer service and training | Customer support teams and trainers often require access to customer data. Through data masking, they can utilize realistic information without compromising actual customer details. |
13
+
| Facilitating data analysis and reporting | Analysts rely on access to data for generating reports and uncovering insights. By employing data masking techniques, they can work with realistic data sets without compromising privacy. |
14
+
15
+
These examples underscore how data masking serves as a crucial safeguard for sensitive information, allowing organizations to leverage their data effectively across diverse functions.
16
+
17
+
18
+
## Version updates
19
+
20
+
Percona Server for MySQL 8.4.4-4 introduces performance improvements for data masking through an internal term cache. The cache affects the following functions in the [data masking component](data-masking-function-list.md):
The new cache stores dictionary data in memory, making lookups faster than the previous method of querying the `<masking_functions.masking_database>.masking_dictionaries` table each time. This speed boost is especially noticeable when you're working with many rows of data.
27
+
28
+
However, the cache brings some new considerations. If you change the dictionary table directly (instead of using the proper dictionary management functions), your cache and table data can become different.
29
+
30
+
The dictionary manipulation functions are the following:
To fix this, you can use the new [`masking_dictionaries_flush()`](data-masking-function-list.md#masking_dictionaries_flush) function to sync them back up. This function returns `1` when successful.
39
+
40
+
The changes also affect how row-based replication works. When dictionary changes happen on the source server, they travel through the binary log to the replica server. While the replica applies these changes to its table correctly, the dictionary term cache doesn't update right away.
41
+
42
+
To handle this, there's a new component system variable called [`component_masking_functions.dictionaries_flush_interval_seconds()`](data-masking-function-list.html#dictionaries_flush_interval_secondsinteger-unsigned)
43
+
44
+
By default, it's set to 0. When you set it higher, the system starts a background process that refreshes the cache at your specified interval. This helps replicas stay in sync after receiving binary log updates. The value specifies the number of seconds between each sync.
4
45
5
46
## Data masking techniques
6
47
7
48
The common data masking techniques are the following:
8
49
9
50
| Technique | Description |
10
51
| --- | --- |
11
-
| Custom string | Replaces sensitive data with a specific string, such as a phone number with XXX-XXX-XXXX |
12
-
| Data substitution | Replaces sensitive data with realistic alternative values, such as city name with another name from a dictionary |
52
+
| Character substitution | Replaces sensitive data with a matching symbol (X,*). For example, a phone number becomes XXX-XXX-XXXX. |
53
+
| Value generation | Replaces sensitive data with realistic-looking alternative values. For example, for testing purposes, you can generate a realistic alternative United States Social Security Number. |
54
+
55
+
## Additional resources
56
+
57
+
Component:
58
+
59
+
[Install the data masking component](install-data-masking-component.md)
0 commit comments