2014年11月12日水曜日

systemctlとMySQL

Original post: http://anothermysqldba.blogspot.com/2014/11/systemctl-and-mysql.html

だから、一部のユーザーはyumのは、MySQLのインストールとMySQLサーバを起動するには、次のコマンドを使用できるように期待して完了:: "そのようなファイルまたはディレクトリ"を取得しないことだけを開始/etc/init.d/mysql

だから、これはsystemctlコマンドを使用するのに役立つ迅速なポストである。
あなたはこれを見て可能性があります:
# systemctl list-unit-files | grep mysql 
mysqld.service disabled

最初に私はに行く推薦するtools.percona.comと有効なmy.cnfファイルを作成します。

だから、解決策は簡単ですが、私たちはちょうどので、データベースが起動するサーバー上で起動することができますこれを有効にする必要があります。

#systemctl enable mysqld.service 
ln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/mysql.service' 
ln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/multi-user.target.wants/mysqld.service' 
#systemctl start mysqld 
#systemctl list-unit-files | grep mysql 
mysql.service enabled 
mysqld.service enabled

今、あなたは行くために良いことがあります...

2014年10月12日日曜日

MySQLのスローログのローテーション

Original post: http://anothermysqldba.blogspot.com/2014/10/rotating-mysql-slow-logs.html

異なるクライアントでの作業中に、私は時々非常に大規模なスローログファイルを渡って実行するために起こる。 が、それらを回転させるべきかについて、いくつかの意見が存在する。 これらの意見の多くは、私も自分のバイナリログをフラッシュすることを好まない、ログローテートとフラッシュlogsコマンドを使用します。 私はロナルドブラッドフォードに同意するのはこのためですブログ投稿これを行う方法上の年前から。 
私は少しさらにそれを撮影し手順をスクリプト化している。 bashスクリプトは、MySQL 5.6で構築されており、心の中mysql_config_editorはそれは同様にMySQLの古いバージョンで使用することができます。 

このスクリプトは、次の操作を行います。 
  • 現在のログファイル名を収集します
  • 現在の長いクエリ時間値を収集
  • 高い値に長いクエリ時間をリセットします
  • ログは同様にそれを切り捨て中にコピー(ロナルドさんの投稿を参照してください)
  • 元の時間に戻って長いクエリ時間をリセットします
  • ご希望の場合は、新しいスローログを確認することができますので、簡単なスロークエリを実行します
  • あなたが戻ってスペースを得ることができますので、古い低速のログを削除します。
    • あなたが代わりにログを確認したい場合は、このコマンドをコメントアウトすることができます。
だから、すべての動作しますか? 
さて私たちは、この例を使用してみましょう。 

私は現在、私はそれに応じて、スクリプトを更新した形で書きファイルに上書きmysql_config_editorを使用しています。 
# mysql_config_editor print --all 
[local] 
user = root 
password = ***** 
host = localhost 

私は、このスロークエリログが現在1Gであることがわかります。 
# ls -alh mysql-slow.log 
-rw-rw---- 1 mysql mysql 1.1G Oct 11 16:08 mysql-slow.log 

だから私は、スクリプトを実行する 
# /root/rotate_slow_logs.sh 
# ls -alh mysql-slow.log 
-rw-rw---- 1 mysql mysql 5.8K Oct 11 16:11 mysql-slow.log 

良い[OK]を、それが働いたと私は私のビンのログをフラッシュするか、MySQLを再起動せずに今では小さなログファイルを持っている。 

あなたができるだけ頻繁にあなたがしたいように回転させることができますので、このスクリプトは、crontabのに追加することができます。 

ここではスクリプトです。 
#!/bin/bash 

# THIS IS BUILT WITH MYSQL 5.6 SECURITY IN MIND. 
# SET THE LOGINPATHVALUE if you are using the mysql_config_editor 
# IF YOU ARE NOT USING THE mysql_config_editor THEN IT IS ASSUMED YOU HAVE 
# SET A .my.cnf FILE IN THE USER HOME DIR OR THIS USER HAS NO PASSWORD SET 


# PLEASE SET THIS ACCORDINGLY TO YOUR SYSTEM. 
LOGINPATHVALUE="local"; 

if [ -z "${LOGINPATHVALUE}" ]; then 
LOGINPATH=""; 
fi 

if [ -n "${LOGINPATHVALUE-unset}" ]; then 
LOGINPATH="--login-path=$LOGINPATHVALUE " 

fi 

# GATHERS THE LOG FILE NAME 
SLOWLOG=$(mysqladmin $LOGINPATH variables | grep slow | grep file | awk '/[a-zA-Z]/ {print $4}' ) 

