データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

2
InnoDBテーブルからのスペースの削除と再利用
700GBのInnoDBテーブルがあり、それ以上データを書き込みません(読み取りのみ)。保持している古いデータを削除し、そのディスク領域を再利用します(不足しているため)。削除部分は非常に簡単です。auto-incプライマリインデックスがあるので、それを使用してチャンク単位で繰り返し、行を削除できますが、スペースを取り戻すことはできません。私はOPTIMIZE TABLEそう思いますが、700GBのテーブルではそれが永遠にかかるかもしれませんので、見落としている別のオプションはありますか? RolandoMySQLDBAによる編集 テーブルがmydb.mytableであると仮定すると、次のクエリを実行してここに投稿し、テーブルの縮小に必要なディスク容量を判断できるようにしてください。 SELECT FORMAT(dat/POWER(1024,3),2) datsize, FORMAT(ndx/POWER(1024,3),2) ndxsize, FORMAT((dat+ndx)/POWER(1024,3),2) tblsize FROM (SELECT data_length dat,index_length ndx FROM information_schema.tables WHERE table_schema='mydb' AND table_name='mytable') A; 許可されている場合は、テーブル構造も確認する必要があります。 ノーム編集 これはクエリの出力です: datsize ndxsize tblsize 682.51 47.57 730.08 これがテーブル構造です(SHOW CREATE TABLE) `CREATE TABLE `mybigtable` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL, `created_at` datetime …
14 mysql  innodb 

1
nvarchar列のサイズを変更する場合、一意のインデックスを削除する必要がありますか?また、インデックスの再作成時にテーブルがロックされますか?
私たちのデータベースには、次のような多かれ少なかれ大きなテーブルがあります。 CREATE TABLE dbo.production_data ( pd_id BIGINT PRIMARY KEY, serial NVARCHAR(16) NOT NULL UNIQUE, ... ); しかし、今ではシリアルフィールドのサイズが小さくなっているので、32に変更したいと思います。VisualStudioスキーマ比較ツールは、これを行うことを提案します。 DROP INDEX ux_production_data_serial ON dbo.production_data; GO ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL; GO CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC); これは本当に必要ですか?それとも、これを行う超保存的な方法のようなものですか? また、一意のインデックスを再作成すると、テーブルがロックされますか?これは大きな問題になるためです(テーブルには3,000万行あり、インデックスの再作成にはかなり時間がかかると思います)。これは、次のメンテナンスウィンドウが数か月先になるためです。私の選択肢は何ですか?

1
sp_procedure_params_90_rowsetでの過度のコンパイルブロッキング
MSDNでのこの質問の復活:Blocked-process-report:このwaitresourceとは何ですか "OBJECT:32767:124607697:0 [COMPILE]" プロファイラーでこれらのステートメントをキャッチしました。それらはすべて3秒以上の持続時間を持っています。いくつかの10以上。ブロックアクティビティは、MSDNからのリンクと同じです。 呼び出しはすべて3つの部分の命名を使用します。すべては、次のような形式で異なるprocを指定します。 exec [db1].[sys].sp_procedure_params_90_rowset N'proc1', 1, NULL, NULL exec [db2].[sys].sp_procedure_params_90_rowset N'proc2', 1, NULL, NULL exec [db3].[sys].sp_procedure_params_90_rowset N'proc3', 1, NULL, NULL exec [db4].[sys].sp_procedure_params_90_rowset N'proc4', 1, NULL, NULL このレベルのブロックを減らすにはどうすればよいですか? (編集)私は今、同じことを見ています: exec [db1].[sys].sp_primary_keys_rowset N'view1', N'dbo' exec [db2].[sys].sp_primary_keys_rowset N'view1', N'dbo' exec [db3].[sys].sp_primary_keys_rowset N'view1', N'dbo' exec [db4].[sys].sp_primary_keys_rowset N'view1', N'dbo' 体系的な何かが起こっていますが、他に何をすべきかわかりません。呼び出し元はADOを介したVB6です。これらの呼び出しを行うのはADOです。 ブロックされたプロセスレポートの例を以下に示します <blocked-process-report> …

1
避けるべきではありませんか?
一部のSQL Server開発者の間でNOT INは、非常に遅いと広く信じられている信念であり、クエリは、同じ結果を返すが「悪」キーワードを使用しないように書き換える必要があります。(例)。 それに真実はありますか? 例えば、使用してクエリの原因となるSQL Serverのいくつかの既知のバグ(バージョンは?)ありますNOT IN使用している同等のクエリよりも悪い実行計画を持っています LEFT JOIN組み合わせNULL小切手または (SELECT COUNT(*) ...) = 0中WHERE節?

1
「returning」句は挿入されていないソース列を返すことができますか?
これが私の実世界の問題の最小限の例です: create table t(id serial primary key, rnd double precision); もちろん、挿入した列をreturning句で返すことができます: with w as (insert into t(rnd) values(random()) returning *) insert into t(rnd) select random() from w returning *; /* | ID | RND | |----|----------------| | 9 | 0.203221440315 | */ リテラルを返すこともできます: with w as (insert into t(rnd) values(random()) …

2
MySQLでHAVINGがSELECTエイリアスを使用できるのはなぜですか?
私の知る限り、SQLでは、概念的な解釈順序である論理クエリ処理順序は、次のようにFROMで始まります。 から どこ GROUP BY 持っている 選択する ORDER BY このリストに従うと、エイリアスがまだ作成されていないため、WHERE句でSELECTエイリアスを使用できない理由を簡単に確認できます。T-SQL(SQL Server)は厳密にこれに従い、SELECTを渡すまでSELECTエイリアスを使用できません。 しかし、MySQLでは、SELECT句の前に(論理的に)処理する必要がある場合でも、HAVING句でSELECTエイリアスを使用できます。これはどのように可能ですか? 例を挙げると: SELECT YEAR(orderdate), COUNT(*) as Amount FROM Sales.Orders GROUP BY YEAR(orderdate) HAVING Amount>1; ステートメントはT-SQLでは無効です(HAVINGはSELECTエイリアスを参照しているためAmount)... Msg 207, Level 16, State 1, Line 5 Invalid column name 'Amount'. ...しかし、MySQLでは問題なく動作します。 これに基づいて、私は疑問に思っています: MySQLはユーザーを支援するためにSQLルールのショートカットを取っていますか?何らかの事前分析を使用しているのでしょうか? または、MySQLはすべてのRDBMSが従っていたものとは異なる概念解釈順序を使用していますか?

4
AWS RDSデータベースに必要なIOPの数を確認するにはどうすればよいですか?
mysqlデータベースの一部をAWSに移行しています。問題のデータは99%の書き込みで、各行には約1kのvarcharフィールド、datetime、4つのintがあります。 ピーク時に1時間あたり20〜25kのレコードを挿入する必要があります。 現在のデータベースでiostat -hを実行すると、約40 tpsが報告されました。 どのタイプのIOPSが必要かを判断するにはどうすればよいですか?
14 mysql  amazon-rds 

1
AlwaysOn AG、フェールオーバー付きDTC
問題: AlwaysOn可用性グループ(AG)のすべてのサーバーで分散トランザクションコーディネーター(DTC)を実行するにはどうすればよいですか?フェールオーバー/スイッチオーバーイベントでトランザクションを維持する必要はありません。 セットアップ: Windows 2012フェールオーバークラスター(WSFC)に3台のWindows 2008 R2サーバーがあり、すべてSQL 2012を実行しています。2つのサーバーが1つのデータセンターにあり、AlwaysOnフェールオーバークラスター(FCI)の一部であり、 2番目のデータセンター。WSFCはマルチサブネットクラスターです。セットアップのスケッチは次のとおりです。 2つのFCIノードは同じサブネット上にあり、ストレージを共有しているため、2つのFCIノード間で動作するようにDTCをインストールおよび構成できました。いくつかのAGを構成しましたが、正常に機能しています。このスクリーンショットは、FCIにインストールされたDTCを示しています。 このスクリーンショットは、FCIノードのいずれか(アクティブな方)でDTCを構成できることを示しています。 DTCを使用するアプリケーションをこのクラスターに移行し、AGを使用したいと思います。私は、DTCがAGでサポートされていないことを読みました(参照)。2番目のデータセンターの3番目のノードでDTCを構成する方法を見つけることができませんでした。3番目のノードでDTCを構成しようとすると、次のスクリーンショットに示すように、DTCを使用できないようです。 Brent Ozarの無料セットアップチェックリストPDFに、可用性グループのリストがあります。 クラスターのインストール... 29. FCIが関係する場合は、計画セクションの決定に従ってDTCを構成します。 SQL Server 2012のAlwaysOn可用性グループに関するコメントで、Rock Brent氏は次のように述べています。「... ..」 これにより、AGスイッチオーバーでトランザクションが維持されないことを理解している限り、可用性グループでDTCを使用できるように見えます。FCIノードからのトランザクションを維持するためには必要ありません。壊滅的な災害(プライマリデータセンターを失った)の場合に使用するアプリケーションにDTCが必要なだけです。 3番目のノードでDTCを構成するにはどうすればよいですか?または、AGとDTCを必要とするアプリケーションの使用に関して、私は運が悪いのですか? 更新:私が解決した解決策は、ログ配布を使用することです。ただし、フェールオーバーの場合、Node3でDTCを使用できるようにする必要があります。Node1とNode2の間で共有されているDTCのクラスター化されたMSDTC-MSSQLSERVERCLUインスタンスをアンインストールすることで利用可能になることを発見しました。削除したら、Node3でLocalDTCインスタンスをセットアップおよび構成できます。その後、クラスター化されたMSDTC-MSSQLSERVERCLUインスタンスを再インストールできます。この順序でインストールシーケンスを実行すると動作するようです。私は今少しの間そのように走っています、そして私はどんな悪影響も発見していません。これは、AlwaysOn可用性グループを実行する場合にも機能するようです。AGフェールオーバーでは分散トランザクションが保持されないことを理解しています。フェールオーバー後に動作するには新しいトランザクションのみが必要です。しかし、私は持っていません

2
DBCC CHECKDBの修復不可能な破損:インデックス付きビューには、ビュー定義によって生成されなかった行が含まれています
TL; DR:インデックス付きビューに修正不可能な破損があります。詳細は次のとおりです。 ランニング DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS 私のデータベースのいずれかで次のエラーが生成されます: メッセージ8907、レベル16、状態1、行1空間インデックス、XMLインデックス、またはインデックス付きビュー 'ViewName'(オブジェクトID 784109934)には、ビュー定義によって生成されなかった行が含まれています。これは、必ずしもこのデータベース内のデータの整合性の問題を表しているわけではありません。(...) CHECKDBは、テーブル 'ViewName'で0個の割り当てエラーと1個の一貫性エラーを検出しました。 repair_rebuildは最小修復レベル(...)です。 このメッセージは、インデックス付きビュー「ViewName」の具体化されたデータが、基になるクエリが生成するものと同一ではないことを示していることを理解しています。ただし、データを手動で検証しても矛盾は発生しません。 SELECT * FROM ViewName WITH (NOEXPAND) EXCEPT SELECT ... from T1 WITH (FORCESCAN) join T2 on ... SELECT ... from T1 WITH (FORCESCAN) join T2 on ... EXCEPT SELECT * FROM ViewName …

2
どのmax_allowed_pa​​cketが十分な大きさであり、なぜそれを変更する必要があるのですか?
マスタースレーブ設定でMySQL(5.5)を使用し、別のスレーブサーバーを作成しました。 元のスレーブを停止し、データをダンプし、コピーして再インポートしたところ、正常に機能しました。元のスレーブのmaster_log posを書き留め、これらのコマンドを使用して新しいスレーブに設定しました CHANGE MASTER TO MASTER_HOST='<ipaddress>', MASTER_USER='<username>', MASTER_PASSWORD='<password>', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000851', MASTER_LOG_POS=15824150, MASTER_CONNECT_RETRY=10; 新しいスレーブを開始したとき Last_IO_Error:バイナリログからデータを読み取るときに、マスターから致命的なエラー1236が発生しました: 'ログイベントエントリがmax_allowed_pa​​cketを超えました。マスターのmax_allowed_pa​​cketを増やす しかし、元のスレーブを開始したとき、それはうまく追いつき、現在同期しています。 質問: 現在の値は16Mですが、どのくらいの大きさにすればよいのかを知るには (本番サーバーでの試行錯誤は避けたいです)。 元のスレーブがうまく処理されたときに、マスターの値を増やす必要があるのはなぜですか、本当に新しいスレーブに問題があるのでしょうか? 更新 Rolandoがマスター、古いスレーブ、および新しいスレーブで提案したように、max_allowed_pa​​cketを1073741824に増やし、それらを再起動しました(SET GLOBAL max_allowed_packet = 1073741824;何らかの理由でとらえられなかったようです) 今、最後のIOエラーは以前と同じですが、今では Last_SQL_Error:リレーログ読み取りエラー:リレーログイベントエントリを解析できませんでした。考えられる理由は次のとおりです。マスターのバイナリログが破損している(バイナリログで「mysqlbinlog」を実行すると確認できます)、スレーブのリレーログが破損しています(リレーログで「mysqlbinlog」を実行すると確認できます)、ネットワークの問題、またはマスターまたはスレーブのMySQLコードのバグ。マスターのバイナリログまたはスレーブのリレーログを確認したい場合、このスレーブで「SHOW SLAVE STATUS」を発行することにより、それらの名前を知ることができます。 マスターのファイルでmysqlbinlogを実行すると、コマンドを使って何年も前にスクロールします-ファイルは722Mです-スレーブリレーログでそれを実行すると、 エラー:Log_event :: read_log_event()のエラー: '健全性チェックに失敗しました'、data_len:38916267、event_type:69 エラー:オフセット253のエントリを読み取ることができませんでした:ログ形式のエラーまたは読み取りエラー。 変数を確認しましたが、変更は機能しました mysql>変数LIKE '%max_allowed_pa​​cket%'を表示します。 新しいスレーブ上でmax_allowed_packetAND slave_max_allowed_packetが示され、マスター上ではmax_allowed_packet だから私はマスターでバージョンチェックをしました: mysql> show variables LIKE '%version%'; +-------------------------+--------------------------------------+ | …

1
前の行までの合計
ウィンドウ関数に関するヘルプが必要です。ウィンドウ内の合計とウィンドウ内の現在の合計を計算できることを知っています。しかし、前の現在の合計、つまり現在の行を含まない現在の合計を計算することはできますか? ROWまたはRANGE引数を使用する必要があると思います。私はCURRENT ROWオプションがあることを知っていますが、私CURRENT ROW - 1は無効な構文である必要があります。ROWとのRANGE議論に関する私の知識は限られているので、どんな助けもありがたいことに受けます。 私は、この問題に対する多くのソリューションがあることを知っているが、私は理解しているよROW、RANGE引数を、私はこの問題は、これらにひび割れすることが可能と仮定します。以前の実行中の合計を計算する1つの可能な方法を含めましたが、もっと良い方法があるのではないかと思います。 USE AdventureWorks2012 SELECT s.SalesOrderID , s.SalesOrderDetailID , s.OrderQty , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID) AS RunningTotal , SUM(s.OrderQty) OVER (PARTITION BY SalesOrderID ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal -- Sudo code - I know this does not work --, SUM(s.OrderQty) OVER (PARTITION …

8
SQLダンプからデータベースを復元中にエラーが発生しました
私はMySQLが非常に新しく、Windowsで実行しています。MySQLのダンプファイルからデータベースを復元しようとしていますが、次のエラーが表示されます。 $ >mysql -u root -p -h localhost -D database -o < dump.sql ERROR: ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled and mysql is run in non-interactive mode. Set --binary-mode to 1 if ASCII '\0' is expected. Query: 'SQLite format 3'. …

1
SOS_SCHEDULER_YIELD待機のトラブルシューティング
企業のERP(Dynamics AX 2012)を実行すると、実稼働環境が開発システムよりもはるかに遅いように見えました。 開発環境と実稼働環境の両方で同じアクティビティを実行し、トレースを実行した後、開発環境と比較して実稼働環境でのSQLクエリの実行が非常に遅いことを確認しました(平均で10〜50倍遅い)。 最初はこれをロードに起因すると考え、営業時間外に本番環境で同じアクティビティを再実行し、トレースで同じ結果を見つけました。 SQL Serverで待機統計をクリアし、しばらくの間、サーバーを通常の運用負荷で実行させた後、次のクエリを実行しました。 WITH [Waits] AS (SELECT [wait_type], [wait_time_ms] / 1000.0 AS [WaitS], ([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS], [signal_wait_time_ms] / 1000.0 AS [SignalS], [waiting_tasks_count] AS [WaitCount], 100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage], ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum] FROM sys.dm_os_wait_stats …

1
postgresでのCOPY FROM STDINの使用
私はPostgresを使い始めたばかりで、その機能を理解するためにサンプルdbを作成しようとしています。周りを見て、pgfoundry.orgでいくつかのスクリプトを見つけました。以前はOracleとMS-SQLの両方を使用していたため、コマンドは理解できますが、実行中のすべてのスクリプトは「COPY FROM」命令に到達するとエラーを返します。より正確には、指定されたテーブルに挿入される最初の要素でエラーがスローされます。 クエリとpgScriptの両方としてスクリプトを実行しようとしましたが、どちらの方法でもCOPY FROMの後の最初の行でエラーが発生します。 pgAdminIIIを使用していて、StackBuilderを使用してPostgreSQL 9.2.4.1をDBドライバーとしてインストールしました。このコマンドの実行を妨げている基本的な構成が欠落している場合がありますか、それが機能するかを理解していませんか? 編集: エラーは次のとおりです。 ERROR: syntax error at or near "7" LINE 5600: 7 4 13 37 2012-03-10 16:41:43.797787 2012-03-10 16:41:43.797... ^ ********** Error ********** ERROR: syntax error at or near "7" SQL status: 42601 Char: 140891` テキストは次のとおりです。 COPY action_abilitations (id, group_action_id, partecipation_role_id, group_id, created_at, updated_at) …

2
重複キーでは何もしません
PtokaX APIでLuaSQLを使用して、次の表に挿入しています。 CREATE TABLE `requests` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `ctg` VARCHAR(15) NOT NULL, `msg` VARCHAR(250) NOT NULL, `nick` VARCHAR(32) NOT NULL, `filled` ENUM('Y','N') NOT NULL DEFAULT 'N', `dated` DATETIME NOT NULL, `filldate` DATETIME NULL DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE INDEX `nick_msg` (`nick`, `msg`), UNIQUE INDEX `ctg_msg` …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.