{"id":1379,"date":"2022-04-22T18:20:59","date_gmt":"2022-04-22T21:20:59","guid":{"rendered":"https:\/\/gladiston.net.br\/?page_id=1379"},"modified":"2022-09-14T10:57:56","modified_gmt":"2022-09-14T13:57:56","slug":"depurando-comandos-sql-no-firebirdsql","status":"publish","type":"page","link":"https:\/\/gladiston.net.br\/en\/banco-de-dados\/depurando-comandos-sql-no-firebirdsql\/","title":{"rendered":"Debugging SQL Commands in FirebirdSQL"},"content":{"rendered":"\n<p class=\"has-drop-cap\">Depurar comandos SQL no Firebird \u00e9 necess\u00e1rio para v\u00e1rios propositos, o maior deles talvez seja analisar a execu\u00e7\u00e3o das queries em tempo de desenvolvimento, por exemplo, queries parametrizadas se analisadas a partir do lado cliente n\u00e3o possuem valores, isto \u00e9, seus parametros n\u00e3o s\u00e3o revelados, mas do lado do servidor podemos verificar todas as queries e os valores que as mesmas receberam. <\/p>\n\n\n\n<p>A ferramenta de depura\u00e7\u00e3o tamb\u00e9m pode ser usada  para criar arquivos de log quer mais tarde ser\u00e3o analisadas por ferrametas de terceiros, funciona assim, voc\u00ea determina um per\u00edodo de testes, por exemplo, 3 dias e nesse per\u00edodo deixa o trace ligado, depois disso voc\u00ea submete o arquivo de log a uma ferramenta de analise que apontar\u00e1 falhas ocorridas ou pontos de aten\u00e7\u00e3o como por exemplo excesso de espera para a execu\u00e7\u00e3o de uma querie.<\/p>\n\n\n\n<p>Primeiro, precisamos criar um arquivo com a defini\u00e7\u00e3o de depura\u00e7\u00e3o que desejamos, para termos apenas o b\u00e1sico, vamos criar o arquivo fbtrace.conf com o seguinte conte\u00fado:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:false,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;properties&quot;,&quot;mime&quot;:&quot;text\/x-properties&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:true,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;Properties files&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;properties&quot;}\">database mydatabase.fdb\n{\n  # Do we trace database events or not\n  enabled = true\n  # Operations log file name. For use by system audit trace only\n  #log_filename = name\n  # Maximum size of log file (megabytes). Used by system audit trace for \n  # log's rotation : when current log file reached this limit it is renamed\n  # using current date and time and new log file is created. Value of zero \n  # means that the log file size is unlimited and rotation will never happen.\n  max_log_size = 0\n  # SQL query filters. \n  #\n  # Only SQL statements falling under given regular expression are reported \n  # in the log.\n  include_filter=%(SELECT|INSERT|UPDATE|DELETE)%\n  # SQL statements falling under given regular expression are NOT reported \n  # in the log.\n  #exclude_filter \n  # Put attach\/detach log records \n  log_connections = true\n  # Trace only given connection id. If zero - trace all connections \n  #connection_id = 0\n  # Put transaction start\/end records \n  log_transactions = true\n  # Put sql statement prepare records \n  log_statement_prepare = true\n  # Put sql statement free records \n  log_statement_free = true\n  # Put sql statement execution start records \n  log_statement_start = true\n  # Put sql statement execution finish\\fetch to eof records \n  log_statement_finish = true\n  # Put record when stored procedure is start execution \n  log_procedure_start = true\n  # Put record when stored procedure is finish execution \n  log_procedure_finish = true\n  # Put record when stored function is start execution \n  log_function_start = true\n  # Put record when stored function is finish execution \n  log_function_finish = true\n  # Put trigger execute records \n  log_trigger_start = true\n  # Put trigger execute records \n  log_trigger_finish = true\n  # Put context variable change records (RDB$SET_CONTEXT)\n  #log_context = false\n  # Put errors happened\n  log_errors = true\n  # Put warnings\n  log_warnings = true\n  # Filters for errors and warnings GDS codes.\n  # Comma separated list of GDS codes values and\\or names.\n  # For example: deadlock, req_sync, 335544321\n  # Include filter. If empty, trace all errors\\warnings events.\n  # Else trace event if any code from list is found in status-vector.\n  #include_gds_codes\n  # Exclude filter. If empty, trace all errors\\warnings events.\n  # Else trace event if no code from list is found in status-vector.\n  #exclude_gds_codes\n  # Put trace session init and finish messages\n  #log_initfini = true\n  # Sweep activity\n  log_sweep = true\n  # Print access path (plan) with sql statement\n  print_plan = true\n  # Use legacy (false) or explained (true) plan format\n  explain_plan = true\n  # Print detailed performance info when applicable\n  print_perf = true\n  # Put blr requests compile\/execute records \n  #log_blr_requests = false\n  # Print blr requests or not\n  #print_blr = false\n  # Put dyn requests execute records \n  #log_dyn_requests = false\n  # Print dyn requests or not\n  #print_dyn = false\n  # Put xxx_finish record only if its timing exceeds this number of milliseconds\n  time_threshold =0 # default 100\n  # Maximum length of SQL string logged \n  # Beware when adjusting max_xxx parameters! Maximum length of log record\n  # for one event should never exceed 64K.\n  max_sql_length = 4096 # default 300\n  # Maximum length of blr request logged \n  #max_blr_length = 500\n  # Maximum length of dyn request logged \n  #max_dyn_length = 500\n  # Maximum length of individual string argument we log \n  max_arg_length = 4096 # default 80\n  # Maximum number of query arguments to put in log \n  max_arg_count = 0 # default 30\n}<\/pre><\/div>\n\n\n\n<p>O arquivo &#8220;<strong>C:\\temp\\fbtrace.conf&#8221;<\/strong> que v\u00ea acima foi baseado no modelo &#8220;C:\\Program Files\\Firebird\\Firebird_4_0\\fbtrace.conf&#8221;. Onde v\u00ea <strong>mydatabase.fdb<\/strong> \u00e9 na realidade o nome do banco de dados que deseja analisar ou depurar, se voc\u00ea n\u00e3o especificar um nome, o trace ser\u00e1 feito em todos eles. Voc\u00ea tamb\u00e9m pode tamb\u00e9m especificar o nome do database por uma regra baseada em regex como:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>database = (%[\\\\\/](e[[:DIGIT:]]{{2}}).fdb)<\/li><\/ul>\n\n\n\n<p>Para prosseguir precisaremos que tenha em m\u00e3os os parametros:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Nome do host ou IP<\/li><li>Porta<\/li><li>Usu\u00e1rio e Senha<\/li><li>Arquivo de configura\u00e7\u00e3o do trace<\/li><li>Local de instala\u00e7\u00e3o do Firebird, se for Windows.<\/li><\/ol>\n\n\n\n<p>Se n\u00e3o souber qualquer um deles, ser\u00e1 imposs\u00edvel prosseguir.<\/p>\n\n\n\n<p>O passo seguinte requer que abramos o terminal do Windows com permiss\u00f5es de admistrador e executar:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:false,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:true,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;Shell&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;shell&quot;}\">set path=%path%;&quot;C:\\Program Files\\Firebird\\Firebird_4_0&quot;<\/pre><\/div>\n\n\n\n<p>O comando acima \u00e9 para que os utilit\u00e1rios que acompanham o FirebirdSQL sejam visiveis ao terminal. Voc\u00ea n\u00e3o precisar\u00e1 dele, mas se o fizer, poder\u00e1 economizar na digita\u00e7\u00e3o do caminho completo para o nome do utilit\u00e1rio. Depois disso, execute finalmente o comando que permitir\u00e1 a depura\u00e7\u00e3o dos comandos SQL que o FirebirdSQL processar\u00e1:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:false,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:true,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;Shell&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;shell&quot;}\">&quot;C:\\Program Files\\Firebird\\Firebird_4_0\\fbtracemgr.exe&quot; -se 127.0.0.1\/3050:service_mgr -user SYSDBA -password masterkey -start -conf &quot;C:\\temp\\fbtrace.conf&quot;<\/pre><\/div>\n\n\n\n<p>Onde:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>127.0.0.1<\/strong> \u00e9 o nome do host, neste caso usamos IP.<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>3050 <\/strong>\u00e9 a porta do servi\u00e7o usado pelo FirebirdSQL<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>SYSDBA <\/strong>\u00e9 o nome do usu\u00e1rio<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>masterkey <\/strong>\u00e9 a senha do usu\u00e1rio SYSDBA<\/li><\/ul>\n\n\n\n<ul class=\"wp-block-list\"><li>&#8220;<strong>C:\\temp\\fbtrace.conf&#8221;<\/strong> \u00e9 o nome do arquivo com as defini\u00e7\u00f5es de trace.<\/li><\/ul>\n\n\n\n<p>Em seguida, todas as execu\u00e7\u00f5es que passarem pelo servidor e que sejam comp\u00e1tiveis com as defini\u00e7\u00f5es contidas em <strong>fbtrace.conf<\/strong> ser\u00e3o exibidas no terminal. Caso n\u00e3o queira ver as informa\u00e7\u00f5es no terminal, mas em outro arquivo, ent\u00e3o use o redirecionador stdout:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:false,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;shell&quot;,&quot;mime&quot;:&quot;text\/x-sh&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:true,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;Shell&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;shell&quot;}\">&quot;C:\\Program Files\\Firebird\\Firebird_4_0\\fbtracemgr.exe&quot; -se 127.0.0.1\/3050:service_mgr -user SYSDBA -password masterkey -start -conf &quot;C:\\temp\\fbtrace.conf&quot; &lt;strong&gt;&amp;gt;c:\\temp\\fbtrace.log&lt;\/strong&gt;<\/pre><\/div>\n\n\n\n<p>No ambiente Linux, o processo \u00e9 basicamente o mesmo, o que muda s\u00e3o apenas os nomes dos diret\u00f3rios onde os utilit\u00e1rios s\u00e3o instalados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Estude o arquivo modelo para saber como deixar o arquivo fbtrace.conf adequado \u00e0s suas necessidades. \u00c0s vezes voc\u00ea vai querer modificar ele apenas para que todas as execu\u00e7\u00f5es no servidor sejam vistas por voc\u00ea, mas outro momento talvez prefira gerar um arquivo de log que mais tarde ser\u00e1 submetido a uma ferramenta que far\u00e1 a analise e apontar\u00e1 pontos de aten\u00e7\u00e3o ou falhas, este \u00e9 o exemplo da ferramenta online da <a href=\"https:\/\/cc.ib-aid.com\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"IBSurgeon\">IBSurgeon<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Depurar comandos SQL no Firebird \u00e9 necess\u00e1rio para v\u00e1rios propositos, o maior deles talvez seja analisar a execu\u00e7\u00e3o das queries em tempo de desenvolvimento, por exemplo, queries parametrizadas se analisadas a partir do lado cliente n\u00e3o possuem valores, isto \u00e9, seus parametros n\u00e3o s\u00e3o revelados, mas do lado do servidor podemos verificar todas as queries [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":1109,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"templates\/template-full-width.php","meta":{"footnotes":""},"class_list":["post-1379","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1379","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/comments?post=1379"}],"version-history":[{"count":13,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1379\/revisions"}],"predecessor-version":[{"id":2029,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1379\/revisions\/2029"}],"up":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1109"}],"wp:attachment":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/media?parent=1379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}