# GATHER CURRENT VALUE 
LQT=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 
LQTB=$(mysql $LOGINPATH -e " SELECT @@global.long_query_time *200 AS LQTB;" | awk '/[0-9]./ {print $1}' ) 
LQTC=$(mysql $LOGINPATH -e " SELECT @@global.long_query_time *2 AS LQTC;" | awk '/[0-9]./ {print $1}' ) 

# GATHER MARKER 
DATE=`date +"%m%d%Y"` 

# RESET SLOW QUERY TIME 
# SET GLOBAL long_query_time=10; 
mysql $LOGINPATH -e "SET GLOBAL long_query_time= $LQTB" 

LQTD=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 

#MOVE THE LOG OUT 
cp $SLOWLOG $SLOWLOG.$DATE; > $SLOWLOG 

#SET THE TIMEBACK 
mysql $LOGINPATH -e "SET GLOBAL long_query_time= $LQT" 

LQTD=$( mysqladmin $LOGINPATH variables | grep long_query_time | awk '/[0-9]./ {print $4}' ) 

#PLACE A Slow query for log 
SLOWQUERY=$(mysql $LOGINPATH -e "SELECT sleep($LQTC) " ) 

# REMOVE OLD LOG 
/bin/rm -f $SLOWLOG.$DATE;


2014年9月24日水曜日

MySQLのユーザー接続

Original post: http://anothermysqldba.blogspot.com/2014/09/mysql-user-connections.html

だから私は自分自身がMySQLのユーザーとの違いを説明し、それらがどのように認証を発見した。 すべてのこの情報の最初には新しいものではないが、ここで見つけることができます:
私はこれを説明するためにいくつかの現実世界の例を示します。

それはユーザーのアクセス許可を評価するときMySQLは、ユーザー名だけでなく、ログインを使用しています。 ベストプラクティスは、匿名ユーザーを削除するのはこのためです。

この例では、私は次のユーザーでスタートします



MariaDB [(none)]> select user , host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | centos64 |
| root | centos64 |
| | localhost |
| root | localhost |
+---------+-----------+

私もダウンして、匿名の@ localhostのがデフォルトので、私はユーザ名を持っていないと思ったサーバーにログインできます。


# mysql -u nobody
MariaDB [(なし)]>を選択し、CURRENT_USER();
+ ---------------- +
| CURRENT_USER()|
+ ---------------- +
| @localhost |
+ ---------------- +
MariaDB [(なし)]>ショーの助成金;
+ -------------------------------------- +
| @localhostための助成|
+ -------------------------------------- +
| * ONのGRANT USAGE * 'TO localhost'の '@'。|
+ -------------------------------------- +

私は多くを行うことはできませんが、私はまだデータベースに乗り込んだ。

今、私は既知のユーザーを渡す場合:


# mysql -u root -p
MariaDB [(なし)]>を選択しCURRENT_USER;
+ ---------------- +
| CURRENT_USER |
+ ---------------- +
|ルート@ localhostの|
+ ---------------- +
MariaDB [(なし)]>ショーの助成金;
+----------------------------------------------------------------------------------------------------------------------------------------+
|ルート@ localhostの助成|
+----------------------------------------------------------------------------------------------------------------------------------------+
|に掲示されているすべての権限を付与* *「ルート」を@にパスワードでIDENTIFIED 'localhost'の '* 8CD56861FDADF7A264741F27D502D1A8DAE0A8F7を' WITH GRANT OPTIONを。|
| GRANT PROXY ON '' @ 'WITH GRANT OPTIONを' localhost 'の@「ルート」へ|
+----------------------------------------------------------------------------------------------------------------------------------------+


現在、rootユーザーは、4つの異なるアカウントを持っている。

MariaDB [(none)]> select user , host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| root | centos64 |
| root | localhost |
+------+-----------+

これらは、すべての異なるアカウントです。 私はしかし、それらのいずれかが必要。 私は、ローカルホスト接続を経由してrootアカウントを使用しています。

MariaDB [(none)]> DROP USER 'root'@'127.0.0.1';
Query OK, 0 rows affected (0.33 sec)

MariaDB [(none)]> DROP USER 'root'@'centos64';
Query OK, 0 rows affected (0.02 sec)

MariaDB [(none)]> DROP USER 'root'@'::1';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> select user , host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | localhost |
+------+-----------+

だから私は、4つの異なるアカウントによって何を意味しましたか? 彼らはすべてのrootユーザーアカウント。 いいえ..彼らは根であり、どのようなホスト。 したがって、各アカウント(ユーザー+ホスト)は異なる権限を持つことができます。

だから私たちは違いを示すために次の例を行います。
したがって、この例では、サーバーは、2つのネットワークインタフェースを持っています。 だから私は、違いを示すために、すべてのアクセスポイントに異なるアクセス権を持つ各ユーザーごとに作成されます。 私は、同じパスワードを設定しますが、これらも同様に異なる可能性があります。

MariaDB [(none)]> GRANT SELECT ON *.* TO 'anothermysqldba'@'10.0.2.15' IDENTIFIED BY '<cleartext password>';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE , DROP, RELOAD, SHUTDOWN, PROCESS, FILE, INDEX, ALTER ON *.* TO 'anothermysqldba'@'192.168.0.%' IDENTIFIED BY '<cleartext password>';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'anothermysqldba'@'localhost' IDENTIFIED BY '<cleartext password>' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(なし)]> [ユーザーの選択、ここでユーザ= 'anothermysqldba'のmysql.userからホスト;
+ ----------------- + ------------- +
|ユーザー|ホスト|
+ ----------------- + ------------- +
| anothermysqldba | 10.0.2.15 |
| anothermysqldba | 192.168.0%。|
| anothermysqldba |ローカルホスト|
+ ----------------- + ------------- +

だから、これは何を意味するのでしょうか? MySQLは異なるアクセス許可として、すべてのユーザアクセスポイントのユーザを検証するだけでなく、ホストを使用しているため、ユーザ名が同じであるにもかかわらず。

あなたが開発者の一部を信頼するかもしれませんが、これは多くの場合、彼らはリモートまたはそれらのスクリプトで作業している場合、そのアクセスの一部を制限することをお勧めします。 彼らはあなたを必要としない何かをする必要が、彼らはサーバーに自分自身をSSHおよび他のタスクを実行するにはログインする必要があります。 もちろん、これはあなたのビジネスおよび/またはアプリケーションとの関係や仕事の流れに依存している。

10.0.2.15のホストを使用してユーザーがアクセスのみを選択しています。

# mysql -h 10.0.2.15 -u anothermysqldba -p
MariaDB [(なし)]>を選択し、CURRENT_USER();
+ --------------------------- +
| CURRENT_USER()|
+ --------------------------- +
| anothermysqldba@10.0.2.15 |
+ --------------------------- +
MariaDB [(なし)]>ショーの助成金;
+-------------------------------------------------------------------------------------------------------------------------+
| anothermysqldba@10.0.2.15ための助成|
+-------------------------------------------------------------------------------------------------------------------------+
| GRANTはON * SELECT * TO 'anothermysqldba'@'10.0.2.15'パスワードでIDENTIFIED '* 31360D7EE84BE965C0E759179FC61B6943BCA64F'。|
+-------------------------------------------------------------------------------------------------------------------------+

192.168.0.26のホストを使用すると、ユーザは、より多くのアクセスを有する。 このアカウントは、192.168.0 / 255(%)サブネットの下には何も渡ってアクセスできるように設定されています。

# mysql -h 192.168.0.26 -u anothermysqldba -p
MariaDB [(なし)]>を選択し、CURRENT_USER();
+ ----------------------------- +
| CURRENT_USER()|
+ ----------------------------- +
| anothermysqldba@192.168.0.% |
+ ----------------------------- +
MariaDB [(なし)]>ショーの助成金;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| anothermysqldba@192.168.0.%ための助成|
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、RELOAD、SHUTDOWN、プロセス、ファイル、INDEX、 ALTER ON * 'anothermysqldba'@'192.168.0.%'パスワードでIDENTIFIED '* 31360D7EE84BE965C0E759179FC61B6943BCA64F' TO。|
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

あなたが想定するように、ローカルホストユーザーがフルアクセスアカウントを持っています。

# mysql -u anothermysqldba -p
MariaDB [(なし)]>を選択し、CURRENT_USER();
+ --------------------------- +
| CURRENT_USER()|
+ --------------------------- +
| anothermysqldbaする@ localhostの|
+ --------------------------- +
セット内の1行(0.00秒)

MariaDB [(なし)]>ショーの助成金;
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| anothermysqldbaする@ localhostの助成|
+---------------------------------------------------------------------------------------------------------------------------------------------------+
|に掲示されているすべての権限を付与* * 'anothermysqldba' @するためのパスワード、IDENTIFIED 'localhost'の '* 31360D7EE84BE965C0E759179FC61B6943BCA64Fを' WITH GRANT OPTIONを。|
+---------------------------------------------------------------------------------------------------------------------------------------------------+

今、私はそれが匿名ユーザーを削除することをお勧めする前に言ったように。 使い方mysql_secure_installationインストールのことだけでなく、彼のに役立ちます。

なぜそれが重要ではありません?

# mysql -u anothremysqldba -p
MariaDB [(なし)]>を選択し、CURRENT_USER();
+ ---------------- +
| CURRENT_USER()|
+ ---------------- +
| @localhost |
+ ---------------- +
セット内の1行(0.00

簡単なは、...を超えていると、単純な間違いを避ける。 タイプミスは、これを許可してはならない、データベースへのアクセスを許可された。

それでは、削除して再度テストします。

MariaDB [(none)]> DROP USER ''@'localhost';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> DROP USER ''@'centos64';
Query OK, 0 rows affected (0.00 sec)

#mysqlの-u anothremysqldba -p
パスワードを入力してください:
ERROR 1045(28000):アクセスがパスワードを使用して(利用者のために 'anothremysqldba' @ 'localhostの'を拒否されました:YES

データベースが主にホスト名またはIPアドレス厳格なしワイルドカードとして%を使用して作成されているのであればそれは何を意味するのでしょうか?

これはあなたの部分のセキュリティとビジネスの決定だろう。 個人的にはどちらも私の意見では有効なオプションです。 ワイルドカード(%)が、何も堅牢なアクセスポイントを許可しないが、ファイアウォールに異常が発生した場合、それはまた、ネットワークユーザからリモートへのアクセスをオープンします。 ユーザーごとの厳格なIPアドレスも私の意見ではなく、厳密なですが、それはユーザーによって異なります。 。192.168.0%:例えばさえレプリケーション用に作成されたアカウントを使用して、私はまだ%、すなわちでIPアドレスを使用することを好む。 IPアドレスは、( リモートユーザであっても、静的な変更DBAは頻繁に言われていません変更しないと、それは多くの場合、アクセス障害の上の苦情をDBAに来る人になる。

私はかつて静的IPアドレスにロックされたすべてのユーザーのアクセスが制限され人と働いた。 この人は常にgrant文​​を変更する必要がありました。 人々は、あなたの最後のセキュリティを確保することができながら、簡単かつ効率的に作業できるようにする必要があります。


2014年8月14日木曜日

MySQLの外部キー例:ERROR 1452

Original post - http://anothermysqldba.blogspot.com/2014/08/mysql-foreign-keys-example-error-1452.html

だから私は、フィールドを更新する必要が扱っ今日の状況に偶然出会ったため、ユーザは、関連する外部キー制約をそうすることができませんでした。 

このブログ投稿では、外部キーを示すとどのようにあなたがそうしなければならない場合は、それらを更新するための簡単​​な例であると。 

まず私たちは簡単なテーブルを作成してみましょうと、ランダムなデータを移入。 

CREATE TABLE `table_w_code` ( 
`SOMECode` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`NameofCode` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`SOMECode`) 
) ENGINE=InnoDB ; 


今、私たちは私たちの前のテーブルに関連付けられて外部キーを持つ別のテーブルが必要になります。 

[anothermysqldba]> CREATE TABLE `table_with_fk` ( 
`SOMEID` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`SOMECode` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`Somemorefields` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL, 
PRIMARY KEY (`SOMEID`,`SOMECode`), 
KEY `FK_Patient_Facility` (`SOMECode`), 
CONSTRAINT `FK_CODE` FOREIGN KEY (`SOMECode`) REFERENCES `table_w_code` (`SOMECode`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB; 


だから私たちがしようとすると、後でそれらを更新できるように、私たちは、テーブルにいくつかのランダムなデータを移入してみましょう。 
必要に応じて、乱数についての以前の記事はこちら 

[anothermysqldba]> SET @A = 3; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @B = 15 - @A; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @C = 16; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @D = 25 - @C; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> INSERT INTO table_w_code VALUES 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'ABC' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'DEF' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'GHI' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'JKL' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'MNO' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'PQR' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'STU' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'VWX' ) , 
-> ( SUBSTR(md5(''),FLOOR( @A + (RAND() * @B )) , FLOOR( @C + (RAND() * @D )) ) , 'YZ' ) ; 
Query OK, 9 rows affected (0.05 sec) 
Records: 9 Duplicates: 0 Warnings: 0 

[anothermysqldba]> SELECT * from table_w_code ORDER BY NameofCode; 
+--------------------------+------------+ 
| SOMECode | NameofCode | 
+--------------------------+------------+ 
| 204e9800998ecf8427e | ABC | 
| f00b204e9800998e | DEF | 
| 98f00b204e9800998ecf8427 | GHI | 
| 98f00b204e9800998e | JKL | 
| 1d8cd98f00b204e9800 | MNO | 
| 1d8cd98f00b204e9800998ec | PQR | 
| 0b204e9800998ecf8427e | STU | 
| cd98f00b204e9800998ec | VWX | 
| d98f00b204e9800998ecf842 | YZ | 
+--------------------------+------------+ 
9 rows in set (0.00 sec) 

[anothermysqldba]> SET @D = 2; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET @E = 25 - @D; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> INSERT INTO table_with_fk SELECT SUBSTR(md5(''),FLOOR( @D + (RAND() * @E ))), SOMECode , NameofCode FROM table_w_code; 
Query OK, 9 rows affected (0.08 sec) 
Records: 9 Duplicates: 0 Warnings: 0 

[anothermysqldba]> select * from table_with_fk ORDER BY Somemorefields; 
+---------------------------------+--------------------------+----------------+ 
| SOMEID | SOMECode | Somemorefields | 
+---------------------------------+--------------------------+----------------+ 
| 41d8cd98f00b204e9800998ecf8427e | 204e9800998ecf8427e | ABC | 
| e9800998ecf8427e | f00b204e9800998e | DEF | 
| 98ecf8427e | 98f00b204e9800998ecf8427 | GHI | 
| 00b204e9800998ecf8427e | 98f00b204e9800998e | JKL | 
| 04e9800998ecf8427e | 1d8cd98f00b204e9800 | MNO | 
| 04e9800998ecf8427e | 1d8cd98f00b204e9800998ec | PQR | 
| b204e9800998ecf8427e | 0b204e9800998ecf8427e | STU | 
| b204e9800998ecf8427e | cd98f00b204e9800998ec | VWX | 
| 4e9800998ecf8427e | d98f00b204e9800998ecf842 | YZ | 
+---------------------------------+--------------------------+----------------+ 


OKそれは、この例のいくつかのランダムなデータを生成する方法についてのラウンドがある。 

私たちはtable_with_fkにおけるABC値に関連するデータを更新するために必要な場合に何が起こりますか? 

[anothermysqldba]> SELECT SOMEID , SOMECode , Somemorefields FROM table_with_fk WHERE Somemorefields = 'ABC'; 
+---------------------------------+---------------------+----------------+ 
| SOMEID | SOMECode | Somemorefields | 
+---------------------------------+---------------------+----------------+ 
| 41d8cd98f00b204e9800998ecf8427e | 204e9800998ecf8427e | ABC | 
+---------------------------------+---------------------+----------------+ 

[anothermysqldba]> SELECT SOMECode , NameofCode FROM table_w_code WHERE NameofCode = 'ABC'; 
+---------------------+------------+ 
| SOMECode | NameofCode | 
+---------------------+------------+ 
| 204e9800998ecf8427e | ABC | 
+---------------------+------------+ 

[anothermysqldba]> 
UPDATE table_with_fk SET SOMEID = 'I UPDATED THIS' , SOMECode = 'I UPDATED THIS' WHERE SOMECode = '204e9800998ecf8427e'; 
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails(`anothermysqldba`.`table_with_fk`, CONSTRAINT `FK_CODE` FOREIGN KEY (`SOMECode`) REFERENCES `table_w_code` (`SOMECode`) ON DELETE NO ACTION ON UPDATE NO ACTION) 


それがされている必要がありますようなので、それがブロックされました。 私たちは、すべての後に表定義で「ONがUPDATE ON DELETE NO ACTIONがNO ACTION」がないです。 

すべては、しかし失われることはありません。 「FOREIGN_KEY_CHECKS "変数の簡単な編集は、更新ステートメントを実行することができます。 しかし、それはトランザクション内で、私の意見では、これを実行する方が安全です。 


[anothermysqldba]> START TRANSACTION; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> SET FOREIGN_KEY_CHECKS=0; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> UPDATE table_with_fk SET SOMEID = 'I UPDATED THIS' , SOMECode = 'I UPDATED THIS' WHERE SOMECode = '204e9800998ecf8427e'; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

[anothermysqldba]> SET FOREIGN_KEY_CHECKS=1; 
Query OK, 0 rows affected (0.00 sec) 

[anothermysqldba]> COMMIT; 
Query OK, 0 rows affected (0.07 sec) 


あなたが理由で所定の位置に設定していたあなたの外部キーの値を壊したくなる理由さて、全体的な質問は? それは完全にあなた次第です。 

今日では、何らかの形での値がデータベースに値内の余分な空白が挿入されていたことが起こった。 だから私は、ホワイトスペースを更新および削除、同様の取引をした。 

全体的に...これはちょうどそれが行うことができますを示すことである。